Keras - 变分自动编码器NaN损失

时间:2018-04-03 16:02:46

标签: neural-network deep-learning keras autoencoder

我正在尝试使用我在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

并且所有训练时期的损失都是一样的。

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

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

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

In: label.shape
Out: (19343, 1)

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

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)

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

您可能希望将log_var密集层初始化为零。我自己遇到了问题(代码略有不同,但实际上却做得一样),事实证明,无论变异权重初始化得多么小,它们都会在几轮SGD中爆炸。

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

编辑-同样,包裹变化的指数级确实有助于爆炸梯度。由于指数的原因,将权重的初始值设置为零会导致初始变化为1。将其初始化为较低的负值,同时散发出初始接近零的变化,这使梯度在第一次运行时就变得巨大。零给我最好的结果。

答案 1 :(得分:2)

您的输入包含NaN值,这就是为什么您在输出中看到Nan的原因。您可以使用以下方法在numpy数组中计算NaN:

np.count_nonzero(np.isnan(data))

如果NAN不相关,只需将其从训练数据中删除或将其映射到特定的常数(如0或-1)即可解决您的问题

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果以上方法均无法帮助您。确保输入在[0,1]之间进行归一化。使用MNIST的一种简单方法是

X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0

答案 4 :(得分:0)

您不正确地拟合了模型。您的健身电话暗示:  vae.fit(X = X_train, y = X_test),但应该是:

vae.fit(X_train,X_train , validation_data = X_test)