diff --git a/beginner_source/dcgan_faces_tutorial.py b/beginner_source/dcgan_faces_tutorial.py index 6d31d698..244c7194 100644 --- a/beginner_source/dcgan_faces_tutorial.py +++ b/beginner_source/dcgan_faces_tutorial.py @@ -156,7 +156,7 @@ # - ``ngf`` - 생성자를 통과할 때 만들어질 특징 데이터의 채널 수입니다. # - ``ndf`` - 구분자를 통과할 때 만들어질 특징 데이터의 채널 수입니다. # - ``num_epochs`` - 학습시킬 에폭(epoch) 수입니다. 학습을 -# 길게하는 경우 대부분 좋은 결과를 보이지만, 이러한 경우 시간 또한 +# 길게 하는 경우 대부분 좋은 결과를 보이지만, 이러한 경우 시간 또한 # 오래 걸립니다. # - ``lr`` - 모델의 학습률(learning rate)입니다. DCGAN 논문에서와 같이 0.0002로 # 설정합니다. @@ -211,7 +211,7 @@ # 본 튜토리얼에서 사용할 데이터는 `Celeb-A Faces # dataset `__ 로, 해당 링크를 이용하거나 `Google # Drive `__ 에서 데이터를 받을 수 있습니다. -# 데이터를 받으면 ``img_align_celeba.zip`` 라는 파일을 보게될 겁니다. 다운로드가 끝나면 +# 데이터를 받으면 ``img_align_celeba.zip`` 라는 파일을 보게 될 겁니다. 다운로드가 끝나면 # ``celeba`` 이라는 폴더를 새로 만들고, 해당 폴더에 해당 zip 파일을 압축해제 해주시면 됩니다. # 압축 해제 후, 위에서 정의한 ``dataroot`` 변수에 방금 만든 ``celeba`` 폴더의 경로를 넣어주세요. # 위의 작업이 끝나면 ``celeba`` 폴더의 구조는 다음과 같아야 합니다: @@ -270,7 +270,7 @@ # ~~~~~~~~~~~~~~~~ # # DCGAN 논문에서는, 평균이 0( ``mean=0`` )이고 분산이 0.02( ``stdev=0.02`` )인 -# 정규분포을 시용해, 구분자와 생성자 모두 무작위 초기화를 진행하는 것이 좋다고 합니다. +# 정규분포를 사용해, 구분자와 생성자 모두 무작위 초기화를 진행하는 것이 좋다고 합니다. # ``weights_init`` 함수는 매개변수로 모델을 입력받아, # 모든 합성곱 계층, 전치 합성곱 계층, 배치 정규화 계층을, 위에서 말한 조건대로 # 가중치들을 다시 초기화 시킵니다. 이 함수는 모델이 만들어지자 마자 바로 적용을 @@ -293,7 +293,7 @@ def weights_init(m): # 생성자 :math:`G` 는 잠재 공간 벡터 :math:`z` 를, 데이터 공간으로 # 변환시키도록 설계되었습니다. 우리에게 데이터라 함은 이미지이기 때문에, # :math:`z` 를 데이터공간으로 변환한다는 뜻은, 학습이미지와 같은 사이즈를 가진 -# RGB 이미지를 생성하는것과 같습니다 (예. 3x64x64). +# RGB 이미지를 생성하는 것과 같습니다 (예. 3x64x64). # 실제 모델에서는 스트라이드(stride) 2를 가진 전치 합성곱 계층들을 이어서 구성하는데, # 각 전치 합성곱 계층 하나당 2차원 배치 정규화 계층과 relu 활성함수를 한 쌍으로 묶어서 사용합니다. # 생성자의 마지막 출력 계층에서는 데이터를 tanh 함수에 통과시키는데, @@ -454,7 +454,7 @@ def forward(self, input): # 우리가 원하는 요소들만 골라낼 수 있는지 이해하는 것이 먼저입니다 (예. GT labels). # # 좋습니다. 다음으로 넘어가겠습니다. 참 라벨 (혹은 정답)은 1로 두고, 거짓 라벨 (혹은 오답)은 0으로 -# 두겠습니다. 각 라벨의 값을 정한건 GAN 논문에서 사용된 값들로, GAN을 구성할때의 관례라 할 +# 두겠습니다. 각 라벨의 값을 정한 건 GAN 논문에서 사용된 값들로, GAN을 구성할때의 관례라 할 # 수 있습니다. 방금 정한 라벨 값들은 추후에 손실값을 계산하는 과정에서 사용될겁니다. # 마지막으로, 서로 구분되는 두 옵티마이저를 구성하겠습니다. 하나는 :math:`D` 를 위한 것, # 다른 하나는 :math:`G` 를 위한 것입니다. DCGAN에 서술된 대로, 두 옵티마이저는 모두 Adam을 사용하고, @@ -490,7 +490,7 @@ def forward(self, input): # 그러한 이유로, 본 튜토리얼에서는 `Goodfellow’s paper `__ # 에서 서술된 Algorithm 1을 기반으로, `ganhacks `__ 에서 사용된 몇가지 괜찮은 테크닉들을 # 더할 것입니다. 앞서 몇번 설명했지만, 우리의 의도는 “진짜 혹은 가짜 이미지를 구성”하고, -# :math:`log(D(G(z)))` 를 최대화하는 G의 목적함수를 최적화 시키는 겁니다. 학습과정은 크게 두가지로 나눕니다. +# :math:`log(D(G(z)))` 를 최대화하는 G의 목적함수를 최적화 시키는 겁니다. 학습과정은 크게 두 가지로 나눕니다. # Part 1은 구분자를, Part 2는 생성자를 업데이트하는 과정입니다. # # **Part 1 - 구분자의 학습** @@ -499,11 +499,11 @@ def forward(self, input): # Goodfellow의 말을 빌리자면, 구분자는 “변화도(gradient)를 상승(ascending)시키며 훈련”하게 됩니다. # 실전적으로 얘기하면, :math:`log(D(x)) + log(1-D(G(z)))` 를 최대화시키는 것과 같습니다. # `ganhacks `__ 에서 미니 배치(mini-batch)를 분리하여 사용한 개념을 가져와서, -# 우리 역시 두가지 스텝으로 분리해 계산을 해보겠습니다. 먼저, +# 우리 역시 두 가지 스텝으로 분리해 계산을 해보겠습니다. 먼저, # 진짜 데이터들로만 이루어진 배치를 만들어 :math:`D` 에 통과시킵니다. 그 출력값으로 (:math:`log(D(x))`) 의 손실값을 계산하고, # 역전파 과정에서의 변화도들을 계산합니다. 여기까지가 첫번째 스텝입니다. 두번째 스텝에서는, 오로지 가짜 데이터들로만 # 이루어진 배치를 만들어 :math:`D` 에 통과시키고, 그 출력값으로 (:math:`log(1-D(G(z)))`) 의 손실값을 계산해 -# 역전파 변화도를 구하면 됩니다. 이때 두가지 스텝에서 나오는 변화도들은 *축적(accumulate)* 시켜야 합니다. +# 역전파 변화도를 구하면 됩니다. 이때 두 가지 스텝에서 나오는 변화도들은 *축적(accumulate)* 시켜야 합니다. # 변화도까지 구했으니, 이제 옵티마이저를 사용해야겠죠. 파이토치의 함수를 호출해주면 알아서 변화도가 적용될겁니다. # # **Part 2 - 생성자의 학습**