我正在使用autoencodeur对图像进行特征提取。我的图像是位图=>像素值= 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个时期的验证和训练损失后,损失非常低且没有变化
重建的图像充满黑色,特征向量都相同。
我已经将autoencodeur训练了100个时期,我应该训练更多吗? 我在代码上是否犯了错误,可以解释不良的重构?
答案 0 :(得分:2)
您的代码似乎正确。我相信问题出在数据本身。您是否对图像进行了预处理,以使其在0-1之间归一化,如下所示:
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
答案 1 :(得分:2)
仅凭经验,我知道即使使用卷积神经网络,自动编码器通常也需要很长时间才能训练(更像是1000个纪元)。
但是,您正在尝试使用完全连接的NN(以及相当大的NN),这将花费更长的时间来学习一些知识。
我的建议是:尝试使用CNN和更多的训练纪元。
答案 2 :(得分:1)
首先,您的网络非常大(不必要),并且具有许多参数,因此需要大量数据进行训练。因此,我建议尝试在编码器和解码器结构的每个结构中仅使用2层。 非常重要的一点是,对图像进行卷积自动编码器编码肯定会获得更好的结果,因此请尝试一下。 最后,为什么将二元互熵用于损失函数?尝试mse。
祝你好运!