python - ValueError:檢查目標時發生錯誤:預期model_2具有形狀(無,252、252、1),但數組的形狀為(300、128、128、3)




image-processing machine-learning (2)

您使用的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')])

看看 https://github.com/keras-team/keras/blob/master/keras/models.py .fit方法源代碼

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).

因此,x應該是數據,而y應該是數據的標籤。 希望對您有所幫助

嗨,我正在為一類分類構建圖像分類器,其中我在運行此模型時使用了自動編碼器,我在此行得到此錯誤(autoencoder_model.fit)(ValueError:檢查目標時出錯:預期model_2具有形狀(無,252,252,1)但得到形狀為(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')])

這是解碼器的輸出形狀與訓練數據的形狀之間的簡單不兼容。 (目標表示輸出)。

我看到您有2個MaxPoolings(將圖像大小除以4)和三個上採樣(將解碼器的輸入乘以8)。

自動編碼器的最終輸出太大,與您的數據不匹配。 您必須簡單地在模型中工作,以使輸出形狀與您的訓練數據匹配。