先跑一遍代码再说。理解一下基本的套路。
1.数据预处理(transforms.Compose函数包含图像数据预处理的方法)
#数据预处理的方
data_transforms = {
'train': transforms.Compose([
transforms.Scale(230),
transforms.CenterCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
]),
'test': transforms.Compose([
transforms.Scale(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
]),
}
#230 是自适应的缩小到大边长巍峨230的大小;
#224 是采用居中裁减的方式224*224;
#随机水平旋转
#转换从tensor变量
2.数据关联
使用函数datasets.ImageFolder(),第一个参数为数据集的文件夹路径、第二个参数为数据集的预处理方式,也就是上面的;
使用torch.utils.data.DataLoader()来加载数据。
data_directory = 'data'
trainset = datasets.ImageFolder(os.path.join(data_directory, 'train'), data_transforms['train'])
testset = datasets.ImageFolder(os.path.join(data_directory, 'test'), data_transforms['test'])
trainloader = torch.utils.data.DataLoader(trainset, batch_size=5,shuffle=True, num_workers=4)
testloader = torch.utils.data.DataLoader(testset, batch_size=5,shuffle=True, num_workers=4)
3.加载alexnex
第一句代表加载经过imagenet数据集训练后的参数
alexnet = models.alexnet(pretrained=True)
for param in alexnet.parameters():
param.requires_grad = False
alexnet.classifier=nn.Sequential(
nn.Dropout(),
nn.Linear(256*6*6,4096),
nn.ReLU(inplace =True),
nn.Dropout(),
nn.Linear(4096,4096),
nn.ReLU(inplace=True),
nn.Linear(4096,2),)
# 加载经过数据集训练后的数据
# 将参数 re......设置为 False可以限制这些参数更新,便于下面的重新定义,这样就
# 保证只是更新下面定义的内容
# 将最后的输出改成2层
4.看一下alexnet的网络架构
主要分为 features 和classifier ,一个负责卷积,一个负责分类。(注意这里我应经将最后的输出改成2类了)要知道怎么改这个网络参数。
5.训练加测试
6.将结果显示
95%