6网站建设做网站,wordpress4.4.1,纯静态网站 维护,在网页做动态图片的网站在深度学习的实际应用中#xff0c;很少会去从头训练一个网络#xff0c;尤其是当没有大量数据的时候。即便拥有大量数据#xff0c;从头训练一个网络也很耗时#xff0c;因为在大数据集上所构建的网络通常模型参数量很大#xff0c;训练成本大。所以在构建深度学习应用时…在深度学习的实际应用中很少会去从头训练一个网络尤其是当没有大量数据的时候。即便拥有大量数据从头训练一个网络也很耗时因为在大数据集上所构建的网络通常模型参数量很大训练成本大。所以在构建深度学习应用时通常会使用预训练模型 需求
训练一个模型来分类蚂蚁ants和蜜蜂bees 步骤
加载数据集编写函数训练并寻找最优模型编写函数查看模型效果使用torchvision微调模型使用tensorboard可视化训练情况 Pytorch保存和加载模型的两种方式
1.完整保存模型、加载模型
torch.save(net, mnist.pth)
net torch.load(mnist.pth, map_locationcpu)
# # Model class must be defined somewhere
load() 默认会将该张量加载到保存时所在的设备上map_location 可以强制加载到指定的设备上 2. 保存、加载模型的状态字典模型中的参数
torch.save(model.state_dict(), PATH)
model TheModelClass(*args, **kwargs)model.load_state_dict(torch.load(PATH)) 迁移学习全过程
1.加载数据集
ants和bees各有约120张训练图片。
每个类有75张验证图片从零开始在 如此小的数据集上进行训练通常是很难泛化的。
由于我们使用迁移学习模型的泛化能力会相当好。
from __future__ import print_function, divisionimport torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import torch.backends.cudnn as cudnn
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy
cudnn.benchmark True
plt.ion()
lr_scheduler学习率调度器用于在训练过程中动态调整学习率
torch.backends.cudnn.benchmark True大部分情况下设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法从而加速运算
plt.ion()这允许你在一个交互式环境中运行matplotlib data_transforms {train: transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),val: transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
}
transforms.RandomResizedCrop(224)随机大小裁剪和缩放图像使得裁剪后的图像尺寸为224x224像素。这个操作有助于模型学习不同尺度和长宽比的图像特征从而提高模型的泛化能力。
transforms.RandomHorizontalFlip()以一定的概率默认为0.5对图像进行水平翻转。这也是一种数据增强技术有助于模型学习对称性
transforms.Resize(256)将图像缩放到256x256像素
transforms.CenterCrop(224)从图像的中心裁剪出224x224像素的区域。这种裁剪方式确保每次裁剪的都是图像的中心部分有助于在验证或测试时获得更一致的结果
data_dir data/hymenoptera_data
image_datasets {x: datasets.ImageFolder(os.path.join(data_dir, x),data_transforms[x])for x in [train, val]}
dataloaders {x: torch.utils.data.DataLoader(image_datasets[x], batch_size4,shuffleTrue, num_workers4)for x in [train, val]}
dataset_sizes {x: len(image_datasets[x]) for x in [train, val]}
class_names image_datasets[train].classesdevice torch.device(cuda:0 if torch.cuda.is_available() else cpu) 可视化数据
def imshow(inp, titleNone): # 可视化一组 Tensor 的图片inp inp.numpy().transpose((1, 2, 0)) mean np.array([0.485, 0.456, 0.406]) std np.array([0.229, 0.224, 0.225]) inp std * inp mean inp np.clip(inp, 0, 1) plt.imshow(inp) if title is not None: plt.title(title) plt.pause(0.001) # 暂停一会儿为了将图片显示出来
# 获取一批训练数据
inputs, classes next(iter(dataloaders[train]))
# 批量制作网格
out torchvision.utils.make_grid(inputs)
imshow(out, title[class_names[x] for x in classes]) 2.编写函数训练并寻找最优模型
def train_model(model, criterion, optimizer, scheduler, num_epochs25): 训练模型并返回在验证集上的最佳模型和准确率 - criterion: 损失函数 Return: - model(nn.Module): 最佳模型 - best_acc(float): 最佳准确率 since time.time()best_model_wts copy.deepcopy(model.state_dict())best_acc 0.0for epoch in range(num_epochs):print(fEpoch {epoch}/{num_epochs - 1})print(- * 10)# 训练集和验证集交替进行前向传播for phase in [train, val]:if phase train:model.train() else:model.eval() running_loss 0.0running_corrects 0# 遍历数据集for inputs, labels in dataloaders[phase]:inputs inputs.to(device)labels labels.to(device)# 清空梯度避免累加了上一次的梯度optimizer.zero_grad()with torch.set_grad_enabled(phase train):# 正向传播outputs model(inputs)_, preds torch.max(outputs, 1)loss criterion(outputs, labels)# 反向传播且仅在训练阶段进行优化if phase train:loss.backward() optimizer.step()# 统计loss、准确率running_loss loss.item() * inputs.size(0)running_corrects torch.sum(preds labels.data)if phase train:scheduler.step()epoch_loss running_loss / dataset_sizes[phase]epoch_acc running_corrects.double() / dataset_sizes[phase]print(f{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f})# 发现了更优的模型记录起来if phase val and epoch_acc best_acc:best_acc epoch_accbest_model_wts copy.deepcopy(model.state_dict())print()time_elapsed time.time() - sinceprint(fTraining complete in {time_elapsed // 60:.0f}m {time_elapsed % 60:.0f}s)print(fBest val Acc: {best_acc:4f})# 加载训练的最好的模型model.load_state_dict(best_model_wts)return model 3.编写函数查看模型效果
def visualize_model(model, num_images6):was_training model.trainingmodel.eval()images_so_far 0fig plt.figure()with torch.no_grad():for i, (inputs, labels) in enumerate(dataloaders[val]):inputs inputs.to(device)labels labels.to(device)outputs model(inputs)_, preds torch.max(outputs, 1)for j in range(inputs.size()[0]):images_so_far 1ax plt.subplot(num_images//2, 2, images_so_far)ax.axis(off)ax.set_title(fpredicted: {class_names[preds[j]]})imshow(inputs.cpu().data[j])if images_so_far num_images:model.train(modewas_training)returnmodel.train(modewas_training) 4.使用torchvision微调模型 加载预训练模型并将最后一个全连接层重置
model models.resnet18(pretrainedTrue) # 加载预训练模型
num_ftrs model.fc.in_features # 获取低级特征维度
model.fc nn.Linear(num_ftrs, 2) # 替换新的输出层
model model.to(device)
criterion nn.CrossEntropyLoss()
# 所有参数都参加训练
optimizer_ft optim.SGD(model.parameters(), lr0.001, momentum0.9)
# 每过 7 个 epoch 将学习率变为原来的 0.1
scheduler optim.lr_scheduler.StepLR(optimizer_ft, step_size7, gamma0.1)
训练
model_ft train_model(model, criterion, optimizer_ft, scheduler, num_epochs3) 预估
visualize_model(model_ft) 5.使用tensorboard可视化训练情况
将以下代码块合理的加入到训练模块里
from torch.utils.tensorboard import SummaryWriter
writer SummaryWriter()
ep_losses, ep_acces [], []ep_losses.append(epoch_loss)
ep_acces.append(epoch_acc.item())writer.add_scalars(loss, {train: ep_losses[-2], val: ep_losses[-1]}, global_stepepoch)
writer.add_scalars(acc, {train: ep_acces[-2], val: ep_acces[-1]}, global_stepepoch)
writer.close()
运行命令启动tensorboard
tensorboard --logdir runs
可以通过执行命令的终端看到tensorboard可视化页面地址且该命令会在执行该命令的目录下生成一个runs文件夹日志文件的保存位置
以下是我训练了25个epochs的acc和loss的动态图