심층 학습 난 손실 이유
어쩌면 너무 일반적인 질문일 수도 있지만, 컨볼루션 신경망이 분산되는 원인이 무엇인지 설명할 수 있는 사람이 있습니까?
세부 사항:
Tensorflow의 iris_training 모델을 사용하여 제 데이터 일부와 함께 사용하고 있으며 계속해서 얻고 있습니다.
오류: 텐서 흐름:손실로 분기된 모델 = NaN.
추적...
tensorflow.tensor.learn.tensor.python.learn.sys.훈련 중 NanLossOnTrainError: 훈련 중 NaN 손실입니다.
다음 행에서 시작된 추적:
tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
hidden_units=[300, 300, 300],
#optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),
n_classes=11,
model_dir="/tmp/iris_model")
저는 옵티마이저를 조정하고, 학습률에 0을 사용하고, 옵티마이저를 사용하지 않았습니다.네트워크 계층, 데이터 크기 등에 대한 모든 통찰력은 감사합니다.
제가 본 많은 것들이 모델을 다양하게 만듭니다.
학습 속도가 너무 높습니다.손실이 증가하기 시작한 다음 무한대로 분산되는 경우 이러한 경우가 있는지 여부를 종종 알 수 있습니다.
저는 DNN 분류기에 익숙하지 않지만 범주형 교차 엔트로피 비용 함수를 사용한다고 생각합니다.여기에는 예측이 0에 가까워질수록 분기되는 예측 로그를 수집하는 작업이 포함됩니다.이것이 사람들이 이러한 차이를 방지하기 위해 예측에 작은 엡실론 값을 추가하는 이유입니다.저는 DNN Classifier가 아마도 이것을 하거나 텐서 흐름 opp를 사용할 것이라고 생각합니다.아마 문제가 아닐 겁니다.
엡실론을 추가하면 도움이 될 수 있는 0으로 나눗셈과 같은 다른 수치 안정성 문제가 존재할 수 있습니다.유한 정밀도 수를 처리할 때 적절하게 단순화되지 않으면 미분이 발산될 수 있는 제곱근인 경우 또 다른 덜 명확한 것입니다.하지만 저는 이것이 DNN 분류기의 문제인지 의심스럽습니다.
입력 데이터에 문제가 있을 수 있습니다.통봐해에 전화해 .
assert not np.any(np.isnan(x))
Nan을 도입하지 않도록 입력 데이터에 표시합니다.또한 모든 목표값이 유효한지 확인합니다.마지막으로 데이터가 제대로 정규화되었는지 확인합니다.픽셀이 [0, 255]가 아닌 [-1, 1] 범위에 있는 것이 좋습니다.라벨은 손실 함수의 도메인에 있어야 하므로 로그 기반 손실 함수를 사용하는 경우 모든 라벨은 음수가 아니어야 합니다(evanpu 및 아래 설명 참조).
교차 엔트로피를 훈련하는 경우 출력 확률에 1e-8과 같은 작은 숫자를 추가하려고 합니다.
로그(0)는 음의 무한대이기 때문에 모델이 충분히 훈련되면 출력 분포가 매우 왜곡됩니다. 예를 들어, 제가 4개의 클래스 출력을 하고 있다고 가정하면, 처음에 제 확률은 다음과 같습니다.
0.25 0.25 0.25 0.25
하지만 마지막으로 그 확률은 아마도 다음과 같이 보일 것입니다.
1.0 0 0 0
그리고 이 분포의 교차 엔트로피를 취하면 모든 것이 폭발할 것입니다.수정 사항은 인위적으로 모든 항에 소수를 추가하여 이를 방지하는 것입니다.
제 경우에는 거리 정수 LABEL을 설정할 때 NAN이 발생했습니다. 즉:
- 레이블 [0...100] 훈련은 괜찮았지만,
- 레이블 [0...100] 라벨 8000을 하나 더 붙이면 NAN이 나옵니다.
따라서 매우 먼 레이블을 사용하지 마십시오.
EDIT 다음과 같은 간단한 코드에서 효과를 확인할 수 있습니다.
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
X=np.random.random(size=(20,5))
y=np.random.randint(0,high=5, size=(20,1))
model = Sequential([
Dense(10, input_dim=X.shape[1]),
Activation('relu'),
Dense(5),
Activation('softmax')
])
model.compile(optimizer = "Adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )
print('fit model with labels in range 0..5')
history = model.fit(X, y, epochs= 5 )
X = np.vstack( (X, np.random.random(size=(1,5))))
y = np.vstack( ( y, [[8000]]))
print('fit model with labels in range 0..5 plus 8000')
history = model.fit(X, y, epochs= 5 )
결과는 레이블 8000을 추가한 후 NAN을 표시합니다.
fit model with labels in range 0..5
Epoch 1/5
20/20 [==============================] - 0s 25ms/step - loss: 1.8345 - acc: 0.1500
Epoch 2/5
20/20 [==============================] - 0s 150us/step - loss: 1.8312 - acc: 0.1500
Epoch 3/5
20/20 [==============================] - 0s 151us/step - loss: 1.8273 - acc: 0.1500
Epoch 4/5
20/20 [==============================] - 0s 198us/step - loss: 1.8233 - acc: 0.1500
Epoch 5/5
20/20 [==============================] - 0s 151us/step - loss: 1.8192 - acc: 0.1500
fit model with labels in range 0..5 plus 8000
Epoch 1/5
21/21 [==============================] - 0s 142us/step - loss: nan - acc: 0.1429
Epoch 2/5
21/21 [==============================] - 0s 238us/step - loss: nan - acc: 0.2381
Epoch 3/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 4/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 5/5
21/21 [==============================] - 0s 188us/step - loss: nan - acc: 0.2381
정수를 대상으로 사용하는 경우 0에서 대칭이 아닌지 확인합니다.
즉, 클래스 -1, 0, 1을 사용하지 않습니다.대신 0, 1, 2를 사용합니다.
오류에 대한 자세한 정보를 수집하고 오류가 처음 몇 번 반복되면 CPU 전용 모드(GPU 없음)에서 실험을 실행하는 것이 좋습니다.오류 메시지는 훨씬 더 구체적일 것입니다.
출처: https://github.com/tensorflow/tensor2tensor/issues/574
비록 대부분의 요점들이 이미 논의되었지만요.하지만 저는 NaN이 빠진 이유를 다시 한 번 강조하고 싶습니다.
tf.estimator.DNNClassifier(
hidden_units, feature_columns, model_dir=None, n_classes=2, weight_column=None,
label_vocabulary=None, optimizer='Adagrad', activation_fn=tf.nn.relu,
dropout=None, config=None, warm_start_from=None,
loss_reduction=losses_utils.ReductionV2.SUM_OVER_BATCH_SIZE, batch_norm=False
)
기본적으로 활성화 기능은 "Relu"입니다.중간 계층이 음수 값을 생성하고 "Relu"가 0으로 변환할 수 있습니다.점점 훈련이 중단됩니다.
저는 그러한 문제를 해결할 수 있는 "누출자"를 관찰했습니다.
이유는nan
,inf
또는-inf
는 사실에서 오는 경우가 많습니다.division by 0.0
TensorFlow에서는 예외 없이 나눗셈이 발생하지 않습니다.이는 다음과 같은 결과를 초래할 수 있습니다.nan
,inf
또는-inf
"가치".당신의 교육 데이터에 당신이 가지고 있을 수도 있습니다.0.0
그래서 당신의 손실 함수에서 당신이 수행하는 일이 일어날 수 있습니다.division by 0.0
.
a = tf.constant([2., 0., -2.])
b = tf.constant([0., 0., 0.])
c = tf.constant([1., 1., 1.])
print((a / b) + c)
출력은 다음 텐서입니다.
tf.Tensor([ inf nan -inf], shape=(3,), dtype=float32)
작은 항목 추가eplison
(예:1e-5
)는 종종 속임수를 씁니다.또한 TensorFlow 2 이후의 연산은tf.math.division_no_nan
정의됩니다.
정규화는 도움이 될 수 있습니다.분류자의 경우 이진 분류자든 다중 클래스 분류자든 활동 정규화에 적합한 사례가 있습니다.회귀 분석기의 경우 커널 정규화가 더 적절할 수 있습니다.
다음과 같이 경험한 몇 가지 (천박한) 이유를 설명하고자 합니다.
- 우리는 사전을 (NLP 작업을 위해) 업데이트했을 수 있지만 모델과 준비된 데이터는 다른 사전을 사용했습니다.
- 데이터를 재처리했을 수도 있지만(tf_record) 이전 모델을 로드했습니다.재처리된 데이터가 이전 데이터와 충돌할 수 있습니다.
- 모델을 처음부터 교육해야 할 수도 있지만 체크포인트를 삭제하는 것을 잊었고 모델이 최신 매개 변수를 자동으로 로드했습니다.
도움이 되길 바랍니다.
이 문제를 해결할 때 흥미로운 점을 발견했습니다. 데이터 레이블이 아래와 같이 정렬되어 있을 때 데이터에 셔플을 적용하면 다음과 같은 도움이 될 수 있습니다.
y=[0,0,0,0,0,0,0....,0,0,0,1,1,1,1,1....,1,1,1,1,1,1,1,2,2,2,2,2,......,2,2,2,2,2]
from sklearn.utils import shuffle
x, y = shuffle(x, y)
저도 같은 문제가 있었습니다.제 레이블은 즐거움 등급 [1, 3, 5]이었습니다.저는 모든 답을 읽었는데 제가 직면한 문제에 대해 그다지 이해가 되지 않았습니다.라벨을 [012]로 바꿨더니 작동했습니다.어떻게 이런 일이 일어났는지 모릅니다.
TensorFlow는 라벨을 일부 컨텍스트에서 텐서의 위치로 사용하므로 0, 1, ..., L-1이어야 합니다. 음수, 정수가 아닌 등은 대신 손실을 NaN으로 만들 수 있습니다.
그 이유는 1e9와 같이 매우 작은 값을 사용하기 때문일 수도 있습니다.다음으로 대체해 보십시오.
tf.float32.min
또는 (tf.keras.backend를 수동으로 변경한 경우).flotx):
tf.float16.min
출력 계층을 확인합니다.실제 클래스가 5로 설정된 경우 출력 계층도 5개의 클래스로 구성되어야 합니다.실수로 3 또는 다른 값으로 설정한 경우 교육 중에 'NaN'(숫자가 아님) 오류가 발생할 수 있습니다.
OP = L.Dense(5, activation="softmax")(x)
언급URL : https://stackoverflow.com/questions/40050397/deep-learning-nan-loss-reasons
'source' 카테고리의 다른 글
Python에서 가상 환경의 이름을 변경하는 방법은 무엇입니까? (0) | 2023.07.21 |
---|---|
로컬 React 프론트엔드를 로컬 Spring Boot 미들웨어 응용 프로그램에 연결할 때 CORS 오류가 발생했습니다. (0) | 2023.07.21 |
@SpringBoot 앱에서 RabbitListener 메서드 테스트 (0) | 2023.07.21 |
갑자기 멈추는 파이썬으로 거대한 CSV를 처리할 때 '킬드'는 무엇을 의미합니까? (0) | 2023.07.21 |
롬복 + 잭슨 불변량 (0) | 2023.07.21 |