Keras - 变分自编码器 NaN 损失

Mat*_*ana 4 neural-network autoencoder deep-learning keras

我正在尝试使用我在 Keras 示例(https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py)中找到的变分自动编码器的实现。

我只是重构了代码,以便在 Jupyter 笔记本中更轻松地使用它(我的代码:https : //github.com/matbell/Autoencoders/blob/master/models/vae.py)。

但是,当我尝试在我的数据上拟合模型时,我得到以下输出:

Autoencoders/models/vae.py:69: UserWarning: Output "dense_5" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to "dense_5" during training.
self.vae.compile(optimizer='rmsprop')

Train on 15474 samples, validate on 3869 samples
Epoch 1/50
15474/15474 [==============================] - 1s 76us/step - loss: nan - val_loss: nan
Epoch 2/50
15474/15474 [==============================] - 1s 65us/step - loss: nan - val_loss: nan
Epoch 3/50
15474/15474 [==============================] - 1s 69us/step - loss: nan - val_loss: nan
Epoch 4/50
15474/15474 [==============================] - 1s 62us/step - loss: nan - val_loss: nan
Run Code Online (Sandbox Code Playgroud)

并且所有训练时期的损失保持不变。

我不是深度学习和神经网络领域的专家,所以也许我错过了一些东西......

这是输入数据,其中datalabels是两个pandas.DataFrame

In: data.shape
Out: (19343, 87)

In: label.shape
Out: (19343, 1)
Run Code Online (Sandbox Code Playgroud)

这就是我Vae在 Jupyter 笔记本中使用类(来自我的代码)的方式:

INPUT_SIZE = len(data.columns)
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size = 0.2)

vae = Vae(INPUT_SIZE, intermediate_dim=32)
vae.fit(X_train, X_test)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Mon*_*tah 9

您可能希望将 log_var 密集层初始化为零。我自己也遇到了问题(代码略有不同,但有效地做同样的事情),结果证明,无论初始化的变化权重有多小,它们都会在几轮 SGD 中爆炸。

epsilon ~N(0,1) 和重建误差之间的随机相关性足以使权重逐渐变为非零。

编辑 - 此外,指数包装变化确实有助于爆炸梯度。由于指数,将权重的初始值设置为零会产生 1 的初始变化。将其初始化为一个较低的负值,同时发出接近于零的初始变化,使第一次运行时的梯度变得巨大。零给了我最好的结果。

  • 在增加潜在维度时,我一直在努力解决 NAN 损失问题,设置方差层的初始权重解决了这个问题(nan 错误过去发生在约 1000 步,现在训练已经超过 400k 步)。为未来的读者列出可以在此处完成的其他潜在操作:在存在日志的损失函数中添加 epsilon、梯度裁剪、在各个位置添加 nan 错误检查以进行调试(例如“tf.verify_tensor_all_finite”)。 (2认同)
  • 您是否知道有关“log_var”变量的权重初始化主题的更广泛的讨论?我还发现 Zeros 具有更好的行为,但除了这篇文章之外,在文献或在线讨论中找不到任何内容。 (2认同)

kso*_*all 5

如果以上都没有帮助到你。确保您的输入在 [0, 1] 之间标准化。使用 MNIST 的一种简单方法是

X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0
Run Code Online (Sandbox Code Playgroud)


小智 1

我遇到了类似的问题,因为输入包含 NaN。如果只有几个例子带有 NaN,那么所有的权重和损失也将是 NaN。再次检查数据内容!