代码之家  ›  专栏  ›  技术社区  ›  Pro Q Rich Lysakowski PhD

如何让自动编码器处理小图像数据集

  •  1
  • Pro Q Rich Lysakowski PhD  · 技术社区  · 8 年前

    我有一个由三个图像组成的数据集。当我创建一个自动编码器来训练这三个图像时,我得到的每个图像的输出都是完全相同的,它看起来像是所有三个图像的混合。

    我的结果如下:

    输入图像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: enter image description here

    输出图像1: enter image description here

    输入图像2: enter image description here

    输出图像2: enter image description here

    输入图像3: enter image description here

    输出图像3: enter image description here

    因此,您可以看到输出为每个输入提供了完全相同的东西,虽然它与每个输入相对匹配,但并不完美。

    这是一个三图像数据集-它应该是完美的(或者至少每个图像都是不同的)。

    我担心这三个图像数据集,因为当我做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进行测试,看看这是否有更多帮助,然后尝试在很多时间段进行培训,看看这是否完全解决了问题。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Pro Q Rich Lysakowski PhD    8 年前

    encoding_dim

    "binary_crossentropy" "mse"

    relu sigmoid

    This page

    Messy, but better

    Playable!

    推荐文章