为什么我的神经网络的准确性很差?

数据挖掘 机器学习 神经网络 深度学习 张量流 美国有线电视新闻网
2022-02-28 06:41:03
EPOCH=40
batch_size=50
mnist=input_data.read_data_sets("MNIST_data", one_hot=True)

tf.reset_default_graph()

input_X = tf.placeholder(tf.float32, shape=[None, 784])
input_y = tf.placeholder(tf.int64, shape=[None, 10])

input_layer=tf.layers.dense(input_X, 784, activation=tf.nn.sigmoid)
hidden1=tf.layers.dense(input_layer, 256, activation=tf.nn.sigmoid)
hidden2=tf.layers.dense(hidden1, 256, activation=tf.nn.sigmoid)
output=tf.layers.dense(hidden2, units=10)
output=tf.nn.softmax(output)


entropy=tf.nn.softmax_cross_entropy_with_logits(labels=input_y, logits=output)
loss=tf.reduce_mean(entropy)
step=tf.train.GradientDescentOptimizer(0.01).minimize(loss)

#correct=tf.nn.in_top_k(tf.argmax(output, y, 1) rank error

correct=tf.equal(tf.argmax(output, 1), tf.argmax(input_y, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))


sess=tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

for epoch in range(EPOCH):
  for i in range(1000):
    X, y=mnist.train.next_batch(batch_size)
    sess.run(loss, feed_dict={input_X:X, input_y:y})
  acc_train=accuracy.eval(feed_dict={input_X:X, input_y:y})
  acc_val=accuracy.eval(feed_dict={input_X: mnist.validation.images
                                  , input_y: mnist.validation.labels})
  print(epoch, "Train accuracy: ", acc_train, "\n Val accuracy: ", acc_val)

结果是这样的——

0 Train accuracy:  0.1 
 Val accuracy:  0.0986
1 Train accuracy:  0.14 
 Val accuracy:  0.0986
2 Train accuracy:  0.06 
 Val accuracy:  0.0986
3 Train accuracy:  0.06 
 Val accuracy:  0.0986

我参考了O'Reily教科书上的部分代码Tensorflow

编辑-在线找到此 O' Reily 指南- https://github.com/ageron/handson-ml/blob/master/10_introduction_to_artificial_neural_networks.ipynb

他们有一个类似于我的代码,但他们的工作很好。

2个回答

原因是您没有训练网络。

您需要step在代码中运行操作。您定义了它,但后来没有在任何地方使用它。运行 lossonly 会计算损失,但不会训练您的网络。

修复代码后(删除重复的 softmax,使用 adadelta,运行step),您应该得到: 在此处输入图像描述

我有两个建议。

  1. 将优化器更改为AdamOptimizer.
  2. 更改隐藏层中的神经元数量。他们太多了,无法完成这项任务。两层,每层有 25 个神经元就足够了。
    省略output=tf.nn.softmax(output)由于计算在softmax_cross_entropy_with_logits. 正如您在函数文档中所读到的softmax_cross_entropy_with_logits

警告:此操作需要未缩放的 logits,因为它在内部执行softmax onlogits以提高效率。不要使用 的输出调用此操作softmax,因为它会产生不正确的结果。