使用VGG模型进行猫狗大战(基于Colab)
导入要使用的相关包,判断是否存在GPU设备: 下载相关猫和狗的数据,训练集包含1800张图(猫的图片900张,狗的图片900张),测试集包含2000张图: 使用 torchvision 对数据进行复杂的预处理和变换,整理图片成 224×224×3 的大小,并进行归一化处理。使用数据处理的包datasets,它可以以多线程(multi-thread)的形式从硬盘中读取数据,使用 mini-batch 的形式,在网络训练中向 GPU 输送。 查看 dsets 的一些属性,0代表猫,1代表狗,训练集和测试集的图片数量也可得到: 使用torch.utils.data.DataLoader 对数据进行 batch 的划分。数据加载器结合了数据集和取样器,并且可以提供多个线程处理数据集。在训练模型时使用到此函数,用来把训练数据分成多个小组 ,此函数每次抛出一组数据 。直至把所有的数据都抛出。就是做一个数据的初始化。 显示图片的小程序: 显示 labels_try 的5张图片,即valid里第一个batch的5张图片: 创建VGG Model torchvision 中集成了很多在 ImageNet 上预训练好的通用的CNN模型,可以直接使用预训练好的VGG模型,再下载ImageNet 1000 个类的 JSON 文件,目的是展示 VGG 模型对本数据的预测结果: 对输入的5个图片利用VGG模型进行预测,同时,使用softmax对结果进行处理,发现识别结果是比较准确的。 修改最后一层,冻结前面层的参数,把最后的 nn.Linear 层由1000类,替换为2类。为了在训练中冻结前面层的参数,需要设置 required_grad=False。这样,反向传播训练梯度时,前面层的权重就不会自动更新了。训练中,只会更新最后一层的参数。
训练并测试全连接层 创建损失函数和优化器、训练模型、测试模型。 测试模型: 查看可视化模型预测结果: 方式可分为以下几种:随机查看一些预测正确的图片;随机查看一些预测错误的图片;预测正确,同时具有较大的probability的图片;预测错误,同时具有较大的probability的图片;最不确定的图片,比如说预测概率接近0.5的图片等,下面随机输出一些预测正确的几例: 在AI研习社网站下载数据进行猫狗大战: 导入相关包,下载并解压猫狗文件: 注意这里下载的文件是rar文件,不同于上面实验的zip文件,使用unrar命令进行解压。 下载成后我们发现图片文件是杂乱的,我们需要将训练集和测试集进行猫狗分类: 分类后的文件目录如下: 进行数据预处理:
并创建VGG模型
之后进行训练并测试全连接层等步骤同上: 我们发现准确率达到了94.79%。 test部分类似,为便于后续ImageFolder读取,可以生成一个raw文件夹存放原图片集;文件下再生成一个新的文件夹:
import os
import random
import shutil
def cover_files(source_dir, target_ir):
for file in os.listdir(source_dir):
source_file = os.path.join(source_dir, file)
if os.path.isfile(source_file):
shutil.copy(source_file, target_ir)
def ensure_dir_exists(dir_name):
"""Makes sure the folder exists on disk.
Args:
dir_name: Path string to the folder we want to create.
"""
if not os.path.exists(dir_name):
os.makedirs(dir_name)
def moveFile(file_dir, save_dir):
ensure_dir_exists(save_dir)
path_dir = os.listdir(file_dir)
filenumber = len(path_dir)
rate = 1
picknumber = int(filenumber * rate)
sample = random.sample(path_dir, picknumber)
for name in sample:
shutil.move(file_dir+'/'+name, save_dir+'/'+name)
if __name__ == '__main__':
file_dir = '/content/drive/MyDrive/cat_dog/test'
save_dir = '/content/drive/MyDrive/cat_dog/raw'
moveFile(file_dir,save_dir)
最后进行结果预测并输出CSV文件:
def result_model(model,dataloader,size):
model.eval()
predictions=np.zeros((size,2),dtype='int')
i = 0
for inputs,classes in dataloader:
inputs = inputs.to(device)
outputs = model(inputs)
_,preds = torch.max(outputs.data,1)
predictions[i:i+len(classes),1] = preds.to('cpu').numpy();
predictions[i:i+len(classes),0] = np.linspace(i,i+len(classes)-1,len(classes))
print(predictions[i:i+len(classes),:])
i += len(classes)
print('creating: No. ', i, ' process ... total: ', size)
return predictions
result = result_model(model_vgg_new,loader_valid,size=dset_sizes['test'])
np.savetxt("./cat_dog/result.csv",result,fmt="%d",delimiter=",")
将CSV文件导入AI研习社进行提交查看结果:
实验感想: 本次实验我练习了VGG模型构建及训练方法,通过猫狗大战实践了VGG模型的构建、训练、测试等;第一部分的练习可以说是初次尝试,根据教程思考代码的意义,为后续的AI研习社的练习打下了基础,这部分没有遇到什么问题。在进入研习社的练习后,主要遇到了两个问题,第一个是猫狗文件中的图片是未经过分类的图片,需要先将未分组的图片分到两个文件夹中,另一个问题就是最后导出csv文件时,在test文件下需要先在目录下新建一个文件夹,将图片导入,才能将测试集输出csv文件。可以说本次实验的完成经历了很多波折,最终能够得到结果是令人欣慰的,在以后的学习中我还应继续学习相关知识,当遇到问题时可以更快地解决问题,提高自己的深度学习能力!
|