Keras:检查输入时出错

Keras:检查输入时出错,keras,theano,autoencoder,Keras,Theano,Autoencoder,我正在使用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_

我正在使用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:检查输入时出错:预期输入_7具有形状(无,720,1080,3),但获得具有形状的数组(995,720,1280,3)


输入错误:

简单到:

  • 您将输入定义为(7201080,3)
  • 您正在尝试使用表单(7201280,3)中的数据来测试模型
其中一个是错误的,我认为这是输入错误:

#change 1080 for 1280
input_img = Input(shape=(720, 1280, 3))
输出错误(目标):

现在,目标数据的形状为(7201280,3),最后一层输出(7201280,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)
,这将在没有培训的情况下为您提供结果

ValueError:检查目标时出错:预期conv2d_78具有形状(无,720,1280,1),但获得具有形状的数组(995,720,1280,3)。现在您已将3更改为1。。。。你必须在信息的两面都有相同的形状。我在哪里把3换成了1?我刚刚将输入形状中的1080改为1280,请在您的评论中阅读此消息。它说(无,7201280,
1
),应该是
3
。好的。我明白:)但我的代码中不使用任何1。也许是从Conv2D来的?