① 인코더 역할은 데이터(x)가 주어졌을 때 디코더가 원래 데이터로 잘 복원할 수 있는 z를 샘플링하여 이상적인 확률 분포 p(z|x)를 찾는 것입니다. 변형 오토인코더에서는 이상적인 확률 분포를 찾는 데 변분추론을 사용합니다.
② 디코더는 추출한 샘플을 입력으로 받아 다시 원본 데이터와 유사한 데이터를 재구축하는 역할을 수행합니다.
앞서 생성한 네트워크를 이용하여 모델을 정의합니다.
코드 13-12 모델 정의
model = VAE(
enc=encoder,
dec=decoder,
optimizer=tf.keras.optimizers.Adam(1e-3)
)
모델 훈련 결과를 시각화하는 함수를 생성합니다.
코드 13-13 모델 훈련 결과 시각화
example_data = next(iter(test_dataset))
def plot_reconstruction(model, example_data, nex=8, zm=2):
example_data_reconstructed = model.reconstruct(example_data)
samples = model.decode(tf.random.normal(shape=(BATCH_SIZE,2)))
fig, axs = plt.subplots(ncols=nex, nrows=3, figsize=(zm*nex, zm*3))
for axi, (dat, lab) in enumerate(
zip(
[example_data, example_data_reconstructed, samples],
["data", "data recon", "samples"],
)
):
for ex in range(nex):
axs[axi, ex].matshow(
dat.numpy()[ex].squeeze(), cmap=plt.cm.Greys, vmin=0, vmax=1
)
axs[axi, ex].axes.get_xaxis().set_ticks([])
axs[axi, ex].axes.get_yaxis().set_ticks([])
axs[axi, 0].set_ylabel(lab)
plt.show()