python - 哪些参数禁止自动编码器学习正确的分布?
问题描述
我有一个非常小的自动编码器示例:
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 的数字,您可以将激活更改为“线性”,如下所示
aeOutput = Dense(2, activation='linear')(encode)
推荐阅读
- r - 将“符号”中的值列转换/透视/转置为列名称,并将当前列名称转换为 R 语言中的值列
- azure - Azure databricks job - notebook snapshot
- excel - Excel VBA SUMIF 50行如何缩短代码
- java - BottomSheet DialogFragment 被键盘覆盖
- javascript - 在 PNotify 中更改背景颜色
- sql-server - 生成的 EntityFramework SQL 使用 varchar 而不是 nvarchar
- python - python:有没有办法对列表中的多个值的元组进行排序?
- react-modal - 我想在反应模式中打开点击的图像
- powershell - Powershell ConvertFrom-StringData 逆运算 ConvertTo-StringData
- azure - 在 azure 中创建 Azure 部署槽不起作用