Keras:检查输入时出错

Keras: Error when checking input

我在 Theano 后端使用 Keras 自动编码。并希望对 720x1080 RGB 图像进行自动编码。 这是我的代码

from keras.datasets import mnist
import numpy as np
from keras.layers import Input, LSTM, RepeatVector, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model

from PIL import Image


x_train = []
x_train_noisy = []

for i in range(5,1000):
    image = Image.open('data/trailerframes/frame' + str(i) + '.jpg', 'r')
    x_train.append(np.array(image))
    image = Image.open('data/trailerframes_avg/frame' + str(i) + '.jpg', 'r')
    x_train_noisy.append(np.array(image))


x_train = np.array(x_train)
x_train = x_train.astype('float32') / 255.
x_train_noisy = np.array(x_train_noisy)
x_train_noisy = x_train_noisy.astype('float32') / 255.


input_img = Input(shape=(720, 1080, 3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(32, (3, 3), data_format="channels_last", activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), data_format="channels_last", activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), data_format="channels_last", activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

autoencoder.fit(x_train_noisy, x_train,
            epochs=10,
            batch_size=128,
            shuffle=True,
            validation_data=(x_train_noisy, x_train))

但是它给我一个错误

ValueError: Error when checking input: expected input_7 to have shape (None, 720, 1080, 3) but got array with shape (995, 720, 1280, 3)

输入错误:

简单如:

  • 您将输入定义为 (720,1080,3)
  • 您正在尝试使用 (720,1280,3) 形式的数据试验您的模型

其中一个错误,我认为是输入错误:

#change 1080 for 1280
input_img = Input(shape=(720, 1280, 3))

输出错误(目标):

现在,您的目标数据形状为 (720,1280,3),最后一层输出 (720,1280,1)

一个简单的修复是:

decoded = Conv2D(3, (3, 3), data_format="channels_last", activation='sigmoid', padding='same')(x)

使用编码器:

训练该模型后,您可以创建仅使用编码器或解码器的子模型:

encoderModel = Model(input_img, decoded)    

decoderInput = Input((shape of the encoder output))    
decoderModel = Model(decoderInput,decoded))

这两个模型将共享整个模型的完全相同的权重,训练一个模型将影响所有三个模型。

要在没有训练的情况下使用它们,您可以使用 model.predict(data),它会在没有训练的情况下为您提供结果。