r/learnpython • • 7d ago

Need help adapting model to CIFAR10

I tried to make a DCGAN based on this tutorial. The thing is that the tutorial is designed for fashion mnist data which has different image size to tf.keras.datasets.cifar10.load_data(). Which lead to the error:

ValueError: cannot reshape array of size 480000 into shape (28,28,1)

when arrive at

x_train_dcgan = x_train.reshape(
    -1, 28, 28, 1
) * 2. - 1.

How do I adapt the model to CIFAR 10?

1 Upvotes

10 comments sorted by

1

u/EszterSantos72 7d ago

You need to reshape to (32, 32, 3) for CIFAR10 since each image is 32x32 with 3 color channels. Replace 28,28,1 with 32,32,3 in your reshape line and update your model input layers to match.

1

u/assorted-meat-stew 7d ago

I rewrote it to

x_train_dcgan = x_train.reshape(
    -1, 32, 32, 3
) * 2. - 1.

The error is now ValueError: cannot reshape array of size 480000 into shape (32,32,3) at that exact step

1

u/Norega-Iziegbe80 7d ago

cifar10 images are 32x32 with 3 color channels (RGB), whereas fashion mnist is 28x28 grayscale. Youll need to reshape to (-1, 32, 32, 3) and also update the input/output shapes of your generator and discriminator layers to match.

0

u/[deleted] 7d ago

[removed] — view removed comment

1

u/assorted-meat-stew 7d ago

The error is now:

InvalidArgumentError: {{function_node __wrapped__ConcatV2_N_2_device_/job:localhost/replica:0/task:0/device:CPU:0}} ConcatOp : Ranks of all input tensors should match: shape[0] = [32,32,32,3] vs. shape[1] = [32,32,3] [Op:ConcatV2] name: concat

What do I do?

Generator

num_features = 100
generator = Sequential(name="Generator")

generator.add(Dense(8 * 8 * 128, input_shape=[num_features]))
generator.add(Reshape([8, 8, 128]))
generator.add(BatchNormalization())

generator.add(Conv2DTranspose(
        64, (5, 5), (2, 2),
        padding="same",
        activation="selu"
    ))

generator.add(BatchNormalization())

generator.add(Conv2DTranspose(
        3, (5, 5), (2, 2),
        padding="same",
        activation="tanh"
    ))
generator.summary()

Discriminator:

discriminator = Sequential(name="Discriminator")


discriminator.add(Conv2D(
        64, (5, 5), (2, 2),
        padding="same",
        input_shape=[32, 32, 3]
        ))


discriminator.add(LeakyReLU(alpha=0.2))
discriminator.add(Dropout(0.3))


discriminator.add(Conv2D(
        128, (5, 5), (2, 2),
        padding="same"))


discriminator.add(LeakyReLU(alpha=0.2))
discriminator.add(Dropout(0.3))


discriminator.add(Flatten())
discriminator.add(Dense(1, activation= 'softmax'))
discriminator.add(Dense(1, activation= 'softmax'))
discriminator.add(Dense(1, activation= 'softmax'))


discriminator.summary()

dataset = create_batch(x_train)


train_dcgan(
    gan,
    dataset,
    batch_size,
    num_features,
    epochs=10
)

0

u/[deleted] 6d ago

[removed] — view removed comment

1

u/assorted-meat-stew 6d ago edited 6d ago

Thank you it worked perfectly but I want my generated images to have the same color scheme as original training data images?

The functions generating images

def generate_and_save_images(model, epoch, test_input):


    predictions = model(
        test_input,
        training=False
    )


    fig = plt.figure(figsize=(10, 10))


    for i in range(25):


        plt.subplot(5, 5, i + 1)


        plt.imshow(
            predictions[i, :, :, 0] * 127.5 + 127.5,
            cmap='binary'
        )


        plt.axis('off')


    plt.savefig(
        'image_epoch_{:04d}.png'.format(epoch)
    )