efficient解析及迁移应用
efficient解析
efficientNet中探索了网络深度宽度以及输入图像分辨率对于卷积神经网络的提升。
增加网络的深度 depth 能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
增加网络的 width 够获得更高细粒度的特征并且也更容易训练,但对于 width 很大而深度较浅的网络往往很难学习到更深层次的特征。
增加输入网络的图像分辨率能够潜在地获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。
计算最佳d,w,r的具体方式可以参考这篇blog
详细的网络结构解析参考这篇blog
efficient迁移完成看画猜作者
该实验的数据集结构和之前猫狗大战的不一样,不能直接用imageFolder方法生成dataset。
如何实现Dataloader自定义数据读取参考这篇blog
同时我们还需要对label及name_lsit文件进行处理并区分训练集和验证集
import numpy
label_path = "/content/gdrive/MyDrive/ML/dataset/Art/train.csv"
#生成classes列表以及label列表,classes列表是no和name的映射表。label是文件名和res的映射
def splitTxt(fp,s=' '):
art_list=dict()
art = open(fp, "r+")
for inf in art.readlines():
inf = str(inf).replace("\n", "")
inf = inf.split(s, 1)
art_list[inf[0]]=inf[1]
art.close()
return art_list
classes = splitTxt("/content/gdrive/MyDrive/ML/dataset/Art/name_list.txt")
label_list = splitTxt(label_path,s=',')
t_list = list(label_list.keys())
t_list = [i+".jpg" for i in t_list]
t_list = [os.path.join("/content/gdrive/MyDrive/ML/dataset/Art/train/",i) for i in t_list ]
train_list = t_list[1:6000] #训练集
valid_list = t_list[6001:] #验证集
print(train_list[:6])
label = list(label_list.values())
num_train = label[1:6000]
num_valid = label[6001:]
接下来我们需要载入模型,对于efficientNet我们可以直接使用pytorch提供的函数,也可以使用其提供的权重。但是在代码过程中,一开始正确率奇低。后来发现可能是因为先修改fc层,然后再载入预训练参数,但实际上没有成功载入,因为参数size是不匹配的。但是如果先load再修改参数,就直接代码报错size不匹配。但上次猫狗使用预训练模型却又95正确率。我增加了一个全连接层,训练了40轮,最后在验证集上的正确率如图所示: