我正在研究条件 GAN,我的生成器和鉴别器都有两个输入,并使用如下合并模型:-
z = Input(shape=(100,))
temp = Input(shape=(384,))
generator=Generator()
img = generator([z,temp])
valid = discriminator([img,temp])
combined = Model([z,temp], valid)
combined.compile(loss='binary_crossentropy', optimizer=optimizer)
DCGAN 被用于分类和生成以“临时”嵌入为条件的图像,我对这两个模型都使用了 Adam“optimizer = Adam(0.0001, 0.5)”。
GEN 就像输入噪声“z”和“temp”合并它们并制作 128x128x3 图像。Disc 拍摄图像并对其执行 conv2d,然后将“temp”重塑为 1,128,3 并合并两者,进一步应用 conv2d 并输出一个 sigmoid 单元。我的问题是,在反向传播期间,合并模型的权重如何更新,让我们在这里说一下 Disc:-
inp1 = Input(shape=(128,128,3),name='inp1')
inp2 = Input(shape=(384,),name='inp2')
d2=Reshape(target_shape=(1,128,3))(inp2)
d1 = Conv2D(16, kernel_size=5, strides=2, padding="same")(inp1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(32, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(64, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(128, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(256, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1=Flatten()(d1)
d1=Dense(768, activation="relu")(d1)
d1=Reshape(target_shape=(2,128,3))(d1)
output=concatenate(
[
d1,
d2,
]
,axis=1
)
d1 = Conv2D(64, kernel_size=5, strides=2, padding="same")(output)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(128, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1 = Conv2D(256, kernel_size=5, strides=2, padding="same")(inp1)
d1=BatchNormalization(momentum=0.8)(d1)
d1=LeakyReLU(alpha=0.2)(d1)
d1=Dropout(0.25)(d1)
d1=Flatten()(d1)
output=Dense(1,activation='sigmoid')(d1)
model=Model(
inputs=[
inp1,
inp2
],
outputs=[
output
]
)
model.summary()
img = Input(shape=(128,128,3))
text=Input(shape=(384,))
validity = model([img,text])
return Model([img,text], validity)
我的磁盘损失从 2.02 开始,在 150 个时期内下降到 6.7 左右,Gen 的损失在 150 个时期内从 0.80 下降到 0.00024,我得到了垃圾,我该如何改进我的架构?我想知道也许反向传播在合并模型中效果不佳,因为它变得非常复杂。我正在使用 batchnorm、leaky relu、conv2d + stride,但没有池化层和标签平滑。