我正在尝试创建一个简单的GAN,但无法选择正确的参数。请考虑以下生成器和判别器的代码。它生成的图像尺寸为(高度 = 32,宽度 = 54)。
def build_generator(latent_size=100): # 我们将一对(z, L)映射到图像空间(..., 54, 32, 3),其中z是一个潜在向量,L是从P_c中抽取的标签 cnn = Sequential() cnn.add(Dense(3*54*32, input_dim=latent_size, activation='relu')) cnn.add(Reshape((4, 3, 432))) # 上采样到(8, 6, ...) cnn.add(Conv2DTranspose(192, 2, strides=2, padding='valid', activation='relu', kernel_initializer='glorot_normal')) cnn.add(BatchNormalization()) # 上采样到(16, 18, ...) cnn.add(Conv2DTranspose(96, 5, strides=(2,3), padding='same', activation='relu', kernel_initializer='glorot_normal')) cnn.add(BatchNormalization()) # 上采样到(32, 54, ...) cnn.add(Conv2DTranspose(3, 5, strides=(2,3), padding='same', activation='tanh', kernel_initializer='glorot_normal')) # 这是GAN论文中常提到的z空间 latent = Input(shape=(latent_size, )) # 这是我们的标签 image_class = Input(shape=(1,), dtype='int32') cls = Embedding(num_classes, latent_size, embeddings_initializer='glorot_normal')(image_class) # z空间与类条件嵌入之间的哈达玛乘积 h = layers.multiply([latent, cls]) fake_image = cnn(h) return Model([latent, image_class], fake_image)def build_discriminator(): # 构建一个相对标准的卷积网络,如参考论文中建议的使用LeakyReLUs cnn = Sequential() cnn.add(Conv2D(32, 3, padding='same', strides=2, input_shape=(32, 54, 3))) cnn.add(LeakyReLU(0.2)) cnn.add(Dropout(0.3)) cnn.add(Conv2D(64, 3, padding='same', strides=1)) cnn.add(LeakyReLU(0.2)) cnn.add(Dropout(0.3)) cnn.add(Conv2D(128, 3, padding='same', strides=2)) cnn.add(LeakyReLU(0.2)) cnn.add(Dropout(0.3)) cnn.add(Conv2D(256, 3, padding='same', strides=1)) cnn.add(LeakyReLU(0.2)) cnn.add(Dropout(0.3)) cnn.add(Flatten()) image = Input(shape=(32, 54, 3)) features = cnn(image) # 第一个输出(名称=generation)是判别器认为显示的图像是否为假,第二个输出 # (名称=auxiliary)是判别器认为图像所属的类别。 fake = Dense(1, activation='sigmoid', name='generation')(features) aux = Dense(num_classes, activation='softmax', name='auxiliary')(features) return Model(image, [fake, aux])
但我想生成尺寸为(200, 200)的图像,而不是(54, 32)。我尝试更改了几层中的一些参数,但总是得到以下错误:
ValueError: Input 0 of layer auxiliary is incompatible with the layer: expected axis -1 of input shape to have value 4000000 but received input with shape (None, 179200)
应更改哪些参数以生成尺寸为(200, 200)的图像?
回答:
一个简单的解决方案可以从这里开始:
cnn.add(Dense(25*25*432, input_dim=latent_size, activation='relu'))cnn.add(Reshape((25, 25, 432)))
然后进行三次反卷积以达到25x2x2x2 = 200
cnn.add(Conv2DTranspose(192, 2, strides=2, padding='valid', activation='relu', kernel_initializer='glorot_normal'))cnn.add(BatchNormalization())cnn.add(Conv2DTranspose(96, 2, strides=2, padding='valid', activation='relu', kernel_initializer='glorot_normal'))cnn.add(BatchNormalization())cnn.add(Conv2DTranspose(3, 2, strides=2, padding='valid', activation='relu', kernel_initializer='glorot_normal'))cnn.add(BatchNormalization())