Page 35 -
P. 35
Decoder(
(decoder_lin): Sequential(
(0): Linear(in_features=4, out_features=128, bias=True)
(1): ReLU(inplace=True)
(2): Linear(in_features=128, out_features=288, bias=True)
(3): ReLU(inplace=True)
)
(unflatten): Unflatten(dim=1, unflattened_size=(32, 3, 3))
(decoder_conv): Sequential(
(0): ConvTranspose2d(32, 16, kernel_size=(3, 3), stride=(2, 2))
(1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
(3): ConvTranspose2d(16, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1),
output_padding=(1, 1))
(4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU(inplace=True)
(6): ConvTranspose2d(8, 1, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1),
output_padding=(1, 1))
)
)
모델 학습에 대한 함수를 생성합니다.
코드 13-5 모델 학습 함수 생성
def train_epoch(encoder, decoder, device, dataloader, loss_fn, optimizer,
noise_factor=0.3):
encoder.train() 인코더 훈련
decoder.train() 디코더 훈련
train_loss = [] 훈련 데이터셋을 이용하여 모델 학습
for image_batch, _ in dataloader: (비지도 학습으로 레이블은 필요하지 않습니다)
image_noisy = add_noise(image_batch, noise_factor)
image_noisy = image_noisy.to(device) 데이터셋이 CPU/GPU 장치를 사용하도록 지정
encoded_data = encoder(image_noisy) 노이즈 데이터를 인코더의 입력으로 사용
decoded_data = decoder(encoded_data) 인코더 출력을 디코더의 입력으로 사용
loss = loss_fn(decoded_data, image_noisy)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss.append(loss.detach().cpu().numpy())
return np.mean(train_loss)
이제 모델을 검증(테스트)하기 위한 함수를 생성합니다.
690