[英]MNIST neural network : Accuracy is pretty low
我正在使用 MNIST 數據集來學習張量流和神經網絡。 下面是我在python中的代碼。
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("data/",one_hot=True)
features = 28*28
classes = 10
batch_size = 100
m_train = mnist.train.num_examples
m_test = mnist.test.num_examples
print(" The neural network will be trained on ",m_train, " examples")
H_L_1_nodes = 500
H_L_2_nodes = 500
H_L_3_nodes = 500
x = tf.placeholder('float',[None,features])
y = tf.placeholder('float',[None,classes])
def neural_net(data):
hidden_layer_1 = {'weights' : tf.Variable(tf.random_normal([features, H_L_1_nodes]) ),
'biases' : tf.Variable(tf.random_normal([H_L_1_nodes]) )}
hidden_layer_2 = {'weights' : tf.Variable(tf.random_normal([H_L_1_nodes, H_L_2_nodes]) ),
'biases' : tf.Variable(tf.random_normal([H_L_2_nodes]))}
hidden_layer_3 = {'weights' : tf.Variable(tf.random_normal([H_L_2_nodes, H_L_3_nodes]) ),
'biases' : tf.Variable(tf.random_normal([H_L_3_nodes]))}
output_layer = {'weights' : tf.Variable(tf.random_normal([H_L_3_nodes, classes]) ),
'biases' : tf.Variable(tf.random_normal([classes]) )}
l1 = tf.add( tf.matmul( data, hidden_layer_1['weights'] ), hidden_layer_1['biases'])
l1 = tf.nn.relu(l1)
l2 = tf.add( tf.matmul( l1, hidden_layer_2['weights'] ), hidden_layer_2['biases'])
l2 = tf.nn.relu(l2)
l3 = tf.add( tf.matmul( l2, hidden_layer_3['weights'] ), hidden_layer_3['biases'])
l3 = tf.nn.relu(l3)
output = tf.add(tf.matmul( l3, output_layer['weights']), output_layer['biases'])
output = tf.nn.relu(output)
return output
def train_neural_network(x):
prediction = neural_net(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction, y))
optimizer = tf.train.AdamOptimizer(0.0001).minimize(cost)
epochs = 5
with tf.Session() as session:
session.run(tf.global_variables_initializer())
for epoch in range(epochs):
epoch_loss = 0
for _ in range(int(m_train/batch_size)):
_x, _y = mnist.train.next_batch(batch_size)
_, c = session.run( [optimizer,cost], feed_dict={x : _x, y : _y} )
epoch_loss += c
print(" Loss in ",epoch," iteration is ", epoch_loss)
correct = tf.equal(tf.argmax(prediction,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct,'float'))
print("-------------------------------------------------------------------------")
print(session.run(tf.cast(correct[:10],'float'), feed_dict= { x:mnist.test.images, y: mnist.test.labels } ))
print("-------------------------------------------------------------------------")
print(" The neural network will be tested on ",m_test, " examples")
print(" Accuracy = ", accuracy.eval(feed_dict= { x:mnist.test.images, y: mnist.test.labels } )*100,"%")
print("Initializing training...")
train_neural_network(x)
print("Success!")
我得到了 9% 到 13% 的准確率,但不超過這個。 我想我已經正確地實現了代碼,但無法弄清楚出了什么問題。 我發現的一件事是准確性是因為模型正確預測了 0。
我在計算網絡輸出時犯了錯誤,
錯誤的:
output = tf.add(tf.matmul( l3, output_layer['weights']), output_layer['biases'])
output = tf.nn.relu(output)
正確的:
output = tf.add(tf.matmul( l3, output_layer['weights']), output_layer['biases'])
我再次對輸出進行了標准化,這弄亂了所有網絡。 發布此答案,因為它將來可能對某人有所幫助。 謝謝!
PS:從senddex借來的代碼
編輯:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.