2016-08-23 6 views
1

'MNIST for 초보자'예제 (initial code here)를 사용하여 TensorFlow로 게임하고 있습니다. 나는 약간의 adaptions을했습니다 :TensorFlow의 MNIST 예제를 적용하면 NAN 예측이 제공됩니다.

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) 

sess = tf.InteractiveSession() 

# Create the model 
x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 

# Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 10]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

fake_images = mnist.train.images.tolist() 

# Train 
tf.initialize_all_variables().run() 
for i in range(10): 
    batch_xs, batch_ys = fake_images, mnist.train.labels 
    train_step.run({x: batch_xs, y_: batch_ys}) 

# Test trained model 
print(y.eval({x: mnist.test.images})) 

는 특히, 난 단지 (I 속도에 대한 자세한 정확성에 대해 우려하지 않다) 교육 단계 10 번을 실행하고 있습니다. 또한 모든 데이터를 한번에 (간단히하기 위해) 실행하고 있습니다. 마지막으로, 정확도 대신에 TF가 만들고있는 예측을 출력합니다.

[ 1.08577311e-02 7.29394853e-01 5.02395593e-02 ..., 2.74689011e-02 
    4.43389975e-02 2.32385024e-02] 
..., 
[ 2.95746652e-03 1.30554764e-02 1.39354384e-02 ..., 9.16484520e-02 
    9.70732421e-02 2.57733971e-01] 
[ 5.94450533e-02 1.36338845e-01 5.22132218e-02 ..., 6.91468120e-02 
    1.95634082e-01 4.83607128e-02] 
[ 4.46179360e-02 6.66685810e-04 3.84704918e-02 ..., 6.51754031e-04 
    2.46591796e-03 3.10819712e-03]] 

확률의 TF는 가능성 (0-9)의 각각에 할당되는 것으로 보인다 : 여기 (일부) 상기 코드의 출력이다. 모든 것이 세상과 잘 맞습니다.

내 주요 목표는 다른 용도로 사용하는 것이지만, 먼저 다른 데이터를 제공 할 수 있는지 확인하고 싶습니다. 이것은 내가 무엇을 시도했다입니다 : 나는 그것을 이해, 구조적으로 MNIST의 데이터와 동일한 무작위 쓰레기의 배열을 생성한다

fake_images = np.random.rand(55000, 784).astype('float32').tolist() 

. 위의 변경을하면 다음과 같습니다.

[[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
..., 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan]] 

분명히별로 유용하지 않습니다. 각 옵션 (mnist.train.imagesnp.random.rand 옵션)을 보면 listlistfloat입니다.

TensorFlow가이 배열을 허용하지 않는 이유는 무엇입니까? 무작위 데이터에서 배울 수있는 방법이 없다는 것을 인식하기 때문에 불평할까요? 나는 기대하지 않을 것이다. 그러나 나는 전에 틀렸다.

+0

'np.random.rand'는'[0, 1]'범위의 숫자를 생성합니다. 'mnist.train.images'에서 얻는 숫자의 범위는 얼마입니까? 중간 값의 일부가 오버플로되거나 언더 플로우 될 가능성이 큽니다. 중간 값, 즉'tf.matmul (x, W)'의 결과를 출력하여 문제인지 확인하려고합니다. – keveman

+0

학습 속도가'0.5'인데도 '0.01' 이하로 시도하십시오. – fabrizioM

+0

@keveman'mnist.train.images [0]'은 0-1 범위에있는 대부분 -0 플로트의 배열입니다. 중간 계산으로 'matmul'을 분리하려고 시도하면서 훈련 단계 수를 2로 변경했습니다.갑작스런 결과로 10 %의 정확도를 기대할 수 있습니다. 나는 그 것을 고친 그 변화에 그것을 고립시켰다. 그것은 over/underflow를 확인하는 것처럼 보인다. 그것이 어디에있을 수 있는지 또는 어떻게 해결할 수 있을지에 대한 생각? – Undo

답변

0

실제 MNIST 데이터는 매우 희소 한 데이터를 포함합니다. 대부분의 값은 0입니다. 합성 데이터는 균등하게 분포됩니다 (numpy 참조). W와 b는 희소 한 입력을 가정합니다. 훈련 한 모델이 강하게 맞 물릴 수 있고 특정 입력 픽셀에 연결된 매우 큰 W 가중치를 사용하여 좋은 출력 가능성을 허용 할 수 있습니다 (큰 후 softmax 값에는 큰 pre-softmax 활성화가 필요함). 합성 데이터를 공급할 때 갑자기 모든 입력 크기가 이전보다 훨씬 커져 모든 곳에서 매우 큰 활성화가 발생하여 오버플로가 발생할 수 있습니다.

+0

이것은 정확도를 높이는 데 도움이되었지만 제 테스트에서'nan' 문제를 수정하지 않았습니다. – Undo

+0

개정 된 답변보기 – ahaque

+0

이것은 신중하게 훈련 된 모델 (무작위 데이터로 교육받은 모델)에서 발생하지만, – Undo

1

당신을 망치고있는 것은 log (softmax)가 수치 적으로 안정적이지 않다는 것입니다.

The softmax cross entropy with logits loss은 수치 적으로 안정화되어있다.

그래서, 당신은 로그 softmax를 수치 적 안정성에 기계 학습 스택 교환 기사를 찾아 나는 게으른 해요

activations = tf.matmul(x, W) + b 
loss = tf.nn.softmax_cross_entropy_with_logits(activations, y) 

# only to get predictions, for accuracy or you know, actual forward use of the model 
predictions = tf.nn.softmax(activations) 

을 수행 할 수 있습니다,하지만 당신은 꽤 빨리 내가 ​​확신을 찾을 수 있습니다.

관련 문제