1.猫狗大战VGG模型迁移学习
下载数据
猫和狗的图片放在单独的文件夹中。
数据处理
对图片进行预处理
创建VGG Model
使用预训练好的VGG Model,并对 输入的5张图片进行识别
可以看出,识别结果较为准确,这5张图片均正确。
修改最后一层,冻结之前的参数
为了使用预训练好的模型,结合本问题特征,需将nn.linear最后一层的参数改为2,即为2类(cat & dog),同时冻结前面的参数,这样在反向传播时只会更新最后一层的参数,不影响预训练结果。
训练并测试全连接层
准确率很高,达到了96.85%。
可视化模型预测结果
进行随机检测,0代表cat,1代表dog。
将correct的部分进行随机显示,进一步检验模型准确性。
2.CNN实战
迁移学习的不同之处
将数据进行标注
与原作业相比,https://god.yanxishe.com/41 中给出的数据集都是未进行标注的。参考上文中的代码,首先要将给出的数据集中train,val中的cat和dog部分分离,通过python代码实现
test部分类似,为便于后续ImageFolder读取,可以生成一个raw文件夹存放原图片集。
生成csv
与此前通过valid数据集进行验证不同,题目要求的是根据test文件生成对应的分类结果
def test_model1(device,dataloader):
model_vgg_new.eval()
total_preds= []
indexs = []
for i, (inputs,classes)in enumerate(dataloader):
inputs = inputs.to(device)
outputs = model_vgg_new(inputs)
_, preds = torch.max(outputs.data, 1)
sample_fname, _ = dataloader.dataset.samples[i]
index = os.path.split(sample_fname)[1].split('.')[0]
indexs.apend(int(index))
total_preds.append(preds.item())
dictionary = dict(zip(indexs, total_preds))
dictionary = sorted(dictionary.items(),key = lambda item:item[0])
dictionary = dict(dictionary)
with open("./result.csv",'w') as f:
for k,v in dictionary.items():
f.write("{},{}\n".format(k,v))
loader_test = torch.utils.data.DataLoader(dsets['test'],batch_size=1,shuffle=False,num_workers=0)
test_model1(device, loader_test)
提交结果截图
感想
训练的时候虽然用的是预训练模型,但实际训练的时间还是比我想的长。之前的练习使用的数据量比较小,网络结果也比较简单,所以训练得快,但在实际应用中大量数据和较深的网络模型是常见的,所以如何加速模型训练十分重要。在自己写代码的时候,主要碰到两个问题:1. 对如何加载数据不熟悉,我现在才知道使用dataset加载数据,数据集中的数据与文件夹内文件的顺序并不相同,而是以类似于将文件名视为字符串进行排序。当然了,这很合理。2. 不知道该如何调整预训练模型的参数,我是看了别人写的博客才知道该怎么调的。深度学习涉及到的理论非常多,想要把技术问题从头到尾弄明白还是挺难的。有的时候会使用一个模型来解决问题,可对于模型的架构、数据的处理还是缺少理解。