目录
1、预处理
由于官方提供的图像的分辨率过大,所以为了计算高效,先将其裁剪为200*200大小的图片,然后进行[black_level, white_level]之间的标准化。
2、神经网络
github上找到restormer网络的源码,修改网络的dim参数,尽量使其保存的参数文件大小接近50M。毕竟参数越多,模型的表示能力越强。
还需要修改forward函数的部分,将输入的x加padding至能整除2的网络深度次方。最后返回也使用切片out[:,:,:h,:w]。
3、数据增强
数据增强仿照SRMNet源码里使用到的数据增强方法,具体有随机水平、垂直翻转,随机裁剪,随机旋转90°、180°、270°。
4、训练细节
1. 使用95%做训练集,5%做验证集。
2. 使用AdamW优化器,(beta1, beta2) = (0.9, 0.999),batch_size = 8,一张图像大小为(4, 192, 192)。
3. 使用ReduceLROnPlateau动态调整学习率,设置初始学习率为1e-4,最小学习率为1e-6,patience = 4,factor = 0.7。
4. 预测时必须以整张图预测,该网络预测时需要32G内存。
5、loss选择
loss函数可选:L1、MSE、Carbonnier Loss、PSNRLoss
由于PSNR是根据MSE计算的,但是直接使用MSE作为损失函数会有优化问题。 所以为了达到更高的PSNR,我先使用L1损失训练42个epoch,然后换MSE一直训练。直到MSE损失也不再降低时,我试图将其更换为Carbonnier Loss或者PSNRLoss,然而结果都没有变得更好。
在loss不再降低时,我试图学习restormer论文中的训练策略,更换不一样大小的图片继续训练,效果提升不明显。
6、小trick
最后一张图片多预测几次可以刷到更高的分。最终分数57.11
github链接:https://github.com/xiaowukongkong/zxpy
7、没来得及用的手段
1. 由于restormer网络耗内存和算力,所以有必要对其使用的transformer块重写,而已经有很多研究表明,在不影响性能的条件下多头自注意力可以被其他网络结构替换,比如BiLSTM、FFN以及其他的子结构。也可以使用结构重参数化来设计多路分支训练,推理时使用等效的一层卷积。若显存受限,可将网络中的BN层换成FRN层,因为其对batch_size不敏感。
2. 数据增强时可以使用cutmix。
3. 训练时可以使用混合精度来增大batch_size,加快训练速度。若网络结构中在子结构中使用到了skip connection,则可以使用随机深度训练。
4. 在loss函数选择时,可以根据官方要求的score的计算方法自己设计loss函数。
文章出处登录后可见!