我想使用 tensorflow 来实现https://www.coursera.org/learn/machine-learning中教授的MLP模型。这是实施。
# one hidden layer MLP
x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])
W_h1 = tf.Variable(tf.random_normal([784, 512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1))
W_out = tf.Variable(tf.random_normal([512, 10]))
y_ = tf.matmul(h1, W_out)
# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# train
with tf.Session() as s:
s.run(tf.initialize_all_variables())
for i in range(10000):
batch_x, batch_y = mnist.train.next_batch(100)
s.run(train_step, feed_dict={x: batch_x, y: batch_y})
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
print('step {0}, training accuracy {1}'.format(i, train_accuracy))
然而,它不起作用。我认为图层的定义是正确的,但问题出在 cross_entropy 中。如果我使用第一个,那个被注释掉,模型快速收敛;但如果我使用第二个,我认为/希望是前一个方程的翻译,模型将不会收敛。
如果您想查看成本等式,可以在here找到。
我使用 numpy 和 scipy 实现了相同的MLP模型,并且它可以工作。
在tensorflow代码中,我在训练循环中添加了一个 print 行,我发现y_
中的所有元素都是 nan ..我认为它是由算术溢出或类似的东西造成的。
答案 0 :(得分:3)
可能是0 * log(0)问题。
更换
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
与
cross_entropy = tf.reduce_sum(- y * tf.log(tf.clip_by_value(y_, 1e-10, 1.0)) - (1 - y) * tf.log(tf.clip_by_value(1 - y_, 1e-10, 1.0)), 1)
答案 1 :(得分:0)
我认为问题是nn.sigmoid_cross_entropy_with_logits需要非规范化结果,而用cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
取代它的函数
期望y_在0和1之间被标准化(通过sigmoid)
尝试替换
y_ = tf.matmul(h1, W_out)
与
y_ = tf.nn.sigmoid(tf.matmul(h1, W_out))