【问题标题】:Which parameters prohibit the autoencoder from learning the right distribution?哪些参数禁止自动编码器学习正确的分布?
【发布时间】:2020-01-26 22:38:10
【问题描述】:

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

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 的第二个神经元编码。为什么这没有发生?有没有我错误使用的参数?

【问题讨论】:

    标签: python keras neural-network autoencoder


    【解决方案1】:

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

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

    【讨论】:

    • 好点,但我是否理解正确,如果我只有线性激活函数,我将无法拟合任何非线性,对吗?如何在图像中做到这一点?像素不是也归一化了吗?这实际上令人大开眼界,ReLu 无法预测负值。但是,为什么它没有得到积极的一半呢?我的意思是,这应该会降低损失,对吧?
    • 通常,隐藏层具有非线性激活函数(relu、tanh 等),最后一层具有回归问题的线性激活函数。 “线性”激活函数是指权重的线性组合。隐藏层允许非线性关系,即使最后一层具有线性激活。
    • 我认为 relu 仍然可以得到正确的一半——在我成功获得 relu 以准确预测正值之前,我必须尝试许多不同的随机权重初始化。我可能是错的,但我认为这是由于“垂死的 relu”问题:[link] (medium.com/@danqing/a-practical-guide-to-relu-b83ca804f1f7)
    • 感谢您的链接。 Keras 是否用负数初始化了一些权重,这是否意味着由于负域中不存在梯度,这些权重在初始化时是“死的”?那会很奇怪......
    • 是的。 Keras 默认随机初始化一些负权重和一些正权重——您还可以指定如何初始化权重 [链接] (keras.io/initializers)。我认为你是对的,有些单位可能在开始时就死了(或者在开始训练后不久就死了)。
    猜你喜欢
    • 2021-06-14
    • 2021-12-17
    • 2019-02-26
    • 2011-05-11
    • 2017-09-03
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多