在学习猫狗二分类问题时,我主要参考的是这篇博客:http://t.csdn.cn/J7L0n
然后数据集下载的是:Dogs vs. Cats | Kaggle
下载的数据集一共有25000张,这里采用CPU训练速度非常慢,25000张图片训练一次要4h,所以我们仅选取了200张dog,200张cat用来train,200张dog,200张cat作为test。(从原数据集的train中复制出自己的训练集)。
数据集结构如下:
- data1
- train
- cat(200)
- dog(200)
- test
- cat(200)
- dog(200)
- train
需要注意的是在以下代码中,train和test下必须要分类!
文件:data1
文件:dogs-vs-cats-迁移学习vgg16-train-small
import torch
import torchvision
from torchvision import datasets,transforms,models
import os
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable
import time
path='data1'
transform=transforms.Compose([
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5],[0.5, 0.5, 0.5])
])
data_image={
x:datasets.ImageFolder(root=os.path.join(path,x),
transform=transform)
for x in ["train","test"]
}
data_loader_image={
x:torch.utils.data.DataLoader(dataset=data_image[x],
batch_size=4,
shuffle=True)
for x in ["train","test"]
}
use_gpu=torch.cuda.is_available()
print(use_gpu)
classes=data_image["train"].classes #按文件夹名字分类
classes_index=data_image["train"].class_to_idx #文件夹类名所对应的链值
print(classes)
print(classes_index)
print("train data set:",len(data_image["train"]))
print("test data set:",len(data_image["test"]))
x_train,y_train=next(iter(data_loader_image["train"]))
mean=[0.5, 0.5, 0.5]
std=[0.5, 0.5, 0.5]
img=torchvision.utils.make_grid(x_train)
img=img.numpy().transpose((1,2,0))
img=img*std+mean
print([classes[i] for i in y_train])
plt.imshow(img)
plt.show()
#选择预训练好的模型vgg16
model=models.vgg16(pretrained=True)
print(model)
for parma in model.parameters():
parma.requires_grad=False #预训练的网络不进行梯度更新
#改变模型的全连接层,从原模型的1000个类到本项目的2个类
model.classifier=torch.nn.Sequ