【发布时间】:2020-04-18 17:05:15
【问题描述】:
我正在使用 Keras 高端 API 使用 tensorflow 2.0 训练变分自动编码器。目的是重构图像,这些图像由具有均匀强度int_shape 在零背景上不等于零的形状 组成,请参见下面带有int_shape = -0.25 的图像:
变分自动编码器具有以下架构,其中潜在空间为 50 维,与图像中所述的 16 维相反:
lambda 层使用一个函数从如下所示的正态分布中进行采样:
def sampling(args):
z_mean, z_log_var = args
epsilon = K.random_normal(shape =(1,1,latent_dim))
return z_mean + K.exp(0.5 * z_log_var) * epsilon
损失是 KL 散度和 MSE 损失的组合:
def vae_loss(y_pred, y_gt):
mse_loss = mse(y_pred, y_gt)
original_dim = GLOBAL.input_res**2
mse_loss *= original_dim
z_mean = model.get_layer('z_mean_layer').output
z_log_var = model.get_layer('z_log_var_layer').output
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1)
kl_loss *= -0.5
return K.mean(mse_loss + GLOBAL.beta*kl_loss)
目前,int_shape 取值范围(-0.5、0.5),但大小不同(1e-1、1e-2 和很少 1e-3)。 VAE 的目的是将图像作为输入并重建相同的图像。
对于范围 (-0.5, 0.5),损失的收敛不是确定性的:有时它始终保持不变,有时它在 5 / 50/180 个时期保持不变,然后下降并收敛。结果,重建并不总是好的,有些是混乱的,有时只会出现噪音。在我看来,收敛很大程度上取决于优化的初始起点。
但是,如果我将数据缩放为 10,即范围 (-5, 5) 或什至 100,即 (-50, 50),则损失收敛并且我不断获得良好的重建。在 (-5,5) 范围内,较高的绝对值往往具有更好的重建效果,而在 (-50,50) 范围内,几乎每个输入都可以正确重建。
我的问题是:在 VAE 的情况下,输入数据的范围和损失的收敛之间是否存在联系?
根据我的实验,int_shape 较高的形状往往具有更好的重建效果。我将其归因于更高的梯度,因此超参数空间中的步长更大,因为梯度的值取决于输入的值。更大的步骤会导致损失找到最小值并收敛。从这个意义上说,较小的值会产生较小的梯度,因此会采取更小的优化步骤。
我的另一个理论是,对于 (-0.5, 0.5) 的小范围内,表示输入的潜在空间中的点彼此更接近,并且在随机采样期间它们会混淆并且选择“错误”点为解码器。我已经通过绘制潜在空间分量的直方图进行了验证。输入值的范围越大,潜在空间中分布的方差越大。
更新: 我尝试了各种学习率,从 1e-4 到 5e-2,有和没有学习率衰减(每 10 个 epoch 减少 10%)。我还训练了足够数量的 epoch(300),batch size 64,训练集 3800 图像,val on 100。损失没有改善,重建也不好。使用 32 位和 64 位浮点精度均未成功。对于大于 2e-2 的学习率,损失偶尔会转向 Nan。提供稳定训练的最高学习率为 1e-2。此外,潜在空间为 50(不过,IMO 应该对问题没有任何影响)。
【问题讨论】:
标签: tensorflow keras deep-learning neural-network autoencoder