본문 바로가기

전체 글

(182)
[GAN] mode collapse는 G와 D가 어떻게 학습될때 발생하는 문제인가? mode collapse는 G가 계속 똑같은 모양의 data를 출력해내는 문제를 말한다. 이 문제는 G가 제대로 학습한게 아니라 D를 속이는데에만 최적화되게 학습된 형태를 말한다. 그렇다면 어떻게 제대로 학습되지도 않았는데 Discriminator를 속일 수 있었을까? 정답은 애초에 D가 global optima로 수렴하지 않았기 때문이다. 어떠한 이유로 D가 local minima에 빠졌거나 학습이 제대로 이루어 지지 않았기 때문에 G의 속임수를 잘 판별하지 못하게 되고 그로 인해 G도 더이상 의미있는 gradient를 뽑아 낼 수 없었기 때문에 학습이 멈춰버린 것이다.
[디버깅] pytorch 디버깅 함수 import pdb; pdb.set_trace() 위 명령어로 실행중인 코드를 잠깐 멈출 수 있다. 이 상태에서 c를 하면 다음 저 명령어가 있을 때 까지 실행, q를 누르면 코드실행 종료를 한다.
[Error] pytorch 연산중 nan이 뜨는 원인 이 포스트에서는 Pytorch library에서 forward() 중에 NaN이 뜨는 경우와 loss.backward()를 하고나면 NaN이 발생하는 경우를 다룹니다. Forward propagation 중에 NaN발생 nan은 Not a number의 준말이다. nan이 뜨는 이유는 많이 있겠지만 다차원텐서 연산중에 날 수 있는 가장 많은 케이스는 바로 0으로 나누는 것이다. A_norm = torch.unsqueeze(torch.norm(A_vec, dim=2), 2) affinity_graph.append(torch.div(torch.div(num, A_norm).transpose(1, 2), A_norm).transpose(1,2) 나 같은 경우에 분석을 거치고 거치다 결국 위와 같은 코드에서 n..
[디버깅] 아무리 힘들어도 잊지 말아야 할 것 코드가 안돌아가면 사람이 잘못한것이다. 보통 그 코드에 대해 이해도가 부족하기때문에 발생한 에러다. 디버깅은 쪼개기다. 계속 쪼개고 분석하다보면 문제를 알 수 있다. 한번에 파악하려고 스트레스받지말고 버그발생하면 일단 문제발생 범위를 좁히자(쪼개자).
[python] 파이썬 print 출력방식. f-string bluese05.tistory.com/70
[논문정리] GAN의 목적함수 읽는법 GAN관련 논문들을 읽다보면 항상 나오는 수식이 있다. 다음과 같이 E와 함께 쓰인 식인데 우선 살펴보도록 하자. 논문에서 직접 말하겠지만 참고로 (1)번 수식은 loss function이 아닌 objective function이다. 손실함수와 목적함수는 비슷하지만 분명히 다른데, 손실함수가 목적함수의 특별한 케이스라고 보면 된다. 간단하게 설명하자면 손실함수는 무조건 작을 수록 좋은것이지만 목적함수는 최소화를 목표로 할 수 도있고, 최대화를 목표로 할 수도 있다. 그러나 마찬가지로 목적함수로 학습의 최적화를 위해서 존재하는 함수라는 점에서 loss function과 비슷한 부분이 있다. 다시 논문내용으로 돌아가서 (1)은 loss function이 아니기 때문에 log(D(x,y))와 log(1-D(x..
[pytorch] register_buffer 란? register_buffer 로 layer를 등록하면 어떤 특징이 있는가? 1. optimizer가 업데이트하지 않는다. 2. 그러나 값은 존재한다(하나의 layer로써 작용한다고 보면 된다.) 3. state_dict()로 확인이 가능하다. 4. GPU연산이 가능하다. 따라서 네트워크를 구성함에 있어서 네트워크를 end2end로 학습시키고 싶은데 중간에 업데이트를 하지않는 일반 layer를 넣고 싶을 때 사용할 수 있다. 참고 사이트 : discuss.pytorch.org/t/what-is-the-difference-between-register-buffer-and-register-parameter-of-nn-module/32723/6
[occluded data] dataset에 occlusion 취하는법 논문을 구현하려다 보면 dataset이 간혹 이런 내용이 나온다. 데이터셋 자체에서 occlude가 취해져 있는 것도 있으나 이 논문에서는 training을 위해 직접 데이터에 occlusion작업을 해주었다. 처음 봤을 때 어떻게 occlusion을 취했는지 의문이 들었다. 그냥 임의의 patch모양으로 pixel에 0을 취해서 까만 사각형을 만들어버리면 되나?? 그런식의 occlusion도 있겠지만 적절한 방법은 아니라고 교수님께서 말씀하셨다. 대신 적절한 방법은 이미지에 직접 다른 segmentation된 이미지를 추가하거나 아래 github처럼 프로그램을 사용하여 segmentation된 이미지를 추가하게끔 하는 것이다. github.com/isarandi/synthetic-occlusion