一、在Colab上完成迁移学习
1. 关键步骤截图
下载并加载数据集,数据文件夹包括train,valid,训练集含有dogs,cats文件,图片分别被放在这两个文件夹下表示对图片正确结果的标注。
对图像进行预处理,将图片从中心裁剪成(224 imes 224 imes 3)的大小(3代表RGB三个通道),统一图像尺寸,并且将图像按给定均值和方差做归一化处理。
从网上下载预训练好的VGG16model,设置 required_grad=False冻结前面层的参数,使得在训练时只训练最后一层。同时在深度学习中,冻结其他层,只训练某一层可以避免梯度消失。
设置VGG最后的全连接层4096-2,对应输出的猫和狗两类,再加上softmax输出层。
2. 想法和解读
代码解读
#定义格式
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
#定义格式
vgg_format = transforms.Compose([
transforms.CenterCrop(224),
transforms.ToTensor(),
normalize,
])
data_dir = './dogscats'
#读取数据
dsets = {x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format)
for x in ['train', 'valid']}
#获取大小
dset_sizes = {x: len(dsets[x]) for x in ['train', 'valid']}
#对象化
dset_classes = dsets['train'].classes
修改的部分代码如下
主要是对数据的提取做了改动
def test_model(model,dataloader,size):
model.eval()
#初始化变量
predictions = np.zeros(size)
all_classes = np.zeros(size)
all_proba = np.zeros((size,2))
i = 0
running_loss = 0.0
running_corrects = 0
meici_shuzu=[0,1,2,3,4]
total_cishu=0
for inputs,classes in dataloader:
print("num:",inputs)#获得inputs格式,进行分解
#将数据放入GPU
inputs = inputs.to(device)
classes = classes.to(device)
#放入模型,获取结果
outputs = model(inputs)
#计算损失值
loss = criterion(outputs,classes)
_,preds = torch.max(outputs.data,1)
#以下是修改的代码
print("
preds:",preds)#输出观察preds结构,发现是张量
for shushu2 in range(0,5):#构造编号,后期发现其
#实只需要调用test的图片名就好了
meici_shuzu[shushu2]=shushu2+total_cishu
#将preds用numpy转换成数组类型,便于储存
dataframe=pd.DataFrame({'num':meici_shuzu,'result':preds.numpy()})
#循环写入
dataframe.to_csv("test.csv",index=False,mode='a',sep=",")
total_cishu=total_cishu+5
在进行写入数据的时候,要注意图片在colab的排序方式,并按照对应的格式输出数据
二、在AI研习社提交代码评测
- 从AI研习社下载测试数据集至本地,共2000张图片
- 上传测试集至colab
- 使用神经网络分析并生成结果集,保存至本地
- 在AI研习社平台提交测试结果
(PS:由于时间稍微有点紧张,我们会继续优化算法并更新博客)