2017-12-07 13 views
1

Tensor에서 훈련 된 신경 모델을 사용하여 예측을 수행하는 데 문제가 있습니다. 여기 내 시도입니다 :Tensorflow의 두 계층 훈련 된 신경 모델에 대한 예측

import tensorflow as tf 
import pandas, numpy as np 
dataset=[[0.4,0.5,0.6,0],[0.6,0.7,0.8,1],[0.3,0.8,0.5,2],....] 

X = tf.placeholder(tf.float32, [None, 3]) 
W = tf.Variable(tf.zeros([3,10])) 
b = tf.Variable(tf.zeros([10])) 

Y1 = tf.matmul(X, W) + b 

W1 = tf.Variable(tf.zeros([10, 1])) 
b1 = tf.Variable(tf.zeros([1])) 
Y = tf.nn.sigmoid(tf.matmul(Y1, W1) + b1) 

# placeholder for correct labels 
Y_ = tf.placeholder(tf.float32, [None, 1]) 
init = tf.global_variables_initializer() 
# loss function 


cross_entropy = -tf.reduce_sum(Y_ * tf.log(Y)) 
optimizer = tf.train.GradientDescentOptimizer(0.003) 
train_step = optimizer.minimize(cross_entropy) 


sess = tf.Session() 
sess.run(init) 

for i in range(1000): 
    # load batch of images and correct answers 
    batch_X, batch_Y = [x[:3] for x in dataset[:4000]],[x[-1:] for x in dataset[:4000]] 
    train_data={X: batch_X, Y_: batch_Y} 
    sess.run(train_step, feed_dict=train_data) 

correct_prediction = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
a,c = sess.run([accuracy, cross_entropy], feed_dict=train_data) 

test, lebs=[x[:3] for x in dataset[4000:]],[x[-1:] for x in dataset[4000:]] 
test_data={X: test, Y_: lebs}           
a,c = sess.run([accuracy, cross_entropy], feed_dict=test_data) 
prediction=tf.argmax(Y,1) 
print ("predictions", prediction.eval({X:test}, session=sess)) 

I받은 나는 위의 코드를 실행했을 때 결과를 다음

predictions [0 0 0 ..., 0 0 0] 

내 예상 출력 클래스 레이블되어야한다 :

predictions `[0,1,2....]` 

내가 주셔서 감사합니다 당신의 제안.

초기화 :

답변

1

은 당신의 코드에 여러 문제가있다 당신은 당신의 체중 변수를 초기화 제로입니다.

W = tf.Variable(tf.zeros([3,10]))

귀하의 모델은 초기화 제로 경우 입력의 모든 종류의 각 계층에서 동일한 값을 전파하면서 계속됩니다. 임의의 값으로 초기화하십시오. 예 :

W = tf.Variable(tf.truncated_normal((3,10)))

손실 함수는 : y * log(prob) + (1 - y) * log(1 - prob) : 나는 당신이 당신의 손실 함수로이 잘 알고 찾고 방정식을 복제하려고 생각합니다. 나는 당신이 전적으로 10 개의 반을 가지고 있다고 믿습니다. 10 개의 클래스 각각에 대해 위의 방정식을 대체해야하며 위의 방정식에서 올바른 클래스 또는 잘못된 클래스, 즉 각 클래스에 대해 1 또는 0으로 y 값을 사용합니다. y 값을 0에서 9까지의 클래스 레이블로 대체하지 마십시오.

이 계산을 모두 피하기 위해 tf.nn.softmax_cross_entropy_with_logits과 같은 Tensorflow의 내장 함수를 사용하도록 제안합니다. 그것은 먼 길을 가는데 도움이 될 것입니다.

S 상 기능 : 이것은 모든 출력은 0로 값을주는 이유에 주요 원인이다. 시그 모이 드의 출력 범위는 0에서 1 사이입니다. ReLU로 바꾸십시오.

출력 단위 : 분류 작업을 수행하는 경우 최종 레이어의 뉴런 수는 클래스 수와 같아야합니다. 각 클래스는 하나의 출력 클래스를 나타냅니다. 그것을 10 뉴런으로 교체하십시오.

학습 속도 : 학습 속도로 계속 놀아 라. 이러한 소규모 네트워크에서는 학습률이 높지 않습니다.

희망 사항을 코드에 이해했습니다. 자세한 내용은 위에서 언급 한 Google의 각 항목을 참조하십시오. 그러나 문제 해결을 시작하기에 충분한 정보를 제공해주었습니다.

+1

자세한 설명을 해주신 것에 대해 많은 감사드립니다. 귀하가 언급 한 내용을 인터넷을 통해 몇 시간 동안 보냈으며, 조정 작업을 완료했으며 이제는 완벽하게 작동합니다. 저는 약 93 %의 정확도를 얻었고 다른 학습 속도와 뉴런을 시도하고 있습니다. 심지어 세 개의 레이어로 확장 될 수도 있습니다. 다시 한번 감사드립니다. – user2274879