파이토치&텐서플로우&관련코딩
-
BCE & BCEwithLOGIT & CE파이토치&텐서플로우&관련코딩 2021. 2. 15. 22:46
맨날 BCE만 하다보니까 마지막 fc 레이어 다음에 sigmoid 를 쓰는게 습관이 되서 적는다. multi class를 할때에는 CE를 적는데 BCE는 sigmoid가 적용이 안되어있고, BCE(output, label)에서 output에는 무조건 0과 1 사이의 확률값이 나와야 되기 때문에 sigmoid를 거쳐야 하는 것이다. 따라서 BCE는 output이 1개가 나와도 되는 것이고, CE는 자동으로 안에 softmax 함수가 있다. 그래서 그냥 fc만 거친 값, 즉 음수가 될 수 있는 값들이 들어가기 때문에 따로 sigmoid나 softmax를 안해도 된다. BCELosswithLogit 은 sigmoid를 포함하고 있기 때문에 생 logit값을 넣어야 한다.
-
progress bar 구현하기. (Jupyter, Pycharm)파이토치&텐서플로우&관련코딩 2021. 2. 3. 17:36
개쉽다. 보통 기본적으로 tqdm만 써서 배치가 얼마나 차이나는지 확인하는데 텐서플로우처럼 매 배치마다 볼 수 있으면 한 에폭이 끝나길 기다리짐 않고 로스나 훈련 정확도를 보고 바로바로 피드백이 가능하다. 1. 먼저 코드를 tqdm을 바로 for문에 쓰지 않고 선언 하면 다양한 함수를 상속받아 쓸 수 있다. 2. 그러면 기본적인 진행바가 나오는데 진행바가 계속 중첩되서 그려지는 것을 피하기 위해 매개변수 leave를 False로 설정한다. 3. 정확도와 훈련 손실스코어를 본다고 가정 할 때, 한 배치훈련이 끝나고 지금까지의 정확도와 이번 배치의 손실을 구한다. 4. 선언된 tqdm의 함수 활용 4-1. tqdm.set\_description(str) : 주어진 문자열을 맨 앞에 출력한다. Epoch을 하..
-
CUDA error: device-side assert triggered파이토치&텐서플로우&관련코딩 2021. 1. 28. 13:12
내 경험상 보통의 이 에러는 loss 함수를 잘못 계산 할 때 뜬다. loss = criterion(preds, label) loss.backward() 에서 loss.backward()에서 에러가 뜬다는 것이다. 이거는 로스가 계산이 안되는 것이지, 백프롭 문제가 아니다. 안되는 예시 1) binary classification문제에서 criterion = BCELoss 를 사용할때, 시그모이드를 안쓰면 에러가 뜬다. 이는 마이너스 값을 갖고 로스계산을 하러 가니까 안되는 것으로 추정.
-
torch.Tensor vs torch.tensor vs torch.autograd.Variable파이토치&텐서플로우&관련코딩 2021. 1. 26. 13:58
torch.Tensor는 그냥 상수라고 보면 된다. 즉 gradient를 계산 할 수 없다. 따라서 아래 예시처럼 gradient 를 계산 하려고 하면 에러가 뜬다. requred grad가 없음. 하지만 torch.tensor는 매개변수에 requires_grad가 있다. 또한 이 변수를 사용 하려면 무조건 변수가 소수여야하는 것을 주의하자. 즉 torch.tensor([1,2,3,4,5], dtype = torch.float32, requires_grad = True)로 하면 torch.autograd.Variable한 것과 똑같은 효과를 얻는다 마지막으로 torch.autograd.Variable은 그냥 wrapper의 개념으로 쓴다. 무조건 requires_grad를 true로 할수있는 wrapp..
-
loss.backward(retain_graph=True)의 필요성 & GAN 학습할때파이토치&텐서플로우&관련코딩 2021. 1. 5. 12:05
가장 기본적인 GAN을 학습할 때를 예로 들면, 아래 코드를 참조하자. 판별기부터 훈련 시키고 생성기를 훈련 시키는 모습이다. 방법은 여러가지가 있음. 1. latent_z를 만들고 gene_img를 만들어서 real_img와 비교해서 discriminator를 학습한 뒤에, 다시 latent_z를 만들고 gene_img만들어서 generator를 학습. => 한번의 에폭에 서로다른 gene_img로 학습시킴. 그다지 좋지 않은듯. 2. discirminator를 훈련하는 것은 1과 동일. latent_z를 만들지 않고 기존의 latent_z로 gene_img를 만들어서 학습시킴. => generator를 두번 돌려야 되므로 시간아까움 여기서 retrain_graph를 활용할 수 있다. 지금 문제는 di..
-