【发布时间】:2016-03-04 01:01:45
【问题描述】:
我已经使用 Google 的 TensorFlow 库构建了一个 MLP。网络正在运行,但不知何故它拒绝正确学习。无论输入实际是什么,它总是收敛到接近 1.0 的输出。
完整代码可见here。
有什么想法吗?
输入输出(batch size 4)如下:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]] # XOR input
output_data = [[0.], [1.], [1.], [0.]] # XOR output
n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input")
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output")
隐藏层配置:
# hidden layer's bias neuron
b_hidden = tf.Variable(0.1, name="hidden_bias")
# hidden layer's weight matrix initialized with a uniform distribution
W_hidden = tf.Variable(tf.random_uniform([2, hidden_nodes], -1.0, 1.0), name="hidden_weights")
# calc hidden layer's activation
hidden = tf.sigmoid(tf.matmul(n_input, W_hidden) + b_hidden)
输出层配置:
W_output = tf.Variable(tf.random_uniform([hidden_nodes, 1], -1.0, 1.0), name="output_weights") # output layer's weight matrix
output = tf.sigmoid(tf.matmul(hidden, W_output)) # calc output layer's activation
我的学习方法如下所示:
loss = tf.reduce_mean(cross_entropy) # mean the cross_entropy
optimizer = tf.train.GradientDescentOptimizer(0.01) # take a gradient descent for optimizing
train = optimizer.minimize(loss) # let the optimizer train
我为 cross entropy 尝试了两种设置:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
和
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
其中n_output 是output_data 中描述的原始输出,output 是我的网络预测/计算的值。
for 循环内的训练(n 个 epoch)是这样的:
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
feed_dict={n_input: input_data, n_output: output_data})
我将结果保存到 cvalues 用于调试打印 loss、W_hidden、...
无论我尝试过什么,当我测试我的网络并尝试验证输出时,它总是会产生如下内容:
(...)
step: 2000
loss: 0.0137040186673
b_hidden: 1.3272010088
W_hidden: [[ 0.23195425 0.53248233 -0.21644847 -0.54775208 0.52298909]
[ 0.73933059 0.51440752 -0.08397482 -0.62724304 -0.53347367]]
W_output: [[ 1.65939867]
[ 0.78912479]
[ 1.4831928 ]
[ 1.28612828]
[ 1.12486529]]
(--- finished with 2000 epochs ---)
(Test input for validation:)
input: [0.0, 0.0] | output: [[ 0.99339396]]
input: [0.0, 1.0] | output: [[ 0.99289012]]
input: [1.0, 0.0] | output: [[ 0.99346077]]
input: [1.0, 1.0] | output: [[ 0.99261558]]
所以它没有正确学习,但无论输入哪种输入,它总是收敛到接近 1.0。
【问题讨论】:
-
您的
b_hidden变量是标量 - 这是故意的吗?我认为您应该将其创建为b_hidden = tf.Variable(tf.constant(0.1, shape=[hidden_nodes]), name="hidden_bias"),这可能会有所帮助。要尝试的另一件事是将b_output偏置项添加到您的输出层。 -
感谢您的评论。事实上,我只是没有注意到
b_hidden也应该是一个向量而不是一个标量......但是,对于每个输入,无论有没有隐藏的偏差,网络仍然收敛到接近 1.0,作为标量或向量和或者没有输出层的偏差。我真的认为我在学习方法或网络架构上遗漏了一些错误:/
标签: python machine-learning neural-network tensorflow supervised-learning