2017-05-07 4 views
1

MNIST 데이터에 대한 간단한 선형 분류기를 만들려고 노력 중이며 손실이 발생하지 않습니다. 무엇이 문제 일 수 있습니까? 나는이 같은 겟 ...Tensorflow 선형 분류기가 학습 중이 아닙니다.

lc = LinearClassifier() 
lc.train(1000, 100) 

:

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

class LinearClassifier(object): 
    def __init__(self): 
     print("LinearClassifier loading MNIST") 
     self._mnist = input_data.read_data_sets("mnist_data/", one_hot = True) 
     self._buildGraph() 

    def _buildGraph(self): 
     self._tf_TrainX = tf.placeholder(tf.float32, [None, self._mnist.train.images.shape[1]])  
     self._tf_TrainY = tf.placeholder(tf.float32, [None, self._mnist.train.labels.shape[1]]) 

     self._tf_Weights = tf.Variable(tf.random_normal([784,10]), tf.float32) 
     self._tf_Bias = tf.Variable(tf.zeros([10]), tf.float32) 
     self._tf_Y = tf.nn.softmax(tf.matmul(self._tf_TrainX, self._tf_Weights) + self._tf_Bias) 

     self._tf_Loss = tf.reduce_mean(-tf.reduce_sum(self._tf_TrainY * tf.log(self._tf_Y), reduction_indices=[1])) 
     self._tf_TrainStep = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(self._tf_Loss) 

     self._tf_CorrectGuess = tf.equal(tf.argmax(self._tf_Y, 1), tf.arg_max(self._tf_TrainY, 1)) 
     self._tf_Accuracy = tf.reduce_mean(tf.cast(self._tf_CorrectGuess, tf.float32)) 

     self._tf_Initializers = tf.global_variables_initializer() 

    def train(self, epochs, batch_size): 
     self._sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
     self._sess.run(self._tf_Initializers) 

     for i in range(epochs): 
      batchX, batchY = self._mnist.train.next_batch(batch_size) 
      self._loss, _, self._accurracy = self._sess.run([self._tf_Loss, self._tf_TrainStep, self._tf_Accuracy], feed_dict ={self._tf_TrainX: batchX, self._tf_TrainY: batchY}) 
      print("Epoch: {0}, Loss: {1}, Accuracy: {2}".format(i, self._loss, self._accurracy)) 

내가 통해이 프로그램을 실행할 때 : 가 여기 내 코드입니다

Epoch: 969, Loss: 8.19491195678711, Accuracy: 0.17999999225139618 
Epoch: 970, Loss: 9.09421157836914, Accuracy: 0.1899999976158142 
.... 
Epoch: 998, Loss: 7.865959167480469, Accuracy: 0.17000000178813934 
Epoch: 999, Loss: 9.281349182128906, Accuracy: 0.10999999940395355 

이유가 될 수 무엇을 왜 TF .train.GradientDescentOptimizer가 내 무게와 바이어스를 제대로 훈련하지 못했습니까?

답변

3

학습 속도 (0.001)가 너무 낮습니다. 나는 그들이 mnist tensorflow tutorial에서처럼 0.5로 변경 한 후이 작업을 실행하고 좀 더 같은 정확성과 손실을 받고 있어요 :

Epoch: 997, Loss: 0.6437355875968933, Accuracy: 0.8999999761581421 
Epoch: 998, Loss: 0.6129786968231201, Accuracy: 0.8899999856948853 
Epoch: 999, Loss: 0.6442205905914307, Accuracy: 0.8999999761581421 

조금 특이한 원래 코드에의 또 다른 일이

self._tf_Y = tf.nn.softmax(tf.matmul(self._tf_TrainX, self._tf_Weights) + self._tf_Bias) 
self._tf_Loss = tf.reduce_mean(-tf.reduce_sum(self._tf_TrainY * tf.log(self._tf_Y), reduction_indices=[1])) 

이 경우 softmax를 두 번 수행하게됩니다. 나는 그것을 바꾸기 전에 그것을 달렸다. 그리고 기차 정확성은 약 85 %이었다. 그래서 그것은 약간의 차이를 만든다. 또한 softmax를 두 번하는 것은 이론적으로 해석하기가 어렵습니다.

마지막으로, 위의 softmax의 형태를 사용하는 것은 수치 적으로 불안정하기 때문에 분석적으로는 같지만 수치 적으로 안정한 softmax를 계산하는 내장 softmax 레이어를 사용하는 것이 좋습니다. 이 두 가지 변경 사항을 적용한 후 영향을받는 행은 다음과 같습니다.

self._tf_Y = tf.matmul(self._tf_TrainX, self._tf_Weights) + self._tf_Bias 
self._tf_Loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=self._tf_TrainY, logits=self._tf_Y)) 
+0

감사합니다. 당신이 올바른지. –