小编And*_*ios的帖子

Autoencoder不学习身份功能

我对机器学习有点新意,我想做一个简单的实验来更熟悉神经网络自动编码器:制作一个非常基本的自动编码器来学习身份功能.

我正在使用Keras让生活更轻松,所以我先做了这个以确保它有效:

# Weights are given as [weights, biases], so we give
# the identity matrix for the weights and a vector of zeros for the biases
weights = [np.diag(np.ones(84)), np.zeros(84)]
model = Sequential([Dense(84, input_dim=84, weights=weights)])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(X, X, nb_epoch=10, batch_size=8, validation_split=0.3)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,在列车和验证数据中损失均为零:

Epoch 1/10
97535/97535 [==============================] - 27s - loss: 0.0000e+00 - val_loss: 0.0000e+00
Epoch 2/10
97535/97535 [==============================] - 28s - loss: 0.0000e+00 - val_loss: 0.0000e+00
Run Code Online (Sandbox Code Playgroud)

然后我尝试做同样的事情,但没有初始化身份函数的权重,期望经过一段时间的训练后,它将学习它.它没有.我让它在不同的配置中运行200个时代,使用不同的优化器,丢失函数以及添加L1和L2活动正则化器.结果各不相同,但我得到的最好的仍然非常糟糕,看起来没有原始数据,只是在同一数值范围内.数据只是一些数字在1.1左右振荡.我不知道激活层是否对这个问题有意义,我应该使用它吗?

如果一层的"神经网络"无法学习像身份函数这样简单的东西,我怎么能指望它学习更复杂的东西呢?我究竟做错了什么?

编辑

为了获得更好的上下文,这里有一种生成与我正在使用的数据集非常相似的数据集的方法:

X = np.random.normal(1.1090579, 0.0012380764, (139336, 84))
Run Code Online (Sandbox Code Playgroud)

我怀疑值之间的差异可能太小.损失函数最终具有不错的值(大约1e-6 …

machine-learning neural-network autoencoder keras

7
推荐指数
1
解决办法
2001
查看次数