학습 코드에 위 코드를 추가해주고 실험을 하면, NaN loss가 발생하는 즉시 실행이 멈추고 NaN을 유발한 라인을 출력해준다. 주로 division by zero나 매우 작은 값에 대한 log 연산이 NaN loss를 유발한다. NaN은 loss 연산 뿐만 아니라 forward 연산, backward 연산에서도 발생할 수 있으므로 직접 찾으려면 힘든데, 위 코드를 쓰면 간편하다.
먼저 torch.autograd 함수 중에 NaN loss가 발생했을 경우 원인을 찾아주는 함수가 있다.연구를 하면서 요즘 많이 겪는 문제가 NaN loss이다. 커스텀 레이어와 loss를 쓰다 보니 미처 파악하지 못한 예외가 생긴다. 그래서 NaN loss나 output이 발생했을 때 원인을 찾고 해결하는 방법에 대해 짧게 적어보려고 한다.pandas 에서 nan 값을 다른 값으로 대체하는 방법입니다. nan 값을 999 로 바꾼다고 가정합니다.
이 함수는 nan, inf, -inf 모두를 숫자값으로 바꿔버립니다. nan parameter 값의 기본값은 0입니다. numpy 에서 nan 값을 다른 값으로 대체하는 방법입니다. nan 값을 999 로 바꾼다고 가정합니다. numpy나 pandas를 이용하여 데이터를 조작할 때 nan 값을 다른 값으로 대체하는 작업은 꽤 존재합니다.
값이 NaN 인지 확인하는 방법은 다양하고, 사용하는 라이브러리마다 다를 수 있습니다. 아래는 nan 확인을 위한 몇가지 방법입니다.nan 은 nan 과 같지 않습니다. 그렇기 때문에 위 코드에서 같은 x 끼리 비교를 하더라도 결과는 동일합니다.nan 과 nan 을 비교하였을 때도 결과는 마찬가지입니다.
nan 은 숫자가 아니기 떄문에 다른 숫자들과 연산이 수행되면 결과로 nan을 받게 됩니다. nan 은 float type 입니다. nan 값은 연산의 결과가 숫자로 표현될 수 없을 때 사용하기도 하지만, 단순히 값이 부재하는 경우에도 사용합니다.
nan 은 IEEE 754 라 하여 부동소수점 연산에 관한 표준에서 소개되었습니다. nan 값은 부동소수점 연산 결과에서 특수한 경우를 나타내기 때문에, nan 값은 float 값의 일종입니다. IEEE 754에 의하면 0.01, 0.00034, 3.141592같은 수들과 같은 비트 표현 방식을 사용하지만, 가능한 패턴 중 특수한 경우들을 nan 이라고 부르는 것입니다. 따라서 nan도 float type의 일종입니다.NaN 값은 ‘Not a Number’ 을 뜻합니다. 숫자가 아니라는 뜻이죠. 0을 0으로 나누거나 음수의 제곱근을 구하고자 하면 정상적인 값을 얻지 못할 것입니다. 그럼에도 반환값을 받아야 하는 경우 nan 값을 받게 됩니다. Python에서는 0/0 을 수항하면 Error를 출력하는데, 다른 언어나 python의 numpy 라이브러리를 사용하는 경우 nan 값이 반환되는 것을 볼 수 있습니다.Python 에서 nan 값을 다루는 법을 알아봅니다.
보호되어 있는 글입니다.보호되어 있는 글입니다.보호되어 있는 글입니다.
보호되어 있는 글입니다.보호되어 있는 글입니다.보호되어 있는 글입니다.
보호되어 있는 글입니다.보호되어 있는 글입니다.보호되어 있는 글입니다.
보호되어 있는 글입니다.보호되어 있는 글입니다.
보호되어 있는 글입니다.보호되어 있는 글입니다.보호되어 있는 글입니다.나나는못말려 님의 블로그입니다.__