繁体   English   中英

TensorFlow辍学:如何将不同的值应用于训练与测试?

[英]TensorFlow dropout: how to apply different values to Train vs Test?

我正在尝试在TensorFlow中实现一个简单的3层神经网络进行分类的辍学,并遇到了问题。 更具体地说, 当我训练与测试时我尝试应用不同的辍学参数pkeep值。

我采用的方法如下:

1)def create_placeholders(n_x,n_y):

X = tf.placeholder("float", [n_x, None])
Y = tf.placeholder("float", [n_y, None])   
pkeep = tf.placeholder(tf.float32)
return X,Y,pkeep

2)在函数forward_propagation(X,parameters,pkeep)中,我执行以下操作:

Z1 = tf.add(tf.matmul(W1, X), b1)
A1 = tf.nn.relu(Z1)
A1d = tf.nn.dropout(A1, pkeep)
Z2 = tf.add(tf.matmul(W2, A1d),b2)
A2 = tf.nn.relu(Z2)
A2d = tf.nn.dropout(A2, pkeep)
Z3 = tf.add(tf.matmul(W3, A2d),b3)

return Z3

3)稍后在调用tensorflow会话时(为了清楚起见,在代码行之间被省略):

X, Y, pkeep = create_placeholders(n_x, n_y)

Z3 = forward_propagation(X, parameters, pkeep)

sess.run([optimizer,cost], feed_dict={X:minibatch_X, Y:minibatch_Y, pkeep: 0.75})

以上将运行而不会给出任何错误。 但是,我认为以上将训练和测试运行的pkeep值都设置为0.75。 迷你批处理仅在火车数据集上完成,但我没有在其他任何地方设置pkeep值。

我想将pkeep = 0.75设置为训练,将pkeep = 1.0为测试。

4)当我做这样的事情时,它的确给出了错误:

x_train_eval = Z3.eval(feed_dict={X: X_train, Y: Y_train,  pkeep: 0.75})

x_test_eval = Z3.eval(feed_dict={X: X_test, Y: Y_test,  pkeep: 1.0})

我收到的错误消息是:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_2' with dtype float
     [[Node: Placeholder_2 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

传递不同的pkeep值进行培训和测试的最佳方法是什么? 您的建议将不胜感激。

假设您有一些定义为test_op测试操作(例如,一些评估输入数据和标签准确性的操作),则可以执行以下操作:

for i in range(num_iters):
    # Run your training process.
    _, loss = sess.run([optimizer, cost],
                       feed_dict={X:minibatch_X, Y:minibatch_Y, pkeep: 0.75})
# Test the model after training
test_accuracy = sess.run(test_op,
                         feed_dict={X:test_X, Y:test_Y, pkeep: 1.0})

基本上,您在训练模型时不会测试模型,因此可以在准备进行测试时调用test_op ,将其提供给pkeep等不同的超pkeep 在对保留的数据集进行训练期间定期验证模型的方法也是如此:经常在保留的数据集上运行评估op,传递与训练过程中使用的参数不同的超参数,然后您可以保存配置或提前停止根据您的验证准确性。

您的test_op可能返回类似于分类器的预测准确性的信息:

correct = tf.equal(tf.argmax(y, 1), tf.argmax(predict, 1))
test_op = tf.reduce_mean(tf.cast(correct, tf.float32))

其中y是您的目标标签, predict是您的预测操作的名称。

在神经网络中,您可以向前传播以计算logit(每个标签的概率),并将其与实际值进行比较以获取错误。

训练包括通过向后传播,即找到相对于每个重量的误差导数,然后从重量值中减去该值,来使误差最小化。

当您分开训练和评估模型所需的操作时,应用不同的辍学参数会更加容易。

培训只是将损失降到最低:

def loss(logits, labels):
    '''
    Calculate cross entropy loss
    '''
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
        labels=labels, logits=logits)
    return tf.reduce_mean(cross_entropy, name='loss_op')


def train(loss, learning_rate):
    '''
    Train model by optimizing gradient descent
    '''
    optimizer = tf.train.AdamOptimizer(learning_rate)
    train_op = optimizer.minimize(loss, name='train_op')
    return train_op

评估只是计算准确性:

def accuracy(logits, labels):
    '''
    Calculate accuracy of logits at predicting labels
    '''
    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1))
    accuracy_op = tf.reduce_mean(tf.cast(correct_prediction, tf.float32),
                                 name='accuracy_op')
    return accuracy_op

然后在Tensorflow会话中,在生成占位符并将必要的操作添加到Graph等之后,只需将不同的keep_prob_pl值输入到run方法中即可:

# Train model
sess.run(train_op, feed_dict={x_pl: x_train, y_train: y, keep_prob_pl: 0.75}})

# Evaluate test data
batch_size = 100
epoch = data.num_examples // batch_size
acc = 0.0
for i in range(epoch):
    batch_x, batch_y = data.next_batch(batch_size)
    feed_dict = {x_pl: batch_x, y_pl: batch_y, keep_prob_pl: 1}
    acc += sess.run(accuracy_op, feed_dict=feed_dict)

print(("Epoch Accuracy: {:.4f}").format(acc / epoch))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM