【问题标题】:Value error with dimensions in designing a simple autoencoder设计简单自动编码器时的尺寸误差
【发布时间】:2019-03-18 07:22:35
【问题描述】:

您好,我正在使用 Keras 库在 Python 3.5 中尝试一个简单的自动编码器。我面临的问题是 - ValueError:检查输入时出错:预期 input_40 有 2 个维度,但得到了形状为(32、256、256、3)的数组。我的数据集非常小(60 个尺寸为 256*256 的 RGB 图像和一个相同类型的图像要验证)。我对 Python 有点陌生。请帮忙。

import matplotlib.pyplot as plt
from keras.layers import Input, Dense
from keras.models import Model

#Declaring the model
encoding_dim = 32
input_img = Input(shape=(65536,))
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(65536, activation='sigmoid')(encoded)
autoencoder = Model(input_img, decoded)
encoder = Model(input_img, encoded)
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')


#Constructing a data generator iterator
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set=
train_datagen.flow_from_directory('C:\\Users\\vlsi\\Desktop\\train',
batch_size = 32,
class_mode = 'binary')
test_set =     
test_datagen.flow_from_directory('C:\\Users\\vlsi\\Desktop\\validation',
batch_size = 32,
class_mode = 'binary')


#fitting data
autoencoder.fit_generator(training_set,
steps_per_epoch = 80,
epochs = 25,
validation_data = test_set,
validation_steps = 20)

import numpy as np from keras.preprocessing import image
test_image =            
image.load_img('C:\\Users\\vlsi\\Desktop\\validation\\validate\\apple1.jpg')
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)

#Displaying output
encoded_imgs = encoder.predict(test_image)
decoded_imgs = decoder.predict(encoded_imgs)
plt.imshow(decoded_imgs)

【问题讨论】:

    标签: python keras deep-learning python-3.5 autoencoder


    【解决方案1】:

    问题出在这里:

    input_img = Input(shape=(65536,))
    

    您告诉 Keras,网络的输入将具有 65K 维,这意味着形状向量(样本,65536),但您的实际输入具有形状(样本,256、256、3)。任何简单的解决方案都是使用真实的输入形状并让网络执行必要的整形:

    input_img = Input(shape=((256, 256, 3))
    flattened = Flatten()(input_img)
    encoded = Dense(encoding_dim, activation='relu')(flattened)
    decoded = Dense(256 * 256 * 3, activation='sigmoid')(encoded)
    decoded = Reshape((256, 256, 3))(decoded)
    autoencoder = Model(input_img, decoded)
    encoder = Model(input_img, encoded)
    encoded_input = Input(shape=(encoding_dim,))
    decoder_layer = autoencoder.layers[-1]
    decoder = Model(encoded_input, decoder_layer(encoded_input))
    

    请注意,我首先添加了一个 Flatten 和一个 Reshape 图层来展平图像,然后将展平后的图像恢复为形状 (256, 256, 3)。

    【讨论】:

    • 谢谢。维度错误消失了。我对 256*256=65,536 的东西感到困惑..认为这将是一个一维输入..它会引发另一个错误,但我想我现在会解决它..
    • 嗨,我认为新问题在行 > decoder = Model(encoded_input, decoder_layer(encoded_input))
    • @mrin9san 您必须具体说明错误消息,只是说这一行中存在问题并不能告诉我问题是什么或错误消息是什么。
    • “ValueError: 新数组的总大小必须不变”是出现的错误..我认为传递给模型解码器的参数正在造成问题。
    • 嗨,我找到了错误来源。事实证明,错误是由于 ImageDataGenerator 构造造成的。类模式应该是“输入”,而不是“二进制”,这会导致值错误。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2021-06-19
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多