我有一个由三个图像组成的数据集。当我创建一个自动编码器来训练这三个图像时,我得到的每个图像的输出都是完全相同的,它看起来像是所有三个图像的混合。
我的结果如下:
输入图像1:
输出图像1:
输入图像2:
输出图像2:
输入图像3:
输出图像3:
因此,您可以看到输出为每个输入提供了完全相同的内容,虽然它与每个输入相对匹配,但它并不完美。
这是一个三图像数据集-它应该是完美的(或者至少每个图像都不同)。
我担心这三个图像数据集,因为当我做500个图像数据集时,我得到的只是一个白色空白屏幕,因为这是所有图像中最好的平均值。
我使用的是keras,代码非常简单。
从keras.models import sequential
从keras.layers导入密集、平坦、重塑
将numpy导入为np
#返回具有形状的numpy数组(3、24、32、1)
#有3幅图像,每幅24x32,黑白(1个彩色通道)
x_train=获取_数据()
#这是我们编码表示的大小
#编码为两个数字(我用3测试过;我仍然有同样的问题)
编码\u dim=2
#没有批量的形状
输入_shape=x_train.shape[1:]
#我们需要多少输出神经元来创建一个图像
输入尺寸=np.prod(输入形状)
#简单前馈网络
#我也尝试过卷积层;同样的问题
自动编码器=顺序([
flatten(),flatten
密集型(编码\暗型),编码
密集(输入亮度),解码
整形(输入_形)整形解码
])
#adadelta优化器比adam工作得更好,两者都有相同的问题
autoencoder.compile(优化器='adadelta',loss='mse')
#训练它输出与输入相同的东西
#我已经尝试了30000个时期,没有任何改善;
#仍然为所有三个输入预测相同的图像
AutoEncoder.fit(X轴传动系,X轴传动系,
周期=10,
批次号=1,
详细信息=1)
out=autocoder.predict(x_train)
然后我把输出(out[0],out[1],out[2])转换回图像。您可以看到上面的输出图像。
我很担心,因为这表明AutoEncoder没有保留任何有关输入图像的信息,这不是编码器应该如何执行的。
如何让编码器根据输入图像显示输出差异?
编辑:
我的一个同事甚至建议不要使用自动编码器,而是使用一个1层的前馈神经网络。我试了一下,同样的事情发生了,直到我把批量设置为1,并训练了1400个时期,然后它完美地工作了。这让我想到,more epochs会解决这个问题,但是我还不确定。
编辑:
对10000个epoch(批量大小为3)的培训使第二个图像与编码器上的第一个和第三个图像看起来不同,这正是非编码器版本在运行大约400个epoch(批量大小为3)时发生的情况,进一步证明了对更多epo的培训CHS可能是解决方案。
将使用批量大小1进行测试,看看这是否有更多帮助,然后尝试对很多时间段进行培训,看看这是否完全解决了问题。
我的结果如下:
输入图像1:

输出图像1:

输入图像2:

输出图像2:

输入图像3:

输出图像3:

因此,您可以看到输出为每个输入提供了完全相同的东西,虽然它与每个输入相对匹配,但并不完美。
这是一个三图像数据集-它应该是完美的(或者至少每个图像都是不同的)。
我担心这三个图像数据集,因为当我做500个图像数据集时,我得到的只是一个白色空白屏幕,因为这是所有图像中最好的平均值。
我使用的是Keras,代码非常简单。
from keras.models import Sequential
from keras.layers import Dense, Flatten, Reshape
import numpy as np
# returns a numpy array with shape (3, 24, 32, 1)
# there are 3 images that are each 24x32 and are black and white (1 color channel)
x_train = get_data()
# this is the size of our encoded representations
# encode down to two numbers (I have tested using 3; I still have the same issue)
encoding_dim = 2
# the shape without the batch amount
input_shape = x_train.shape[1:]
# how many output neurons we need to create an image
input_dim = np.prod(input_shape)
# simple feedforward network
# I've also tried convolutional layers; same issue
autoencoder = Sequential([
Flatten(), # flatten
Dense(encoding_dim), # encode
Dense(input_dim), # decode
Reshape(input_shape) # reshape decoding
])
# adadelta optimizer works better than adam, same issue with both
autoencoder.compile(optimizer='adadelta', loss='mse')
# train it to output the same thing it gets as input
# I've tried epochs up to 30000 with no improvement;
# still predicts the same image for all three inputs
autoencoder.fit(x_train, x_train,
epochs=10,
batch_size=1,
verbose=1)
out = autoencoder.predict(x_train)
然后我接受输出(out[0],请out[1],请out[2])把它们转换成图像。您可以看到上面的输出图像。
我很担心,因为这表明自动编码器没有保存任何有关输入图像的信息,而这不是编码器应该如何执行的。
如何让编码器根据输入图像显示输出差异?
编辑:
我的一个同事甚至建议不要使用自动编码器,而是使用一个1层的前馈神经网络。我试了一下,同样的事情发生了,直到我把批量设置为1,并训练了1400个时期,然后它完美地工作了。这让我想到more epochs会解决这个问题,但我还不确定。
编辑:
对10000个epoch(批量大小为3)的培训使第二个图像与编码器上的第一个和第三个图像看起来不同,这正是非编码器版本在运行大约400个epoch(批量大小为3)时所发生的情况,为更多epoch的培训提供了进一步的证据。可能是解决办法。
使用批量大小1进行测试,看看这是否有更多帮助,然后尝试在很多时间段进行培训,看看这是否完全解决了问题。