Keras自动编码器的输入形状

zfycwa2u  于 2023-02-12  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在尝试训练一个autocoder在下面的代码:

encoder_input = keras.layers.Input(shape=(x_Train.shape[1]), name='img')
encoder_out = keras.layers.Dense(1, activation = "relu")(encoder_input)

encoder = keras.Model(encoder_input, encoder_out, name="encoder")

decoder_input = keras.layers.Dense(602896, activation = "relu")(encoder_out)
decoder_output = keras.layers.Reshape((769, 28, 28))(decoder_input)

opt = keras.optimizers.RMSprop(learning_rate=1e-3)

autoencoder = keras.Model(encoder_input, decoder_output, name = "autoencoder")
autoencoder.summary()

autoencoder.compile(opt, loss='mse')
autoencoder.fit(x_Train, x_Train, epochs=10, batch_size=64, validation_split = 0.1)

但是,它返回错误:"tensorflow :模型是使用输入KerasTensor(type_spec = TensorSpec(shape =(None,28),dtype = tf.float32,name ='img '),name ='img',description ="由层'img'创建")的形状(None,28)构建的,但在具有不兼容形状(None,28,28)的输入上调用了该模型。"
我不知道如何处理这个问题,也不知道如何调整输入的大小。我的x_train是一个大小为[769,28,28]的向量。
有人能帮我处理这个错误吗?
That's the summary
谢谢

3qpi33ja

3qpi33ja1#

自动编码器的输入形状有点奇怪,训练数据的形状为28x28,批处理为769,因此修复应该如下所示:

encoder_input = keras.layer.Input(shape=(28, 28), name='img')
encoder_out = keras.layers.Dense(1, activation = "relu")(encoder_input)

# For ur decoder, you need to change a bit as well
decoder_input = keras.layers.Dense(784, activation = "sigmoid")(encoder_out) # Flatten until 28x28 =784
decoder_output = keras.layers.Reshape((28, 28))(decoder_input) # From there reshape back to 28x28
cygmwpex

cygmwpex2#

问题(除了输入层(必须是shape=(28, 28),输出层(必须是(28,28),如Edwin Cheong 's answer)中的错误形状)是您在输入层之后忘记了一个平面化层,这导致了不兼容的形状。
改编自above的答案:

encoder_input = keras.layer.Input(shape=(28, 28), name='img')
encoder_input = keras.layer.Flatten()(encoder_input)
encoder_out = keras.layers.Dense(1, activation = "relu")(encoder_input)

decoder_input = keras.layers.Dense(784, activation = "sigmoid")(encoder_out) 
decoder_output = keras.layers.Reshape((28, 28))(decoder_input)

相关问题