我正在学习TensorFlow,并按照TensorFlow文档中《MNIST初学者指南》实现了一个简单的neural network。这里是链接。正如预期的那样,准确率在80-90%左右。
然后,按照同一篇文章的指引,我转向了《MNIST专家指南》,使用了ConvNet。然而,我决定改进初学者的部分。我了解神经网络是如何学习的,也知道深层网络可以比浅层网络表现得更好。我修改了《MNIST初学者指南》中的原始程序,实现了一个具有两个隐藏层、每个隐藏层16个神经元的神经网络。
它看起来像这样:
网络图像
代码
预期的输出应该比仅使用单层时更好(假设W0的形状为[784,10],B0的形状为[10])
def build_graph(): return tf.matmul(x,W0) + B0
然而,输出显示网络根本没有在训练。准确率在任何迭代中都没有超过20%。
输出
正在提取MNIST_data/train-images-idx3-ubyte.gz
正在提取MNIST_data/train-labels-idx1-ubyte.gz
正在提取MNIST_data/t10k-images-idx3-ubyte.gz
正在提取MNIST_data/t10k-labels-idx1-ubyte.gz
0.1
0.1
0.1
0.1
0.1
0.1
0.1
0.1
0.1
0.1
我的问题
上面的程序有什么问题导致它完全无法泛化?我如何在不使用卷积神经网络的情况下改进它?
回答:
你的主要错误是网络对称性,因为你将所有权重初始化为零。因此,权重从未被更新。将其改为小的随机数,它就会开始学习。初始化偏置为零是可以的。
另一个问题是纯粹技术性的:print_accuracy
函数在计算图中创建了新节点,由于你在循环中调用它,图会变得臃肿,最终会耗尽所有内存。
你可能还想调整超参数,并增大网络以增加其容量。
编辑:我还发现了你准确率计算中的一个错误。它应该是
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_predicted, 1))
这里是完整的代码: