前面我们介绍了如何构造StyleGAN的逆向网络,并通过训练得到一个比较好的模型,并利用这样的模型从目标图像中提取特征码,内容请参考:
https://blog.csdn.net/weixin_41943311/article/details/102370766
在训练过程中,我们使用了一些训练技巧,将accuracy从0.8933最终提升到0.9501,下面简单介绍一下逐步优化的过程:
(1)第一次训练,我们用StyleGAN生成了1200个dlatents以及它们所对应的人脸图片,并记录到文件中,训练时我们从文件中加载数据,并训练lotus模型。由于lotus模型输出的不是目标的分类,而是18x512的张量,因此我们使用mean_squared_error作为损失函数loss,优化器(optimizer)使用的是adam,epochs = 503,batch_size = 6,最后训练得到的accuracy = 0.8933。
model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mae", "acc"])
model.fit(X_train, Y_train, epochs=503, batch_size=6)
(2)第二次,我们将batch_size从6扩大到8。我们用StyleGAN生成了1280个dlatents以及它们所对应的人脸图片,并记录到文件中。我们使用mean_squared_error作为损失函数loss,优化器(optimizer)使用的是adam,epochs = 599,batch_size = 8,最后训练得到的accuracy = 0.9201。
model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mae", "acc"])
model.fit(X_train, Y_train, epochs=599, batch_size=8)
由于我所使用的HP笔记本,配置的是比较低端的NVIDIA GeForce GTX 1060,显存只有6GB,因此当batch_size扩大到9以上时,系统会报告内存不足,因此只能做到batch_size = 8。
按某些人的说法,建议配置显存大小为11GB的GTX 1080 Ti 或者GTX 2080 Ti ,batch_size可以最大开到48。(模型的批量大小不是线性的,显存的很大一部分要用来装载神经网络)
batch_size增加后,会加快模型训练和收敛的速度。但Yan LeCun同志说:
Training with large minibatches is bad for your health. More importantly, it's bad for your test error. Friends don‘t let friends use minibatches larger than 32. Let's face it: the only people have switched to minibatch sizes larger than one since 2012 is because GPUs are inefficient for batch sizes smaller than 32. That's a terrible reason. It just means our hardware sucks.
他的建议是batch_size不要超过32,并且较小的batch_size往往有助于带领算法走出局部最优(鞍点)。
(3)第三次,我们引入了callback(回调函数)。我们仍然使用StyleGAN生成的1280个dlatents以及它们所对应的人脸图片进行训练。
# model.fit()的callbacks函数
# 若发现monitor相比上一个epoch训练没有改进,则经过patience个epoch后停止训练
es = keras.callbacks.EarlyStopping(
monitor='loss',
patience=60,
verbose=0,
mode='auto'
)
# save_best_only=True,只保存在训练集上性能最好的模型,period说明CheckPoint之间的间隔的epoch数
mc = keras.callbacks.ModelCheckpoint(
'resnet50_model_face.h5',
monitor='acc',
verbose=0,
save_best_only=True,
save_weights_only=False,
mode='auto',
period=2
)
# 当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
# factor:每次减少学习率的因子,学习率将以learning_rate = lr*factor的形式被减少
# 学习率减少后,会经过cooldown个epoch才重新进行正常操作
# min_delta:阈值,用来确定是否进入检测值的“平原区”
rp = keras.callbacks.ReduceLROnPlateau(
monitor='loss',
factor=0.30,
patience=20,
verbose=0,
mode='auto',
min_delta=0.0001,
cooldown=0,
min_lr=0
)
# 将运行的结果记录下来,比较吃内存
tb = keras.callbacks.TensorBoard(log_dir='./logs', # log 目录