【实战】轻轻松松使用StyleGAN(四):对StyleGAN的逆向网络的训练过程进行优化

本文分享了如何优化StyleGAN逆向网络的训练过程,通过调整batch_size、引入回调函数如EarlyStopping、ModelCheckpoint和ReduceLROnPlateau,将accuracy从0.8933提升到0.9501。讨论了不同batch_size对训练的影响,并引用Yan LeCun的观点建议batch_size不超过32。
摘要由CSDN通过智能技术生成

前面我们介绍了如何构造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 目录
                
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值