@hoge_piyo

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GANのInputShapeでのエラー

解決したいこと

Google Colabで任意の画像を生成するGANを実装しています。
build_ganメソッドの実行時にエラーが発生しているので、これの解決方法を教えていただきたいです。

発生している問題・エラー

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-86703137e7b2> in <cell line: 33>()
     31 generator = build_generator()
     32 discriminator = build_discriminator()
---> 33 gan = build_gan(generator, discriminator)
     34 
     35 print("GANモデルが正常に構築され、コンパイルされました。")

2 frames
<ipython-input-9-86703137e7b2> in build_gan(generator, discriminator)
     23     label = Input(shape=(1,), dtype='int32')
     24     img = generator([noise, label])
---> 25     validity = discriminator([img, label])
     26     combined = Model([noise, label], validity)
     27     combined.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5))

/usr/local/lib/python3.10/dist-packages/keras/src/utils/traceback_utils.py in error_handler(*args, **kwargs)
     68             # To get the full stack trace, call:
     69             # `tf.debugging.disable_traceback_filtering()`
---> 70             raise e.with_traceback(filtered_tb) from None
     71         finally:
     72             del filtered_tb

/usr/local/lib/python3.10/dist-packages/keras/src/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
    296                 if spec_dim is not None and dim is not None:
    297                     if spec_dim != dim:
--> 298                         raise ValueError(
    299                             f'Input {input_index} of layer "{layer_name}" is '
    300                             "incompatible with the layer: "

ValueError: Exception encountered when calling layer "model_1" (type Functional).

Input 0 of layer "sequential_1" is incompatible with the layer: expected shape=(None, 32, 32, 3), found shape=(None, 3072)

Call arguments received by layer "model_1" (type Functional):
  • inputs=['tf.Tensor(shape=(None, 32, 32, 3), dtype=float32)', 'tf.Tensor(shape=(None, 1), dtype=int32)']
  • training=None
  • mask=None

該当するソースコード

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.layers import Input, Dense, Reshape, Flatten, Dropout, BatchNormalization, LeakyReLU, Embedding, multiply
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam

# CIFAR-10データセットの読み込み
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# データの正規化
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_test = (x_test.astype(np.float32) - 127.5) / 127.5
train_data = np.vstack((x_train, x_test))

# パラメータの設定
img_shape = (32, 32, 3)
latent_dim = 100
num_classes = 10

# ジェネレータの構築
def build_generator():
   model = Sequential()
   model.add(Dense(256, input_dim=latent_dim))
   model.add(LeakyReLU(alpha=0.2))
   model.add(BatchNormalization(momentum=0.8))
   model.add(Dense(512))
   model.add(LeakyReLU(alpha=0.2))
   model.add(BatchNormalization(momentum=0.8))
   model.add(Dense(1024))
   model.add(LeakyReLU(alpha=0.2))
   model.add(BatchNormalization(momentum=0.8))
   model.add(Dense(np.prod(img_shape), activation='tanh'))
   model.add(Reshape(img_shape))
   noise = Input(shape=(latent_dim,))
   label = Input(shape=(1,), dtype='int32')
   label_embedding = Flatten()(Embedding(num_classes, latent_dim)(label))
   model_input = multiply([noise, label_embedding])
   img = model(model_input)
   return Model([noise, label], img)

   # ディスクリミネータの構築
def build_discriminator():
   model = Sequential()
   model.add(Flatten(input_shape=img_shape))
   model.add(Dense(512))
   model.add(LeakyReLU(alpha=0.2))
   model.add(Dense(256))
   model.add(LeakyReLU(alpha=0.2))
   model.add(Dense(1, activation='sigmoid'))
   img = Input(shape=img_shape)
   label = Input(shape=(1,), dtype='int32')
   label_embedding = Flatten()(Embedding(num_classes, np.prod(img_shape))(label))
   flat_img = Flatten()(img)
   model_input = multiply([flat_img, label_embedding])
   validity = model(model_input)
   return Model([img, label], validity)

   # GANの構築
def build_gan(generator, discriminator):
    discriminator.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5), metrics=['accuracy'])
    discriminator.trainable = False
    noise = Input(shape=(latent_dim,))
    label = Input(shape=(1,), dtype='int32')
    img = generator([noise, label])
    validity = discriminator([img, label])
    combined = Model([noise, label], validity)
    combined.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5))
    return combined

# モデルの初期化
generator = build_generator()
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)

現在GAN及びCNNについて学習中です。
上記のコードはAIによって生成したもので、完全に理解できていません。
エラーが発生している原因を教えていただきたいです。

自分で試したこと

discriminatorに渡すimgのshapeを確認しましたが、(None, 32, 32, 3)でした。
念のためtf.reshape(-1, 32, 32, 3)もしてみましたが、同様のエラーが発生してしまいました。

0 likes

1Answer

discriminatorに渡すimgのshapeを確認しましたが、(None, 32, 32, 3)でした。

実際にコードを実行したときのshapeを確認しましたか?またimgとはimg = generator([noise, label])のことを指していますでしょうか?label_embedding = Flatten()(Embedding(num_classes, latent_dim)(label))で1次元化しているのが気になりましたがその辺りは無関係でしょうか?

0Like

Comments

  1. @hoge_piyo

    Questioner

    実際にコードを実行したときのshapeを確認しましたか?またimgとはimg = generator([noise, label])のことを指していますでしょうか?

    はい。

    # build_gan
    img = generator([noise, label])
    print(img.shape)
    

    の出力が(None, 32, 32, 3)でした。

    label_embedding = Flatten()(Embedding(num_classes, latent_dim)(label))で1次元化しているのが気になりましたがその辺りは無関係でしょうか?

    label_embedding = Flatten()(Embedding(num_classes, latent_dim)(label))をコメントアウトし、labelをtype=tf.float32にしたのですが、同様のエラーが発生してしまいました。

  2. @hoge_piyo

    Questioner

    build_discriminatorに

    model_input = Reshape((32, 32, 3))(model_input)
    

    を追加した所うまくいきました。
    回答いただきありがとうございました。

    # ディスクリミネータの構築
    def build_discriminator():
        model = Sequential()
        model.add(Flatten(input_shape=img_shape))
        model.add(Dense(512))
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dense(256))
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dense(1, activation='sigmoid'))
        img = Input(shape=img_shape)
        label = Input(shape=(1,), dtype='int32')
        label_embedding = Flatten()(Embedding(num_classes, np.prod(img_shape))(label))
        flat_img = Flatten()(img)
        model_input = multiply([flat_img, label_embedding])
        model_input = Reshape((32, 32, 3))(model_input)  # ここを追加
        validity = model(model_input)
        return Model([img, label], validity)
    

Your answer might help someone💌