필요한 모델의 네트워크(인코더와 디코더) 객체를 초기화합니다.
코드 13-16 인코더와 디코더 객체 초기화
x_dim = 784
hidden_dim = 400
latent_dim = 200
epochs = 30
batch_size = 100
encoder = Encoder(input_dim=x_dim, hidden_dim=hidden_dim, latent_dim=latent_dim)
decoder = Decoder(latent_dim=latent_dim, hidden_dim=hidden_dim, output_dim=x_dim)
model = Model(Encoder=encoder, Decoder=decoder).to(device)
오차를 계산하기 위한 손실 함수를 정의합니다.
코드 13-17 손실 함수 정의
def loss_function(x, x_hat, mean, log_var): ------ ①
reproduction_loss = nn.functional.binary_cross_entropy(x_hat, x, reduction='sum')
KLD = -0.5 * torch.sum(1 + log_var - mean.pow(2) - log_var.exp())
return reproduction_loss, KLD
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
① 오차를 구하는 함수입니다. 변분추론으로 p(z|x)와 q(z) 사이의 쿨백-라이블러 발산(KLD)을 계산하고, KLD가 줄어드는 쪽으로 q(z)를 조금씩 업데이트합니다. 즉, 변형 오토인코더에서 손실 함수가 쿨백-라이블러 발산이 되며, 다음 수식을 사용합니다.
즉, 손실 함수에서 반환되는 값(reproduction_loss, KLD)을 수식처럼 모두 더하여 사용하는 것이 최종 손실 함수가 됩니다.