第三课 torchvision
torchvision作用:训练数据下载,数据预处理,模型下载
- 数据增强
增加数据量,更高效的利用数据
- 翻转
- 旋转
- 缩放
训练数据
transforms.Compose([
transforms.RandomRotation(45), #随机旋转(-45~45)
transforms.CenterCrop(224), #从中心开始裁剪
transforms.RandomHorizantalFlip(p=0.5), #以一定概率随机水平翻转
transforms.RandomVerticalFlip(p=0.5), #以一定概率随机垂直翻转
transforms.ColorJitter(brightness=0.2,contrast=0.1,satutration=0.1,hue=0.1), #亮度,对比度,饱和度,色相
transforms.RandomGrayscale(p=0.025), #以一定概率转化成灰度图
transforms.ToTensor(),
transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225]) #均值,标准差(由他人计算得到的)
]
)
验证数据
ransforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224), #从中心开始裁剪
transforms.ToTensor(),
transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225]) #均值,标准差(由他人计算得到的)
]
)
可能图片的通道顺序还要改变
(
H
∗
W
∗
C
)
→
(
C
∗
H
∗
W
)
(H*W*C)\rightarrow (C*H*W)
(H∗W∗C)→(C∗H∗W),img=img.transpose((2,0,1))
构建数据集
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'valid']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True) for x in ['train', 'valid']}
class_names = image_datasets['train'].classes
迁移学习
卷积层用于特征提取。全连接层用于分类,所以卷积层可用于迁移学习
例子
# 是否对卷积层参数进行冻结,用于加速网络训练
def set_parameter_requires_grad(model, feature_extracting):
if feature_extracting:
for param in model.parameters():
param.requires_grad = False
model_ft = models.resnet152(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Sequential(nn.Linear(num_ftrs, 102), #重新修改全连接层
nn.LogSoftmax(dim=1))
# 优化器设置
optimizer_ft = optim.Adam(params_to_update, lr=1e-2) #只优化待更新参数
scheduler = optim.lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)#学习率每7个epoch衰减成原来的1/10
#最后一层已经LogSoftmax()了,所以不能nn.CrossEntropyLoss()来计算了,nn.CrossEntropyLoss()相当于logSoftmax()和nn.NLLLoss()整合
criterion = nn.NLLLoss()
# 保存权重
best_moedl_wts = copy.deepcopy(model.state_dict())
Resnet
其中虚线部分会做一个1*1的卷积使特征图翻倍(使用c个卷积核就会得到c个特征图)