python - ValueError: Error al comprobar el destino: se esperaba que model_2 tuviera forma(Ninguno, 252, 252, 1) pero obtuvo una matriz con forma(300, 128, 128, 3)




image-processing machine-learning (2)

Es una incompatibilidad simple entre la forma de salida del decodificador y la forma de sus datos de entrenamiento. (Objetivo significa salida).

Veo que tiene 2 MaxPoolings (dividiendo el tamaño de su imagen entre 4) y tres muestras ascendentes (multiplicando la entrada del decodificador por 8).

El resultado final del autoencoder es demasiado grande y no coincide con sus datos. Simplemente debe trabajar en el modelo para que la forma de salida coincida con sus datos de entrenamiento.

hola Estoy construyendo un clasificador de imágenes para la clasificación de una clase en la que he usado autoencoder mientras ejecuto este modelo. Recibo este error por esta línea (autoencoder_model.fit) (ValueError: Error al verificar el destino: el modelo_2 esperado tiene forma ( Ninguno, 252, 252, 1) pero obtuvo una matriz con forma (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')])

Estás usando una API incorrecta

autoencoder_model.fit(X_train, X_train,  <--- This one is wrong
        epochs=50,
        batch_size=32,
        validation_data=(X_test, X_test),
        callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

Eche un vistazo al código fuente del método .fit en 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).

Entonces, la x debería ser datos, y la y debería ser la etiqueta de los datos. Espero que ayuda