2017-09-18 1 views
0

저는 Tensorflow로 기계 학습을 시작했고 MNIST 초보 자습서를 마친 후 숨겨진 레이어를 삽입하여 해당 단순 모델의 정확성을 조금 향상시키고 싶었습니다. 근본적으로, 나는 마이클 닐슨 (Micheal Nielsen)의 신경 네트워크 및 심층 학습에 관한 책의 첫 번째 장 (here 참조)에서 네트워크 아키텍처를 직접 복사하기로 결정했습니다.Tensorflow의 MNIST에서 하나의 숨겨진 레이어로 완전히 연결된 네트워크 교육을 받았습니다.

Nielsen의 코드가 제대로 작동하지만 다음 Tensorflow 코드를 사용하여 비슷한 결과를 얻지 못했습니다. 나는 30 시대에 대한 교육 후 약 17 %의 정확도를 얻을 수

from tensorflow.examples.tutorials.mnist import input_data 
import tensorflow as tf 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 


def weight_variable(shape): 
    initial = tf.random_normal(shape) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.random_normal(shape) 
    return tf.Variable(initial) 


x = tf.placeholder(tf.float32, [None, 784]) 

#hidden layer 
W_fc1 = weight_variable([784, 30]) 
b_fc1 = bias_variable([30]) 
h_fc1 = tf.sigmoid(tf.matmul(x, W_fc1) + b_fc1) 

#output layer 
W_fc2 = weight_variable([30, 10]) 
b_fc2 = bias_variable([10]) 
y = tf.sigmoid(tf.matmul(h_fc1, W_fc2) + b_fc2) 

y_ = tf.placeholder(tf.float32, [None, 10]) 
loss = tf.reduce_mean(tf.reduce_sum(tf.pow(y_ - y, 2), reduction_indices=[1])) #I also tried simply tf.nn.l2_loss(y_ - y) 
train_step = tf.train.GradientDescentOptimizer(3.0).minimize(loss) 

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

def get_accuracy(): 
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
    return sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 

for i in range(30): 
    batch_xs, batch_ys = mnist.train.next_batch(10) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 
    print("Epoch {} accuracy: {:.2f}%".format(i+1, get_accuracy() * 100)) 

: - 내가 잘못 아니에요 경우 - 그것은해야 정확히 닐슨 제안 된 모델을 구현합니다. Nielsen의 코드를 사용하여 단 한 번의 신기원으로 91 %의 정확도를 얻었습니다.

분명히 나는 ​​뭔가를 놓치고 있습니다. 나는 정확도를 높이려고 시도하고 더 오래 훈련함으로써 약 60 %까지 얻을 수 있었지만 동일한 네트워크는 다른 백엔드 코드를 사용할지라도 비슷한 결과를 가져야한다. 나 또한 하이퍼 파라미터로 놀아 보려고했지만 비슷한 결과는 얻지 못했습니다.

내 코드에 결함이 있습니까?

+1

30 단계는 많지 않습니다. 그 다음에는 300 개의 예를 살펴볼 것입니다. for 루프를 1000 단계 실행하십시오. 나는 그것이 80-90 퍼센트까지 올릴 것이라고 생각한다. – suharshs

답변

2

suharshs에서 언급했듯이 문제는 용어 epoch의 오해 때문에 발생합니다. 엄격하게 적용되는 것은 아니지만, 신기원은 일반적으로 전체 교육 데이터 세트에 대한 단일 반복입니다. Nielsen의 코드를 다시 한 번 살펴보면 SGD 방식에 반영됩니다. 단일 신기원 (epoch)은 전체 training_data를 반복하여 미니 배치로 나눕니다. 각 신기원은 사실 미니 배치의 크기이며 단지 10 개의 샘플입니다.

관련 문제