Gridsearch on convolutional autoencoder input shape value error

30 Views Asked by At

I tried to optimize a convolutional auto encoder with grid search. Unfortunately I am running in an error that I don't really understand and where I get stuck. The error is written below, it seems that there is an error with the shape, but I don't get it. The whole code is written below and can be run since it downloads the mnist-dataset directly. I would appreciate any help and thank in advance! Best regards MAGY

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import GridSearchCV
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.optimizers import Adam

# Laden des MNIST-Datensatzes und Vorbereitung
(train_images, _), (test_images, _) = mnist.load_data()
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0
train_images = np.reshape(train_images, (len(train_images), 28, 28, 1))
test_images = np.reshape(test_images, (len(test_images), 28, 28, 1))

# Funktion zur Erstellung des Autoencoders
def create_autoencoder(optimizer='adam', encoding_dim=32):
    input_img = Input(shape=(28, 28, 1))

    # Encoder
    x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(encoding_dim, (3, 3), activation='relu', padding='same')(x)
    encoded = MaxPooling2D((2, 2), padding='same')(x)

    # Decoder
    x = Conv2D(encoding_dim, (3, 3), activation='relu', padding='same')(encoded)
    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')(x)
    x = UpSampling2D((2, 2))(x)
    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

    autoencoder = Model(input_img, decoded)
    autoencoder.compile(optimizer=optimizer, loss='binary_crossentropy')
    return autoencoder

# Wrapper, um das Autoencoder-Modell mit GridSearchCV zu verwenden
model = KerasClassifier(build_fn=create_autoencoder, verbose=0)

# Hyperparameter-Raster definieren
param_grid = {
    'optimizer': ['adam', 'sgd'],
    'encoding_dim': [32, 64]
}

# Rastersuche durchführen
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3)
grid_search.fit(train_images, train_images)

# Beste Kombination von Hyperparametern anzeigen
print("Beste Kombination von Hyperparametern:")
print(grid_search.best_params_)

# Autoencoder-Modell mit den besten Hyperparametern erstellen
best_autoencoder = create_autoencoder(
    optimizer=grid_search.best_params_['optimizer'],
    encoding_dim=grid_search.best_params_['encoding_dim']
)

# Autoencoder trainieren
best_autoencoder.fit(train_images, train_images, epochs=10, batch_size=128)

# Autoencoder auf Testdaten anwenden
decoded_images = best_autoencoder.predict(test_images)

# Beispiel: Anzeigen eines Originalbildes und des rekonstruierten Bildes
import matplotlib.pyplot as plt
n = 10  # Anzahl der Bilder zum Anzeigen
plt.figure(figsize=(20, 4))
for i in range(n):
    # Originalbild
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(test_images[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    # Rekonstruiertes Bild
    ax = plt.subplot(2, n, i + 1 + n)
    plt.imshow(decoded_images[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    
plt.show()

ValueError: All the 12 fits failed. It is very likely that your model is misconfigured. You can try to debug the error by setting error_score='raise'.

Below are more details about the failures:

12 fits failed with the following error: Traceback (most recent call last):

File "/usr/local/lib/python3.8/dist-packages/sklearn/model_selection/_validation.py", line 729, in _fit_and_score estimator.fit(X_train, y_train, **fit_params) File "/usr/local/lib/python3.8/dist-packages/keras/wrappers/scikit_learn.py", line 246, in fit raise ValueError("Invalid shape for y: " + str(y.shape)) ValueError: Invalid shape for y: (40000, 28, 28, 1)

I checked the test_images.shape which is (10000, 28, 28, 1) and not (40000,28,28,1)

0

There are 0 best solutions below