Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 哪些参数禁止自动编码器学习正确的分布?_Python_Keras_Neural Network_Autoencoder - Fatal编程技术网

Python 哪些参数禁止自动编码器学习正确的分布?

Python 哪些参数禁止自动编码器学习正确的分布?,python,keras,neural-network,autoencoder,Python,Keras,Neural Network,Autoencoder,我有一个非常简单的自动编码器示例: 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(

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

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(已经标准化了)

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

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的数字,可以将激活更改为“线性”,如下所示


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

非常好,但我是否正确理解,如果我只有线性激活函数,我将无法拟合任何非线性,对吗?如何在图像中做到这一点?像素不是也正常化了吗?这实际上是一个大开眼界的问题,ReLu无法预测负值。但是西尔,为什么它不能得到正的一半呢?我的意思是,这应该会降低损失,对吗?通常,隐藏层具有非线性激活函数(relu、tanh等),最后一层具有回归问题的线性激活函数。“线性”激活函数是指权重的线性组合。隐藏层允许非线性关系,即使最后一层有一个线性激活。我认为relu仍然可以得到半个正确的正值——我必须尝试许多不同的随机初始化权重,然后才能成功地得到relu以准确预测正值。我可能错了,但我认为这是由于“垂死的雷卢”问题:[链接]()感谢链接。Keras是否使用负数初始化某些权重,这是否意味着由于负域中不存在梯度,这些权重在初始化时“死”了?那太奇怪了……是的。Keras在默认情况下随机初始化一些负权重和一些正权重——您还可以指定如何初始化权重[link]()。我认为你是对的,一些单位可能在开始训练时死亡(或者在开始训练后很快死亡)。
f, ax = plt.subplots(figsize=(8, 8))
sns.kdeplot( X, shade=False, axis=ax)
sns.kdeplot( AE.predict(X), shade=False, axis=ax)