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)もしてみましたが、同様のエラーが発生してしまいました。