ValueError: Error when checking target: expected model_2 to have shape (None, 252, 252, 1) but got array with shape (300, 128, 128, 3)

匿名 (未验证) 提交于 2019-12-03 08:33:39

问题:

hi I am building a image classifier for one-class classification in which i've used autoencoder while running this model I am getting this error by this line (autoencoder_model.fit) (ValueError: Error when checking target: expected model_2 to have shape (None, 252, 252, 1) but got array with shape (300, 128, 128, 3).)

num_of_samples = img_data.shape[0] labels = np.ones((num_of_samples,),dtype='int64')    labels[0:376]=0  names = ['cats']   input_shape=img_data[0].shape    X_train, X_test = train_test_split(img_data, test_size=0.2, random_state=2)   inputTensor = Input(input_shape) x = Conv2D(16, (3, 3), activation='relu', padding='same')(inputTensor) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) x = MaxPooling2D((2, 2), padding='same')(x) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) encoded_data = MaxPooling2D((2, 2), padding='same')(x)  encoder_model = Model(inputTensor,encoded_data)  # at this point the representation is (4, 4, 8) i.e. 128-dimensional encoded_input = Input((4,4,8)) x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded_input) x = UpSampling2D((2, 2))(x) x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) x = UpSampling2D((2, 2))(x) x = Conv2D(16, (3, 3), activation='relu',padding='same')(x) x = UpSampling2D((2, 2))(x) decoded_data = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)  decoder_model = Model(encoded_input,decoded_data)  autoencoder_input = Input(input_shape) encoded = encoder_model(autoencoder_input) decoded = decoder_model(encoded) autoencoder_model = Model(autoencoder_input, decoded) autoencoder_model.compile(optimizer='adadelta',   `enter code here`loss='binary_crossentropy')   autoencoder_model.fit(X_train, X_train,             epochs=50,             batch_size=32,             validation_data=(X_test, X_test),             callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

回答1:

It's a simple incompatibility between the output shape of the decoder and the shape of your training data. (Target means output).

I see you've got 2 MaxPoolings (dividing your image size by 4), and three upsamplings (multiplying the decoder's input by 8).

The final output of the autoencoder is too big and doesn't match your data. You must simply work in the model to make the output shape match your training data.



回答2:

You're using wrong API

autoencoder_model.fit(X_train, X_train,  

Take a look at .fit method source code from https://github.com/keras-team/keras/blob/master/keras/models.py

def fit(self,         x=None,         y=None,         batch_size=None,         epochs=1,         verbose=1,         callbacks=None,         validation_split=0.,         validation_data=None,         shuffle=True,         class_weight=None,         sample_weight=None,         initial_epoch=0,         steps_per_epoch=None,         validation_steps=None,         **kwargs):     """Trains the model for a fixed number of epochs (iterations on a dataset).     # Arguments         x: Numpy array of training data.             If the input layer in the model is named, you can also pass a             dictionary mapping the input name to a Numpy array.             `x` can be `None` (default) if feeding from             framework-native tensors (e.g. TensorFlow data tensors).         y: Numpy array of target (label) data.             If the output layer in the model is named, you can also pass a             dictionary mapping the output name to a Numpy array.             `y` can be `None` (default) if feeding from             framework-native tensors (e.g. TensorFlow data tensors).

So the x should be data, and the y should be label of the data. Hope that help



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!