torch
网络构建 经典操作
1. 数据预处理
#提取图片
image_dataset=atasets.ImageFolder(path, transforms) #从文件取一类图片 可以选者数据增强 ,
transform.compose([ ]) # 可以选择多种增强方式
#加载图片
torch.utils.data.DataLoader( image_dataset, batch_size=batch_size, shuffle=True)
#读取图片的标签
with open(' ','r') as f:
class_names=json.load(f)
2. 模型加载
model_ft = model.resnet18(pretrain=True) #使用预训练权重
冻结 网络
for param in model_ft.parameters():
param.requirr_grad=False
#加载自己的全连接层,
model_ft.fc= nn. Linear(model_ft.fc.in_features, class_num) 类别自己来
3. 模型编译
#找出要权重更新的参数
paramrs_to_update = []
for name, param in model_ft.named_paramters():
if param.requires_grad==True:
params_to_updata.append(param)
optimizer_ft = optim.Adam(params_to_update)
scheduler = optim.lr_scheduler.Steplr(optimize_ft,step_size=10)
criterion = nn.CrossEntropyLoss( )
4. 模型训练
model_ft.train()
# 把数据都取个遍
for inputs, labels in dataloaders['train']:
''''
dataiter = iter(dataloaders['valid'])
images, labels = dataiter.next()
output = model_ft(images.cuda()) 也可用迭代器取数据
''''
inputs = inputs.to(device)#放到你的CPU或GPU
optimizer.zero_grad() # 先梯度清零 torch 的bug 只有训练的时候计算和更新梯度,注意权重都还在
outputs = model(inputs)
loss = criterion(outputs,labels)
loss.backward() #反向传播
optimizer.stet() # 权值更新
#迭代一次
scheduler.step()#学习率衰减
5. 模型保存
state = {
'state_dict': model.state_dict(),#字典里key就是各层的名字,值就是训练好的权重
'best_acc': best_acc,
'optimizer' : optimizer.state_dict(),
}
torch.save(state, filename)
6. 模型加载
#1.加载模型文件
chechpoint=torch.load(filenema)
#2.权重更新
model.load_state_dict(checkpoit)
checkpoint # 可以为字典
eg:
如上 可以保存跟多东西
但是加载 只能加载 model.state_dict()
eg model.load_state_dict(checkpoint['state_dict'])
7. 模型预测
model.eval()
preds = model(inputs)