首页 > 解决方案 > 哪些参数禁止自动编码器学习正确的分布?

问题描述

我有一个非常小的自动编码器示例:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

首先,我使用高度相关的变量 A 和 B(已经标准化)创建一个数据集

X = pd.DataFrame( (np.random.randn(1000,2)), columns=["A", "B"] )
X["B"] = X["A"] + X["B"]/4

然后我设置自动编码器并训练它

aeInput = Input(2)
encode = Dense(2, activation='relu')(aeInput)
aeOutput = Dense(2, activation='relu')(encode)

AE = Model(aeInput, aeOutput, name="autoencoder")
AE.compile(optimizer='adam', loss="mean_squared_error", )
TrainAE = AE.fit( x=X, y=X, epochs=100, batch_size=2**5,)

训练看起来不错并且收敛顺利,但是当我查看结果时,输出主要是零。

f, ax = plt.subplots(figsize=(8, 8))
sns.kdeplot( X, shade=False, axis=ax)
sns.kdeplot( AE.predict(X), shade=False, axis=ax)

蓝色是原始分布,橙色是自动编码的

这对我来说似乎很奇怪,因为编码层与输入一样大,所以一个简单且无损失的解决方案就是直接连接第一个 A 神经元,激活为 1,第二个神经元编码相同对于 B. 为什么这没有发生?有没有我错误使用的参数?

标签: pythonkerasneural-networkautoencoder

解决方案


一个问题是您的最后一层有relu激活,它的最小值为 0。如果您想预测最后一层上小于 0 的数字,您可以将激活更改为“线性”,如下所示

aeOutput = Dense(2, activation='linear')(encode)


推荐阅读