【发布时间】:2021-10-30 11:11:27
【问题描述】:
有人可以帮我从我的 DCGAN 中获得正确的结果/图像吗?
我从一张照片中得到了不同颜色(噪点)的照片
迭代到另一个,但不是任何接近我应该的地方
得到。我正在用标签喂人脸/猫/狗来训练我的发电机
和鉴别器,我应该得到看起来的输出
像猫、狗或人脸。
对于不同的潜在向量,我得到不同的结果/像素 值,不同的颜色用于不同的迭代,但不是 面孔或动物的结构。
我正在使用二元交叉熵损失函数 生成器、鉴别器和GAN。我尝试使用 MAE 除了生成器的交叉熵,但没有得到任何东西 不同的。我尝试训练生成器和鉴别器 一起、分开和交替的生成器和 鉴别器,但这些尝试也没有什么好处。 我每次运行 700 多个 epoch(5 天) CPU 上的迭代耗时超过 5 分钟。
def generator(latent_dim, n_classes):
initializer = tf.random_normal_initializer(0., 0.021)
in_label = Input(shape=(1,))
li = Embedding(n_classes, 25)(in_label)
n_nodes = 64 * 64
li = Dense(n_nodes)(li)
li = Reshape((64, 64, 1))(li)
in_lat = Input(shape=(latent_dim,))
n_nodes = 128 * 64 * 64
gen = Dense(n_nodes)(in_lat)
gen = LeakyReLU(alpha=0.2)(gen)
gen = BatchNormalization(axis=-1)(gen)
gen = Reshape((64, 64, 128))(gen)
merge = Concatenate()([gen, li])
gen = Conv2DTranspose(128, (4,4), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(merge)
gen = LeakyReLU(alpha=0.2)(gen)
gen = BatchNormalization(axis=-1)(gen)
gen = Conv2DTranspose(128, (4,4), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(gen)
gen = LeakyReLU(alpha=0.2)(gen)
gen = BatchNormalization(axis=-1)(gen)
out_layer = Conv2D(3, (7,7), activation='tanh', padding='same',kernel_initializer=initializer,use_bias=False)(gen)
model = Model([in_lat, in_label], out_layer, name="generator")
opt = Adam(lr=0.0002, beta_1=0.5)
model.compile(optimizer=opt,loss='binary_crossentropy', metrics='accuracy')
return model
def define_discriminator(n_classes,in_shape=(256,256,3)):
initializer = tf.random_normal_initializer(0., 0.021)
in_label = Input(shape=(1,))
li = Embedding(n_classes, 25)(in_label)
n_nodes = in_shape[0] * in_shape[1]
li = Dense(n_nodes)(li)
li = Reshape((in_shape[0], in_shape[1],1))(li)
in_image = Input(shape=in_shape)
merge = Concatenate()([in_image, li])
fe = Conv2D(128, (3,3), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(merge)
fe = LeakyReLU(alpha=0.2)(fe)
fe = BatchNormalization(axis=-1)(fe)
fe = Conv2D(128, (3,3), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(fe)
fe = LeakyReLU(alpha=0.2)(fe)
fe = BatchNormalization(axis=-1)(fe)
fe = Flatten()(fe)
fe = Dropout(0.4)(fe)
out_layer = Dense(1, activation='sigmoid')(fe)
model = Model([in_image, in_label], out_layer, name="discriminator")
opt = Adam(lr=0.0002, beta_1=0.5)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
return model
def define_gan(g_model, d_model):
g_model.trainable = True
d_model.trainable = False
gen_noise, gen_label = g_model.input
gen_output = g_model.output
gan_output = d_model([gen_output, gen_label])
model = Model([gen_noise, gen_label], gan_output, name="gan")
opt = Adam(lr=0.0002, beta_1=0.5)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics='accuracy')
return model
以下是不同迭代的结果/图像。 16个正方形是16 不同的潜在向量种子。
【问题讨论】:
-
尝试从编译中删除准确性。这是使用人脸的 keras 的 DCGAN 示例,keras.io/examples/generative/dcgan_overriding_train_step。
-
感谢您的回复...我会按照您说的尝试。
标签: python deep-learning generative-adversarial-network