반응형
파이토치 딥러닝 추론 결과 nan 을 처리하는 방법¶
- 딥러닝 추론 결과 도출된 nan 값을 0에 가까운 수로 강제로 전환 시킵니다. 아래 코드를 참고해주세요
In [1]:
import torch
# 임의의 출력 텐서를 만듭니다.
output = torch.tensor([1.0, 2.0, float('nan'), 4.0, float('nan')])
output
Out[1]:
tensor([1., 2., nan, 4., nan])
In [2]:
# NaN 값을 확인합니다.
nan_mask = torch.isnan(output)
nan_mask
Out[2]:
tensor([False, False, True, False, True])
In [3]:
# NaN 위치에 특정한 작은 값을 삽입합니다.
output = torch.where(nan_mask, torch.tensor(1e-10), output) # NaN 위치에 1e-10 값을 삽입합니다.
output
Out[3]:
tensor([1.0000e+00, 2.0000e+00, 1.0000e-10, 4.0000e+00, 1.0000e-10])
- 파이토치 추론 결과 도출된 nan 값을 0과 가까운수로 전환하는 코드예시는 아래와 같습니다.
In [11]:
...
for input_value in data_loader:
output = model(input_value)
nan_mask = torch.isnan(output)
output = torch.where(nan_mask, torch.tensor(1e-10), output)
...
- 입력 데이터 확인 : 모델에 입력되는 데이터에 NaN 값이 포함되어 있지는 않은지 확인 필요
- 가중치 및 바이어스 확인 : 모델의 가중치나 바이어스가 NaN 값을 가지고 있는지 확인 필요
In [4]:
# 모델의 가중치에 NaN 값이 있다면, 그 원인을 파악하고 수정하는 것이 중요합니다.
# 하지만! 만약! NaN 값을 가진 가중치를 특정 값으로 바꾸는 것이 필요하다면,
# 아래와 같이 torch.where 함수를 사용하여 NaN 값을 0 으로 변경할 수 있습니다.
def replace_nan_weights(model, value=0):
for param in model.parameters():
param.data = torch.where(torch.isnan(param.data), torch.full_like(param.data, value), param.data)
- 연산의 수치적 안정성 : 오버플로우나 언더플로우를 일으킬 수 있는 연산이 있는지 확인 필요 (예: 로그함수나 지수함수 같은 연산은 특정 입력값에 대해 매우 큰 출력값을 반환할 수 있음)
- 모델 구조와 하이퍼파라미터 : 너무 깊은 네트워크는 그라디언트 소실이나 폭발을 일으킬 수 있으며, 학습률이 너무 높거나 너무 낮은 경우에도 확인이 필요함
- 기타 : 배치 정규화, 드롭아웃 등의 기술이 적절하게 적용되었는지 확인 필요
반응형
'python' 카테고리의 다른 글
파이썬 대괄호 포함 문자열 리스트로 변환하기 (0) | 2023.06.09 |
---|---|
파이썬 json 바이너리 저장 (0) | 2023.06.09 |
넘파이 랜덤 정수 생성 (0) | 2023.06.04 |
판다스 컬럼을 열로 변환하는 방법 (0) | 2023.05.22 |
파이썬 string to datetime or datetime to string (0) | 2023.05.20 |
댓글