gpt4 book ai didi

python - Keras 自动编码器

转载 作者:行者123 更新时间:2023-11-28 22:30:08 24 4
gpt4 key购买 nike

我很久以前就在 Java 中使用神经网络,现在我正在尝试学习在 Python 中使用 TFLearn 和 Keras。

我正在尝试构建一个自动编码器,但是当我遇到问题时,我向您展示的代码没有瓶颈特征(这应该会使问题变得更容易)。

在下面的代码中,我创建了网络、数据集(两个随机变量),并在训练后绘制了每个预测变量与其输入之间的相关性。

网络应该学习的是输出接收到的相同输入。

import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
from keras.models import load_model
from loaders.nslKddCup99.nslKddCup99Loader import NslKddCup99

def buildMyNetwork(inputs, bottleNeck):
inputLayer = Input(shape=(inputs,))
autoencoder = Dense(inputs*2, activation='relu')(inputLayer)
autoencoder = Dense(inputs*2, activation='relu')(autoencoder)
autoencoder = Dense(bottleNeck, activation='relu')(autoencoder)
autoencoder = Dense(inputs*2, activation='relu')(autoencoder)
autoencoder = Dense(inputs*2, activation='relu')(autoencoder)
autoencoder = Dense(inputs, activation='sigmoid')(autoencoder)
autoencoder = Model(input=inputLayer, output=autoencoder)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
return autoencoder


dataSize = 1000
variables = 2
data = np.zeros((dataSize,variables))
data[:, 0] = np.random.uniform(0, 0.8, size=dataSize)
data[:, 1] = np.random.uniform(0, 0.1, size=dataSize)

trainData, testData = data[:900], data[900:]

model = buildMyNetwork(variables,2)
model.fit(trainData, trainData, nb_epoch=2000)
predictions = model.predict(testData)

for x in range(variables):
plt.scatter(testData[:, x], predictions[:, x])
plt.show()
plt.close()

尽管有时结果是可以接受的,但很多其他情况下是 Not Acceptable ,我知道神经网络具有权重随机初始化,因此它可能会收敛到不同的解决方案,但我认为这太多了,我的想法可能有一些错误代码。

Sometimes correlation is acceptable

Others is quite lost

**

更新:

**

谢谢 Marcin Możejko!

确实这就是问题所在,我最初的问题是因为我试图构建一个自动编码器,所以为了与标题保持一致,这里提供了一个自动编码器示例(只是制作了一个更复杂的数据集并更改了激活函数):

import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
from keras.models import load_model
from loaders.nslKddCup99.nslKddCup99Loader import NslKddCup99

def buildMyNetwork(inputs, bottleNeck):
inputLayer = Input(shape=(inputs,))
autoencoder = Dense(inputs*2, activation='tanh')(inputLayer)
autoencoder = Dense(inputs*2, activation='tanh')(autoencoder)
autoencoder = Dense(bottleNeck, activation='tanh')(autoencoder)
autoencoder = Dense(inputs*2, activation='tanh')(autoencoder)
autoencoder = Dense(inputs*2, activation='tanh')(autoencoder)
autoencoder = Dense(inputs, activation='tanh')(autoencoder)
autoencoder = Model(input=inputLayer, output=autoencoder)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
return autoencoder


dataSize = 1000
variables = 6
data = np.zeros((dataSize,variables))
data[:, 0] = np.random.uniform(0, 0.5, size=dataSize)
data[:, 1] = np.random.uniform(0, 0.5, size=dataSize)
data[:, 2] = data[:, 0] + data[:, 1]
data[:, 3] = data[:, 0] * data[:, 1]
data[:, 4] = data[:, 0] / data[:, 1]
data[:, 5] = data[:, 0] ** data[:, 1]

trainData, testData = data[:900], data[900:]

model = buildMyNetwork(variables,2)
model.fit(trainData, trainData, nb_epoch=2000)
predictions = model.predict(testData)

for x in range(variables):
plt.scatter(testData[:, x], predictions[:, x])
plt.show()
plt.close()

对于这个例子,我使用了 TanH 激活函数,但我尝试了其他函数,效果也很好。数据集现在有 6 个变量,但自动编码器有 2 个神经元的瓶颈;只要变量 2 到 5 由变量 0 和 1 组合而成,自动编码器只需要传递这两个变量的信息并学习函数以在解码阶段生成其他变量。上面的例子展示了所有函数是如何学习的,除了一个,除法……我还不知道为什么。

最佳答案

我认为您的案例相对容易解释为什么您的网络可能无法学习身份函数。让我们看一下您的示例:

  1. 您的输入来自 2d 空间 - 由于均匀分布,它不在 1d0d 子流形上。从这里很容易看出,为了从您的自动编码器中获取身份函数,每个层都应该能够表示一个范围至少是二维的函数,因为最后一层的输出也应该位于 2d 流形上。
  2. 让我们检查一下您的网络并检查它是否满足条件需求:

    inputLayer = Input(shape=(2,))
    autoencoder = Dense(4, activation='relu')(inputLayer)
    autoencoder = Dense(4, activation='relu')(autoencoder)
    autoencoder = Dense(2, activation='relu')(autoencoder) # Possible problems here

    您可能会看到瓶颈可能会导致问题 - 对于这一层,可能很难从第一点开始满足条件。对于这一层 - 为了获得二维输出范围,您需要具有权重,这将使所有示例不落入 relu 的饱和区域(在这种情况下,所有这些示例都将被压缩为0 在其中一个单元中 - 这使得范围不可能“完全”2d)。所以基本上 - 这不会发生的可能性相对较小。也不能忽略反向传播不会将该单元移动到该区域的概率。

更新:

在评论中有人问为什么优化器无法防止或撤消饱和。这是一个重要的 relu 缺点的例子 - 一旦一个例子落入 relu 饱和区域 - 这个例子不会直接参与给定单元的学习.它可以通过影响之前的单位来影响它 - 但由于 0 派生 - 这种影响不是直接的。所以基本上不饱和示例来自副作用 - 而不是优化器的直接作用。

关于python - Keras 自动编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com