Проверка и тест с TensorFlow

Я создал нейронную сеть с одним скрытым слоем с пирамидальной архитектурой с использованием TensorFlow. Вот код:

num_classes = 10
image_size = 28

#Read the data
train_dataset, train_labels, valid_dataset, valid_labels, test_dataset, test_labels = OpenDataSets("...")
#Create and convert what is needed.
tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size))
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
tf_valid_dataset = tf.constant(valid_dataset)
tf_test_dataset = tf.constant(test_dataset)

#Then I create the NN.
Wh = tf.Variable(tf.truncated_normal([image_size * image_size, image_size * image_size / 2]))
bh = tf.Variable(tf.truncated_normal([image_size * image_size / 2]))
hidden = tf.nn.relu(tf.matmul(tf_train_dataset, Wh) + bh)

Wout = tf.Variable(tf.truncated_normal([image_size * image_size / 2, num_labels]))
bout = tf.Variable(tf.truncated_normal([num_labels]))
logits = tf.nn.relu(tf.matmul(hidden, Wout) + bout)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
train_prediction = tf.nn.softmax(logits)

и теперь я тренирую свой NN:

with tf.Session(graph=graph) as session:
    tf.initialize_all_variables().run()
    for step in range(1000):
        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)
        batch_data = train_dataset[offset:(offset + batch_size), :]
        batch_labels = train_labels[offset:(offset + batch_size), :]
        feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}
        _, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict)

теперь я хотел бы проверить и проверить свой NN после тренировки. Но я не знаю, как создать новый feed_dict и использовать сеанс.запустите для проверки / тестирования.

Спасибо за вашу помощь!

1 ответов


сначала вам нужно будет создать соответствующие функции проверки / тестирования тензора. Для однослойного MPL он включает вложенное умножение с весами и добавление смещений (а также Relu, поскольку они есть в вашей исходной модели). Определите их прямо под вашими прогнозами поезда

valid_prediction = tf.nn.softmax(
                      tf.nn.relu(tf.matmul(
                         tf.nn.relu(tf.matmul(tf_valid_dataset, Wh) + bh)), Wout) + bout)))
test_prediction = tf.nn.softmax(
                      tf.nn.relu(tf.matmul(
                         tf.nn.relu(tf.matmul(tf_test_dataset, Wh) + bh)), Wout) + bout)))

эти выражения на самом деле совершенно идентичны logit переменная, определенная в вашем коде, только с помощью tf_valid_dataset и tf_test_dataset соответственно. Для упрощения можно создать промежуточные переменные их.

затем вам придется создать некоторую функцию проверки / тестирования для проверки точности. Проще всего было бы проверить наиболее вероятный предсказанный класс (ошибка классификации примерно). Определите это вне графика/сеанса.

def accuracy(predictions, labels):
      pred_class = np.argmax(predictions, 1)
      true_class = np.argmax(labels, 1)
      return (100.0 * np.sum(pred_class == true_class) / predictions.shape[0])

после этого вы можете просто передать эту функцию точности внутри того же сеанса/feed_dict для вычисления оценки проверки/теста.

print 'Validation accuracy: %.1f%%' % accuracy(valid_prediction.eval(), valid_labels)
print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels)