wordpress+论坛+注册,seo百度seo排名优化软件,邢台网站制作哪里做,讯美 深圳网站建设数据预处理部分#xff1a;
数据增强#xff1a;torchvision中transforms模块自带功能#xff0c;比较实用数据预处理#xff1a;torchvision中transforms也帮我们实现好了#xff0c;直接调用即可DataLoader模块直接读取batch数据
网络模块设置#xff1a;
加载预训练…数据预处理部分
数据增强torchvision中transforms模块自带功能比较实用数据预处理torchvision中transforms也帮我们实现好了直接调用即可DataLoader模块直接读取batch数据
网络模块设置
加载预训练模型torchvision中有很多经典网络架构调用起来十分方便并且可以用人家训练好的权重参数来继续训练也就是所谓的迁移学习需要注意的是别人训练好的任务跟咱们的可不是完全一样需要把最后的head层改一改一般也就是最后的全连接层改成咱们自己的任务训练时可以全部重头训练也可以只训练最后咱们任务的层因为前几层都是做特征提取的本质任务目标是一致的
网络模型保存与测试
模型保存的时候可以带有选择性例如在验证集中如果当前效果好则保存读取模型进行实际测试
data_transforms {train: transforms.Compose([transforms.Resize([96, 96]),transforms.RandomRotation(45),#随机旋转-45到45度之间随机选transforms.CenterCrop(64),#从中心开始裁剪transforms.RandomHorizontalFlip(p0.5),#随机水平翻转 选择一个概率概率transforms.RandomVerticalFlip(p0.5),#随机垂直翻转transforms.ColorJitter(brightness0.2, contrast0.1, saturation0.1, hue0.1),#参数1为亮度参数2为对比度参数3为饱和度参数4为色相transforms.RandomGrayscale(p0.025),#概率转换成灰度率3通道就是RGBtransforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])#均值标准差]),valid: transforms.Compose([transforms.Resize([64, 64]),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
}选择性的权重更新
def set_parameter_requires_grad(model, feature_extracting):if feature_extracting:for param in model.parameters():param.requires_grad False自定义修改模型输出层,以resnet18为例
def initialize_model(model_name, num_classes, feature_extract, use_pretrainedTrue):model_ft models.resnet18(pretraineduse_pretrained)set_parameter_requires_grad(model_ft, feature_extract)num_ftrs model_ft.fc.in_featuresmodel_ft.fc nn.Linear(num_ftrs, 102)#类别数自己根据自己任务来input_size 64#输入大小根据自己配置来return model_ft, input_size训练权重 选择
model_ft, input_size initialize_model(model_name, 102, feature_extract, use_pretrainedTrue)#GPU还是CPU计算
model_ft model_ft.to(device)# 模型保存名字自己起
filenamecheckpoint.pth# 是否训练所有层
params_to_update model_ft.parameters()
print(Params to learn:)
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)
else:for name,param in model_ft.named_parameters():if param.requires_grad True:print(\t,name)基本训练代码
def train_model(model, dataloaders, criterion, optimizer, num_epochs25,filenamebest.pt):#咱们要算时间的since time.time()#也要记录最好的那一次best_acc 0#模型也得放到你的CPU或者GPUmodel.to(device)#训练过程中打印一堆损失和指标val_acc_history []train_acc_history []train_losses []valid_losses []#学习率LRs [optimizer.param_groups[0][lr]]#最好的那次模型后续会变的先初始化best_model_wts copy.deepcopy(model.state_dict())#一个个epoch来遍历for epoch in range(num_epochs):print(Epoch {}/{}.format(epoch, num_epochs - 1))print(- * 10)# 训练和验证for phase in [train, valid]:if phase train:model.train() # 训练else:model.eval() # 验证running_loss 0.0running_corrects 0# 把数据都取个遍for inputs, labels in dataloaders[phase]:inputs inputs.to(device)#放到你的CPU或GPUlabels labels.to(device)# 清零optimizer.zero_grad()# 只有训练的时候计算和更新梯度outputs model(inputs)loss criterion(outputs, labels)_, preds torch.max(outputs, 1)# 训练阶段更新权重if phase train:loss.backward()optimizer.step()# 计算损失running_loss loss.item() * inputs.size(0)#0表示batch那个维度running_corrects torch.sum(preds labels.data)#预测结果最大的和真实值是否一致epoch_loss running_loss / len(dataloaders[phase].dataset)#算平均epoch_acc running_corrects.double() / len(dataloaders[phase].dataset)time_elapsed time.time() - since#一个epoch我浪费了多少时间print(Time elapsed {:.0f}m {:.0f}s.format(time_elapsed // 60, time_elapsed % 60))print({} Loss: {:.4f} Acc: {:.4f}.format(phase, epoch_loss, epoch_acc))# 得到最好那次的模型if phase valid and epoch_acc best_acc:best_acc epoch_accbest_model_wts copy.deepcopy(model.state_dict())state {state_dict: model.state_dict(),#字典里key就是各层的名字值就是训练好的权重best_acc: best_acc,optimizer : optimizer.state_dict(),}torch.save(state, filename)if phase valid:val_acc_history.append(epoch_acc)valid_losses.append(epoch_loss)#scheduler.step(epoch_loss)#学习率衰减if phase train:train_acc_history.append(epoch_acc)train_losses.append(epoch_loss)print(Optimizer learning rate : {:.7f}.format(optimizer.param_groups[0][lr]))LRs.append(optimizer.param_groups[0][lr])print()scheduler.step()#学习率衰减time_elapsed time.time() - sinceprint(Training complete in {:.0f}m {:.0f}s.format(time_elapsed // 60, time_elapsed % 60))print(Best val Acc: {:4f}.format(best_acc))# 训练完后用最好的一次当做模型最终的结果,等着一会测试model.load_state_dict(best_model_wts)return model, val_acc_history, train_acc_history, valid_losses, train_losses, LRs 调用训练
model_ft, val_acc_history, train_acc_history, valid_losses, train_losses, LRs train_model(model_ft, dataloaders, criterion, optimizer_ft, num_epochs20)def im_convert(tensor): 展示数据image tensor.to(cpu).clone().detach()image image.numpy().squeeze()image image.transpose(1,2,0)image image * np.array((0.229, 0.224, 0.225)) np.array((0.485, 0.456, 0.406))image image.clip(0, 1)return image