2

hi Ich baue einen Bildklassifizierer für die Einklassenklassifizierung in dem ich Autoencoder verwendet habe, während ich dieses Modell ausführe, erhalte ich diesen Fehler durch diese Zeile (autoencoder_model.fit) (ValueError: Fehler beim Überprüfen des Ziels: erwartetes Modell_2 hat Form (None, 252, 252, 1) aber Array mit erhalten Form (300, 128, 128, 3).)ValueError: Fehler beim Überprüfen des Ziels: erwartetes Modell_2 hat eine Form (None, 252, 252, 1), aber ein Array mit Form (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

Welche Größe erwarten Sie von Ihren Bildern? Können Sie 'input_shape' und' img_data.shape' drucken und überprüfen, was Sie erwarten. Überprüfen Sie, dass es mit 'autoencoder_model.summary()' übereinstimmt. – ncfirth

+0

m tun, was Sie vorgeschlagen haben, lassen Sie es wissen –

+0

input_shape - (128, 128, 3), img_data.shape - (376, 128, 128, 3) –

Antwort

1

Es ist eine einfache Inkompatibilität zwischen der Ausgangsform des Decoders und der Form Ihrer Trainingsdaten. (Ziel bedeutet Ausgabe).

Ich sehe, Sie haben 2 MaxPoolings (Dividieren Sie Ihre Bildgröße von 4) und drei Upsamplings (Multiplikation der Eingang des Decoders mit 8).

Die endgültige Ausgabe des Autoencoders ist zu groß und stimmt nicht mit Ihren Daten überein. Sie müssen einfach im Modell arbeiten, damit die Ausgabeform Ihren Trainingsdaten entspricht.

+0

danke daniel :) –

0

Sie verwenden falsche API

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')]) 

einen Blick auf .fit Nehmen Verfahren Quellcode von 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 sollte die X-Daten sein, und die y sollte Etikett der Daten sein. Hope that help

+0

nein es ist ein autoencoder btw danke für den Beitrag –

Verwandte Themen