哪些参数禁止自动编码器学习正确的分布?
Which parameters prohibit the autoencoder from learning the right distribution?
我有一个非常简单的自动编码器示例:
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 的第二个神经元编码。为什么这没有发生?有没有参数我用错了?
一个问题是您的最后一层具有 relu
激活,其最小值为 0。如果您想在最后一层预测小于 0 的数字,您可以将激活更改为 "linear,"像这样
aeOutput = Dense(2, activation='linear')(encode)
我有一个非常简单的自动编码器示例:
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 的第二个神经元编码。为什么这没有发生?有没有参数我用错了?
一个问题是您的最后一层具有 relu
激活,其最小值为 0。如果您想在最后一层预测小于 0 的数字,您可以将激活更改为 "linear,"像这样
aeOutput = Dense(2, activation='linear')(encode)