2017-11-16 8 views
1

Hej,회귀 신경망 평가

회귀 문제를 해결하기 위해 작은 프로그램을 작성하려고합니다. 내 데이터 세트는 여기에 4 개의 무작위 x (x1, x2, x3 및 x4) 및 1 y 값입니다. 행 중 하나는 다음과 같습니다

0.634585 0.552366 0.873447 0.196890 8.75 

내가 나의 모델이 손실을 보여주는 것입니다 얼마나 잘 평가하고 싶은 훈련 후 수 있도록 가능한 한 가까운 y 값을 예측하려는 알고있다. 불행하게도 나는 항상

Training cost= nan 

을받는 가장 중요한 선이 될 수있다 : 내 실수가 더 나은 또는 어디

X_data = tf.placeholder(shape=[None, 4], dtype=tf.float32) 
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32) 

# Input neurons : 4 
# Hidden neurons : 2 x 8 
# Output neurons : 3 
hidden_layer_nodes = 8 

w1 = tf.Variable(tf.random_normal(shape=[4,hidden_layer_nodes])) # Inputs -> Hidden Layer1 
b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes])) # First Bias 
w2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1])) # Hidden layer2 -> Outputs 
b2 = tf.Variable(tf.random_normal(shape=[1])) # Third Bias 

hidden_output = tf.nn.relu(tf.add(tf.matmul(X_data, w1), b1)) 
final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, w2), b2)) 

loss = tf.reduce_mean(-tf.reduce_sum(y_target * tf.log(final_output), axis=0)) 

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) 
train = optimizer.minimize(loss) 

init = tf.global_variables_initializer() 

steps = 10000 

with tf.Session() as sess: 

    sess.run(init) 

    for i in range(steps): 

     sess.run(train,feed_dict={X_data:X_train,y_target:y_train}) 

     # PRINT OUT A MESSAGE EVERY 100 STEPS 
     if i%500 == 0: 

      print('Currently on step {}'.format(i)) 

    training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
    print("Training cost=", training_cost) 

어쩌면 누군가가 알고, 지속적으로 내 훈련 도중 오류를 표시하는 방법 : I 이것이 tf.estimator로 어떻게 이루어 졌는지는 알지 못한다. 데이터 세트가 필요하면 알려주세요.

건배!

+0

회귀에서 입력 및 출력 활성화는 '선형'이어야합니다. 숨겨진 - 'relu'또는 다른 것. 회귀 사례와 관련하여 손실 기능을 이해하지 못합니다. 그것을 확인하십시오. 당신의 '나노'는 로그 기능 때문이라고 생각합니다. – avchauzov

+0

답장을 보내 주셔서 감사합니다. 내 정품 인증 기능과 손실 기능을 변경하려고했지만 내 오류가 최대 7000에 도달하지 못했습니다. 사용되는 정품 인증 기능은 현재 숨겨진 계층에서 relu이고 단순히 출력 계층에서 정품 인증을하지 않으므로 "final_output = tf.add (tf.matmul (hidden_output, w2), b2) "및 비용 함수"tf.reduce_sum (tf.square (final_output-y_target)) "로 정의됩니다. 레이블이 0에서 8까지만 다를 때 어디에서 큰 오류가 발생하는지 궁금합니다. – Schnurrberto

+0

지금 내가 이해하고있는 것은 Sigmoid 활성화 함수가 출력 레이어에 없어야한다는 것입니다. 0과 1 사이의 값만을 제공 할 수 있습니다. 그러나 무엇을 시도하든 관계없이 활성화 함수로 변경하거나 비용 함수, 오류는 항상 엄청나게 커집니다! – Schnurrberto

답변

1

Relu 활성화 기능이 폭발 그라디언트를 유발하기 때문입니다. 따라서 학습 속도를 적절히 낮춰야합니다. 또한 다른 활성화 함수도 시도 할 수 있습니다.이 경우 먼저 데이터 집합을 정규화해야 할 수 있습니다.

여기 (In simple multi-layer FFNN only ReLU activation function doesn't converge)와 비슷한 문제가 있습니다. 답을 따라하면 이해할 수 있습니다.

희망이 도움이됩니다.

+0

답변 해 주셔서 감사합니다. 당신은 learning_rate가 도움이되었지만 활성화 기능을 시그 모이 드로 변경하고 AdagradOptimizer 옵티 마이저를 변경하여 손실 5 점을받은 것이 더 낫습니다.0은 값이 모두 무작위라고 가정하는 것이 좋다고 생각합니다. tf.estimator 예제에서 평가 중에 손실 또는 오류가 계속 발생합니다. 데이터 셋을 살펴볼 때 끊임없이 변화하는 오류가 나타나면 어떻게해야합니까? – Schnurrberto