Tensorflow: 在MNIST数据集上训练线性分类器的权重可视化

我在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.sigmoidsoftmax_cross_entropy_with_logits假设你的输入是logits,即不受约束的实数。使用

o = tf.matmul(X, w)+b

可以将准确率提高到92.8%。

有了这个修改,你的第二次训练就会成功。成本会降到0,尽管生成的图像并不令人满意。

enter image description here

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注