Не инициализируйте модель со всеми нулями. Если вы это сделаете, вероятно, что градиент в этой точке (в пространстве параметров) также равен нулю.Это приводит к тому, что обновление градиента не существует, поэтому ваши параметры просто не изменятся.Чтобы избежать этого используйте случайную инициализацию .
т.е.
Измените
#First layer of the NN
W1 = tf.Variable(tf.zeros([784,10]))
b1 = tf.Variable(tf.zeros([10]))
out1 = tf.nn.softmax(tf.matmul(x, W1) + b1)
#Second layer of the NN
W2 = tf.Variable(tf.zeros([10,10]))
b2 = tf.Variable(tf.zeros([10]))
на
#First layer of the NN
W1 = tf.Variable(tf.truncated_normal([784,10], stddev=0.1))
b1 = tf.Variable(tf.truncated_normal([10], stddev=0.1))
out1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
# out1 = tf.nn.softmax(tf.matmul(x, W1) + b1)
#Second layer of the NN
W2 = tf.Variable(tf.truncated_normal([10,10], stddev=0.1))
b2 = tf.Variable(tf.truncated_normal([10],stddev=0.1))
Теперь модельспособен тренироваться.Вы также увидите, что я удалил нелинейность softmax из первого слоя и заменил его сигмоидом.Я сделал это потому, что слои softmax накладывают ограничения на вывод: он заставляет выход этого слоя складываться в один (это одна из причин, по которой его часто используют в самом последнем слое: для достижения вероятностной интерпретации конечного результата).Это ограничение заставило модель прекратить обучение с 30% точностью в быстром тесте.При использовании сигмоида точность достигла 89%, что значительно улучшило производительность.
Другими примерами нелинейностей, которые вы могли бы использовать в промежуточных слоях, могли бы быть:
- Гиперболический тангенс
- ReLU