【问题标题】:Validation and Test with TensorFlow使用 TensorFlow 进行验证和测试
【发布时间】:2016-05-25 01:11:04
【问题描述】:

我使用 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)

现在我训练我的神经网络:

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)

现在我想在训练后验证和测试我的神经网络。但我不知道如何创建新的 feed_dict 并使用 session.run 来验证/测试。

感谢您的帮助!

【问题讨论】:

    标签: python neural-network tensorflow


    【解决方案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_datasettf_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])
    

    之后,您可以简单地在同一个 session/feed_dict 中传递这个准确度函数来计算验证/测试分数。

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

    【讨论】:

    • 非常感谢您的回答。因此,如果我理解正确,我必须创建另外两个 NN,它们实际上是指向我原来的 NN 的指针,因为它们使用完全相同的可训练权重。我说的对吗?
    • 我希望将我原来的 NN 与不同的输入一起使用。
    • 不不,您将使用完全相同的网络进行验证 - 只需在同一网络中定义两个函数并在同一会话中调用 accuracy()
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多