2017-02-16 67 views
0

我正在使用MNIST数据集来学习tensorflow和神经网络。以下是我在python中的代码。MNIST神经网络:准确度很低

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。 在此先感谢!

+0

random_normal的平均值和标准偏差为0和1。 – mining

+0

这会如何影响? –

+0

更高的权重,更多的迭代/数据需要纠正初始化。很难给出一般的规则,但将它乘以0.01之类的东西应该是一种尝试。我希望你也有很好的理由偏离Adam的默认设置 – sascha

回答

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:从借用代码sentdex

编辑:

我发现,精度可以通过使用CNN且甚至进一步更通过使用RNN得到进一步改善。可能有人会觉得这很有用。