我在MNIST数据集上训练了一个线性分类器,准确率达到了92%。然后我固定了权重,并优化了输入图像,使得8的softmax概率最大化。但softmax损失值始终无法降到2.302以下(-log(1/10)),这意味着我的训练是无效的。我做错了什么?
训练权重的代码:
在固定权重下训练图像的代码:
#将训练好的权重复制到W,B中,并将它们作为占位符传递给新模型
W=sess.run(w)
B=sess.run(b)
X=tf.Variable(tf.random_normal([1, 784], stddev=0.01))
Y=tf.constant([0, 0, 0, 0, 0, 0, 0, 0, 1, 0])
w=tf.placeholder("float")
b=tf.placeholder("float")
o = tf.nn.sigmoid(tf.matmul(X, w)+b)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=o, labels=Y))
train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
predict_op = tf.argmax(o, 1)
sess.run(tf.global_variables_initializer())
for i in range(1000):
sess.run(train_op, feed_dict={w:W, b:B})
if i%50==0:
sess.run(cost, feed_dict={w:W, b:B})
print(i, sess.run(predict_op, feed_dict={w:W, b:B}))
回答:
你不应该在网络输出上调用tf.sigmoid
。softmax_cross_entropy_with_logits
假设你的输入是logits,即不受约束的实数。使用
o = tf.matmul(X, w)+b
可以将准确率提高到92.8%。
有了这个修改,你的第二次训练就会成功。成本会降到0,尽管生成的图像并不令人满意。