一、torch基础知识
1、torch安装
pytorch cuda版本下载地址:https://download.pytorch.org/whl/torch_stable.html
其中先看官网安装torch需要的cuda版本,之后安装cuda版本,之后采用pip 下载对应的torch的gpu版本whl来进行安装。使用pip安装时如果是conda需要切换到对应的env下。
2.torch.nn.functional中有很多功能。什么时候用nn.Module,什么时候用nn.functional。一般参数情况下有学习参数使用nn.Module,其他情况用nn.functional相对更简单一些。
3、一般模型在训练时会使用model.train,这样会正常使用Batch Normalization和Dropout,
测试时一般选择model.eval(),这样就不使用Batch Normalization和Dropout
4、对于tensor,维度0表示纵轴,维度1表示横轴。
5、nn.Sequential是表示按照序列进行层运算。
6、加载预训练模型,torchvision中有很多经典网络架构,调用起来十分方便,并且可用人家训练好的权重参数来继续训练,也就是所谓的迁移学习。
需要注意的是别人训练好的任务跟咱们得可不是完全一样,需要把最后head层改一改,一般也就是最后的全连接层,改成咱们自己的任务;
训练时可以全部重头训练,也可以只训练最后任务层;
网络保存可以有选择性,选择验证集中效果最好的。
7、from torchvision import transforms, models, datasets
8、transforms.Compose([
transforms.Resize([96,96]),
transforms.RandomRotation(45),
transforms.RandomRotation(45),#随机旋转,-45到45
transforms.CenterCrop(64),
transforms.HorizontalFilp,RandomVerticalFlip,ColorJitter
ToTensor, Normalize
]),
归一化:x减u除以标准差
9、model name
feature_extract = True都用人家的特征,先不更新。
model_ft = models.resnet18()
最后AdaptiveAvgPool2d(output_size=(1,1))
in_features=512, out_features=1000,bias=True
def set_parameter_requires_grad(model, feature_extracting)
if feature_extracting:
for param in model.parameters()#name, param in model.named_parameters()
param.requires_grad = False
model_ft = model.resnet18(pretrained=use_pretrained)
num_f = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_f, 102)
model_ft, input_size=initialize_model(model_name,102,feature_extract, use_pretrained=True)
#保存模型就是保存graph、parameter
filename='model.ft'
if feature_extract:
params_to_update = []
for name, param in model_ft.named_parameters():
if param.requires_grad == True:
params_to_update.append(param)
print("\t",name)
optimizer_ft = optim.Adam(params_to_update, lr=1e-2)#将需要更新的参数传进来,这里只更新最后的fc层
scheduler = optim.lr_scheduler.StepLR(optimizer_ft, step_size=10, gamma=0.1
#学习率每迭代10个epoch衰减原来的1/10
criterion = nn.CrossEntropyLoss()
def train_model(model, dataloaders, criterion, optimizer, num_epoch=25,
filename="best.pt")
best_acc = 0 #模型保存最好的
device = 'cuda:0'
LRs = [optimizer.param_groups[0]['lr']]
best_model_wts = copy.deepcopy(model.state_dict())
for inputs, labels in dataloader[phase]:
optimizer.zero_grad()
#只有训练的时候计算和更新梯度
outputs = model(inputs)
loss = criterion(outputs, labels)
_, preds = torch.max(outputs, 1)
if phase == 'train':
loss.backward()
optimizer.step()
runing_loss += loss.item()
runing_crrets += torch.sum(preds == labels.data)
epoch_loss = running_loss/len(dataloader[phase].dataset)
if phase == 'valid' and epoch_acc>best_acc:
state = {
'state_dict' :model.state_dict(),
'best_acc': best_acc,
'optimizer':optimizer.state_dict(),
}
LRs.append(optimizer.param_groups[0]['lr'])
scheduler.step()
model.load_state_dict(best_model_wts)
return model, val_acc_history, train_acc_history
10、训练对比
resnet18,只冻住FC层,则性能36%
resnet18,全部训练,则性能
for param in model_ft.parameters():
param.requires_grad = True
checkpoint = torch.load(filename)
model_ft.load_state_dict(checkpoint['state_dict'])
测试数据预处理:
测试数据处理方法要跟训练时一致才可以
crop操作目的保证输入大小一致
标准化也是必须得,使用训练相同的mean和std
最后颜色通道是一个维度,很多工具包都不一样,需要转换
PIL工具包,from PIL import image
fig = plt.figure(figsize=(20,20))
11、数据集制作
(6) 将写好的Dataset进行实例化,并实例化dataloader
五、工具使用jupyter
1、获取jupyter 对应kernel
import sys
sys.executable
2、为jupyter添加新的kernel,将conda通过source activate fuyao1切换到对应的环境,之后
python -m ipykernel install --user --name fuyao1
3、在jupyter中使用from argparse import SUPPRESS, ArgumentParser
args = cls._parser.parse_args(args=[]) 需要在括号中添加args=[]
cls._model_parser.add_argument(
"--save",
type=str,
default="/tmp/share",
help="save path for model or inference results, not required for resuming " "experiment.",
) 在对应位置添加默认内容default即可。