自动编码器输出和特征向量不正确



我正在使用自动编码器对图像进行特征提取。我的图像是位图=>像素值=0或1

我使用以下代码:

X_train_autoencodeur = X_train.reshape(-1, 96*96)
X_valid_autoencodeur=X_valid.reshape(-1,96*96)
input_img = Input(shape=(96*96,))
encoded = Dense(1024, activation='relu')(input_img)
encoded = Dense(512, activation='relu')(encoded)
encoded = Dense(256, activation='relu')(encoded)
encoded = Dense(128, activation='relu')(encoded)

decoded = Dense(256, activation='relu')(encoded)
decoded = Dense(512, activation='relu')(decoded)
decoded = Dense(1024, activation='relu')(decoded)
decoded = Dense(96*96, activation='sigmoid')(decoded)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train_autoencodeur, X_train_autoencodeur,
                epochs=100,
                batch_size=256,
                shuffle=True,
                validation_data=(X_valid_autoencodeur, X_valid_autoencodeur))

然后我用

decoded_imgs = autoencoder.predict(X_valid_autoencodeur)
plt.imshow(decoded_imgs[7].reshape(96,96))

经过 3 个 epoch 验证和训练损失后,值非常低且不会改变

重建的图像充满了黑色,特征向量都是一样的。

我已经训练了 100 个纪元的自动编码器,我应该训练更多吗?我的代码是否犯了错误,可以解释糟糕的重建?

仅根据经验,我知道即使您使用卷积神经网络,自动编码器通常需要很长时间才能训练(更像是 1000 个 epoch(。

但是,您正在尝试使用完全连接的NN(以及相当大的NN(,这将需要更长的时间来学习一些东西。

我的建议是:尝试使用CNN和更多的训练时期。

你的代码似乎是正确的。我认为问题来自数据本身。您是否对图像进行了预处理,使其在 0-1 之间规范化,如下所示:

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
<</div> div class="one_answers">

首先,您的网络(不必要地(非常大,并且具有许多参数,因此需要大量数据进行训练。 所以我建议在每个编码器和解码器结构中仅使用 2 层来尝试它。非常重要的一点是,对图像进行编码卷积自动编码器肯定会获得更好的结果,因此请尝试一下。最后,为什么使用二进制交叉熵进行损失函数?尝试 MSE。

祝你好运!

最新更新