【发布时间】:2017-10-18 06:07:11
【问题描述】:
我正在尝试在 TensorFlow 中实现 dropout,以实现一个简单的 3 层神经网络进行分类,但遇到了问题。更具体地说,我在训练与测试时尝试应用不同的 dropout 参数 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 用于训练和测试运行。 Minibatching 仅在训练数据集上完成,但我没有在其他任何地方设置 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 值传递给训练和测试的最佳方法是什么?非常感谢您的建议。
【问题讨论】:
标签: python tensorflow