큰 데이터 세트에서 간단한 다중 레이어 퍼셉트론 모델을 작성하려고하지만 손실 값이 nan이됩니다. 이상한 일은 : 첫 번째 훈련 단계 후에, 손실 값은 46이 아닙니다 (이상한 낮은 수치입니다. 로지스틱 회귀 모델을 실행하면 첫 번째 손실 값은 약 3600입니다). 그러나 그 직후 손실 값은 지속적으로 낮습니다. 필자는 tf.print를 사용해 디버깅을 시도했다.Tensorflow 신경망 손실 값 NaN
모델의 목표는 ~ 4500 개의 서로 다른 클래스를 예측하는 것이므로 분류 문제입니다. tf.print를 사용할 때, 첫 번째 훈련 단계 (또는 MLP를 통한 피드 포워드) 후에 마지막으로 완전히 연결된 레이어에서 나오는 예측이 옳은 것처럼 보입니다 (1에서 4500 사이의 모든 숫자가 변함). 그런 다음, 마지막으로 완전히 연결된 레이어의 출력이 모두 0 또는 다른 상수 (0 0 0 0 0)로 이동합니다. 내 모델에 대한 몇 가지 정보를
:
3 계층 모델. 모든 완전히 연결된 레이어.
이 CrossEntropyLoss를 사용하여 0.001의 속도를 학습 1000
의
배치 크기는 (나는 또한 0.1와 0.01을 시도했지만 아무것도 변경되지 않습니다) (내가 log0 방지하기 위해 엡실론 값을 추가했다) 속도 붕괴 학습 AdamOptimizer
를 사용
는0.95
입니다
모델에 대한 정확한 코드는 다음과 같습니다 : (내가 TF 슬림 라이브러리를 사용하고 있습니다) 어떤 도움을 크게 감상 할 수
input_layer = slim.fully_connected(model_input, 5000, activation_fn=tf.nn.relu)
hidden_layer = slim.fully_connected(input_layer, 5000, activation_fn=tf.nn.relu)
output = slim.fully_connected(hidden_layer, vocab_size, activation_fn=tf.nn.relu)
output = tf.Print(output, [tf.argmax(output, 1)], 'out = ', summarize = 20, first_n = 10)
return {"predictions": output}
! 정말 고맙습니다!
당신의 코멘트를 위해 순전히 고맙다! 마지막 레이어를 시그 모이 드로 변경하면 실제로 NaN 손실 오류가 수정되었습니다. 이제 손실 값은 처음에는 정상 (약 3600)이지만 재빨리 ~ 23 정도로 떨어졌습니다. 이는 매우 기괴합니다. 기능 확장에 대한 첫 번째 요령을 상세히 설명 할 수 있습니까? 고맙습니다! – dooder
예. 2 가지 기능이 서로 다른 척도 (예 : 주택 가격 x1 : ~ 1e6 달러 및 면적 x2 : ~ 10-100m2)로 설정된 상황을 상상해보십시오. 크기를 조정하지 않으면 최적화 알고리즘이 "가장 가파른"(하이퍼) 서페이스로 되돌아와 다시 수렴 할 위험이 있습니다.이 서페이스는 수렴하지 않게 될 수도 있습니다 (따라서 NaN이 가능함). 주어진 예를 들어, (x1, x2) 표면이 그런 가파른 계곡을 가지고 있다고 상상할 수 있습니다. 이제, (xi <- (xi - mean (xi))/std (xi)) 피쳐 스케일링을 적용하면 비슷한 스케일로 모두 작동하게됩니다. 그 점을 보시겠습니까? – OZ13
오케이, 다른 단위의 기능을 비교하는 방법입니다. 나는 당신이 "스케일을 조정하지 않을 때, 당신의 최적화 기능이 가장 가파른 하이퍼 서피스로 되돌아오고 요새로 되돌아 올 위험이 있습니다."라는 것을 이해했는지 확신 할 수 없습니다. 왜 그것이 앞뒤로 튀어 오를까요? – dooder