关于超参数调优及迁移学习的一些见解

2023-11-02

前言

最近看了一本书《TensorFlow 实战google深度学习框架》,其中里面的在第6章中的6.5.2这个小结中,里面有这样的一个代码(具体我就不贴了),总之就是先通过图片数据输入成一个.npy文件,然后通过这个npy文件来输入到模型中。其实这种方法可以针对一些特别小型的数据集,比如只有几千张图片或者是一些文本数据,但是中大型的数据集不行了。
试想一个场景,假如模型的输入大小是(299,299,3),将其转为numpy的float数据,一个float是4字节,那4x299x299x3=1027812个字节,大概就是1M大小,而例子中有大约4000张照片,大概就占了4g内存,而且由于python或者别的一些程序占用,我按照例子发现永远会报内存错误。
我觉得这个例子很不好,所以想通过这个例子来实现自己的方法后,做了一些超参数调优的一些总结

一、数据预处理

1、图片数据预处理,通过opencv或者框架自带的方法读取图片,并做归一化处理(除以255)
2、一个批次一个批次的读入数据,而不是将数据一口气读进来(会爆内存)
3、mini batch的训练方法的batch_size根据32、64、128这种增幅来(一般就这三个,太大了会容易爆内存且训练缓慢)
4、mini batch的batch_size越大,梯度下降震荡约小,但是计算代价越大,batch_size越小则反之

二、关于学习率

1、初始学习率选0.001,epochs选30,根据每一个epochs ,损失值的下降情况调整学习率
2、loss没有下降或者到达一个比例之后不再下降,说明模型错误或者是学习率太大,可以10倍的调整,如0.001调为0.01
3、loss下降太慢,可以加大学习率

三、关于dropout

1、在迁移学习中,Dropout非常重要,我们通常是根据imagenet来做视觉上的迁移,这份数据集的种类及数量非常多,说明框架学习到的特征也非常多,所以要调加dropout丢弃一些特征防止过拟合
2、dropout通常在fc层调加,数值在0.3-0.8之间,我通常选0.5然后根据模型去调整
3、dropout比例太大,loss达到一定数值后不再收敛,那么要调小比例,dropout太小,对过拟合没太多影响
4、dropout的比例还是根据框架的文档来调整,如inception v3 的dropout是0.8,还是要参考别人的超参数去调整

四、关于权重正则化

1、L1正则化使weights更趋向于0,L2正则化使weights更趋向一个小一点的数值,这意味着L1比L2更容易将模型学到的特征忽略,通常用L2去调整。也是在fc成去调加
2、正则化系数通常选0.001,然后根据模型去调整,也是10倍数去调整
3、系数太大,参数不容易收敛,系数太小没有太多影响,和dropout的数值同理
4、dropout和l2在同一层上别混用,不然会很难训练模型

五、keras的数据增强–图像生成

有时数据量太小,是非常非常难调整合适的超参数的,因此图片有种非常好的方式是数据增强,意思就是通过图片的旋转变换等来人工扩充一些数据集,一下是keras的实现代码片段。更加详细可以去参阅一些文档。

# 训练集上做数据增强
train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, 
                                   shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest')
# 测试集和验证集不做,因为没什么意义
test_datagen = ImageDataGenerator(rescale=1./255)
# 自动从文件夹读取批次和生成图片
train_generator = train_datagen.flow_from_directory(train_dir, target_size=(299, 299), batch_size=32, class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(validation_dir, target_size=(299, 299), batch_size=32, class_mode='categorical')
test_generator = test_datagen.flow_from_directory(test_dir, target_size=(299, 299), batch_size=32, class_mode='categorical')

总结

开头的文章中的例子通过一些玄学调参,可以达到90%左右的正确率,我将代码放在我的github https://github.com/Wangzg123/KerasDeepLearningDemo 上,可以去查阅看看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于超参数调优及迁移学习的一些见解 的相关文章

随机推荐