购物网站后台管理模板,淘宝客商品推广网站建设,惠州专业做网站公司,网上做图赚钱的网站图像预处理
1.需要将图像Resize到相同大小输入到卷积网络中 2.翻转、裁剪、色彩偏移等操作 3.转化为Tensor数据格式 4.对RGB三种颜色通道进行标准化
data_transforms {train: transforms.Compose([transforms.Resize([96, 96]),transforms.RandomRotation(45),#随机旋转 {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])]),
}读取数据
将训练集中各个类别文件夹中的数据经过Transforms增强后进行统一读取封装
image_datasets {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in [train, valid]}batch_size 128image_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_sizebatch_size, shuffleTrue) for x in [train, valid]}
dataset_sizes {x: len(image_datasets[x]) 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 Falsemodel_ft models.resnet18()#18层的能快点条件好点的也可以选152
model_ft修改输出层
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)优化器设置
optimizer_ft optim.Adam(params_to_update, lr1e-2)#要训练啥参数你来定
scheduler optim.lr_scheduler.StepLR(optimizer_ft, step_size10, gamma0.1)#学习率每7个epoch衰减成原来的1/10
criterion nn.CrossEntropyLoss()训练策略
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