侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率

Python  /  管理员 发布于 5年前   537

我用的是Anaconda3 ,用spyder编写pytorch的代码,在Anaconda3中新建了一个pytorch的虚拟环境(虚拟环境的名字就叫pytorch)。

以下内容仅供参考哦~~

1.首先打开Anaconda Prompt,然后输入activate pytorch,进入pytorch.

2.输入pip install tensorboardX,安装完成后,输入python,用from tensorboardX import SummaryWriter检验是否安装成功。如下图所示:

3.安装完成之后,先给大家看一下我的文件夹,如下图:

假设用LeNet5框架识别图像的准确率,LeNet.py代码如下:

import torchimport torch.nn as nnfrom torchsummary import summaryfrom torch.autograd import Variableimport torch.nn.functional as F class LeNet5(nn.Module): #定义网络 pytorch定义网络有很多方式,推荐以下方式,结构清晰  def __init__(self):    super(LeNet5,self).__init__()    self.conv1 = nn.Conv2d(3, 6, 5)  self.conv2 = nn.Conv2d(6, 16, 5)  self.fc1 = nn.Linear(16*5*5, 120)  self.fc2 = nn.Linear(120, 84)  self.fc3 = nn.Linear(84, 2) def forward(self,x):   # print(x.size())  x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))  # print(x.size())  x = F.max_pool2d(F.relu(self.conv2(x)), 2)  # print(x.size())   x = x.view(x.size()[0], -1)#全连接层均使用的nn.Linear()线性结构,输入输出维度均为一维,故需要把数据拉为一维    #print(x.size())  x = F.relu(self.fc1(x))   # print(x.size())  x = F.relu(self.fc2(x))  #print(x.size())  x = self.fc3(x)  # print(x.size())  return x net = LeNet5()data_input = Variable(torch.randn(16,3,32,32))print(data_input.size())net(data_input)print(summary(net,(3,32,32)))

示网络结构如下图:

训练代码(LeNet_train_test.py)如下:

# -*- coding: utf-8 -*-"""Created on Wed Jan 2 15:53:33 2019@author: Administrator""" import torchimport torch.nn as nnimport osimport numpy as npimport matplotlib.pyplot as pltfrom torchvision import datasets,transformsimport torchvisionimport LeNetfrom torch import optimimport timefrom torch.optim import lr_schedulerfrom tensorboardX import SummaryWriter  writer = SummaryWriter('LeNet5')data_transforms = {  'train':transforms.Compose([    #transforms.Resize(56),    transforms.RandomResizedCrop(32),#    transforms.RandomHorizontalFlip(),#已给定的概率随即水平翻转给定的PIL图像    transforms.ToTensor(),#将图片转换为Tensor,归一化至[0,1]    transforms.Normalize([0.485,0.456,0.406],[0.229, 0.224, 0.225])#用平均值和标准偏差归一化张量图像    ]),  'val':transforms.Compose([    #transforms.Resize(56),    transforms.CenterCrop(32),    transforms.ToTensor(),    transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])    ]),  }data_dir = 'bees vs ants' #样本文件夹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_size =16,shuffle = True,num_workers = 0)  for x in ['train','val']  }dataset_sizes = {x:len(image_datasets[x]) for x in ['train','val']}class_names = image_datasets['train'].classes device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") def imshow(inp,title = None): #print(inp.size()) 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)#为了让图像更新可以暂停一会 #Get a batch of training datainputs,classes = next(iter(dataloaders['train']))#print(inputs.size())#print(inputs.size())#Make a grid from batch out = torchvision.utils.make_grid(inputs)#print(out.size())imshow(out,title=[class_names[x] for x in classes]) def train_model(model,criterion,optimizer,scheduler,num_epochs = 25): since = time.time()  # best_model_wts = copy.deepcopy(model.state_dict()) best_acc = 0.0   for epoch in range(num_epochs):  print('Epoch {}/{}'.format(epoch,num_epochs - 1))  print('-' * 10)    #Each epoch has a training and validation phase  for phase in ['train','val']:   if phase == 'train':    scheduler.step()    model.train() #Set model to training mode   else:    model.eval()      running_loss = 0.0   running_corrects = 0      #Iterate over data   for inputs,labels in dataloaders[phase]:    inputs = inputs.to(device)    # print(inputs.size())    labels = labels.to(device)    #print(inputs.size())    # print(labels.size())        #zero the parameter gradients(参数梯度为零)    optimizer.zero_grad()        #forward    #track history if only in train    with torch.set_grad_enabled(phase == 'train'):     outputs = model(inputs)     _,preds = torch.max(outputs,1)     loss = criterion(outputs,labels)          #backward + optimize only if in training phase     if phase == 'train':      loss.backward()      optimizer.step()        #statistics    running_loss += loss.item() * inputs.size(0)    running_corrects += torch.sum(preds == labels.data)      if phase == 'train':    epoch_loss = running_loss / dataset_sizes[phase]    epoch_acc = running_corrects.double() / dataset_sizes[phase]    print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase,epoch_loss,epoch_acc))    writer.add_scalar('Train/Loss', epoch_loss,epoch)    writer.add_scalar('Train/Acc',epoch_acc,epoch)   else:    epoch_loss = running_loss / dataset_sizes[phase]    epoch_acc = running_corrects.double() / dataset_sizes[phase]    print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase,epoch_loss,epoch_acc))    writer.add_scalar('Test/Loss', epoch_loss,epoch)    writer.add_scalar('Test/Acc',epoch_acc,epoch)    if epoch_acc > best_acc:     best_acc = epoch_acc    print() writer.close()  time_elapsed = time.time() - since print('Training complete in {:.0f}m {:.0f}s'.format(   time_elapsed // 60 , time_elapsed % 60)) print('Best val Acc: {:4f}'.format(best_acc))  #load best model weights #model.load_state_dict()#best_model_wts) return model  def visualize_model(model,num_images = 6): was_training = model.training model.eval()   images_so_far = 0 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 += 1    ax = plt.subplot(num_images //2,2,images_so_far)    ax.axis('off')    ax.set_title('predicted: {}'.format(class_names[preds[j]]))    imshow(inputs.cpu().data[j])        if images_so_far == num_images:     model.train(mode = was_training)     return     model.train(mode=was_training)  net = LeNet.LeNet5()net = net.to(device) criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(net.parameters(),lr = 0.001,momentum = 0.9)exp_lr_scheduler = lr_scheduler.StepLR(optimizer,step_size = 7,gamma = 0.1) net = train_model(net,criterion,optimizer,exp_lr_scheduler,num_epochs = 25)   #net1 = train_model(net,criterion,optimizer,exp_lr_scheduler,num_epochs = 25)visualize_model(net)  plt.ioff()plt.show()

最终的二分类结果为:

样本图像是pytorch官网中介绍迁移学习时用到的,蚂蚁与蜜蜂的二分类图像,图像大小不一。LeNet5 的输入图像是32*32,所以进行分类时会损失一定的图像像素,导致识别率较低。

下面介绍显示loss和acc曲线,在以上训练代码中,writer = SummaryWriter('LeNet5'),表示在训练过程中会生成LeNet5文件夹,保存loss曲线和acc曲线的文件,如下图:

首先解释一下这个文件夹为什么是1,因为我之前训练了很多次,在LeNet5文件夹下有很多1文件夹中这样的文件,待会用Anaconda Prompt来显示loss和acc的时候,它只识别一个文件,所以我就重新建了一个1文件夹,并将刚刚运行完毕的文件放到文件夹中。在LeNet_train_test.py中, writer.add_scalar('Train/Loss', epoch_loss,epoch)和

writer.add_scalar('Train/Acc',epoch_acc,epoch),这两行代码就是生成train数据集的loss和acc曲线,同理测试数据集亦是如此。

好啦,下面开始显示loss和acc:

1.打开Anaconda Prompt,再次进入pytorch虚拟环境,

2.输入tensorboard --logdir=C:\Users\Administrator\.spyder-py3\python\pytorch\LeNet\LeNet5\1,红色部分是来自上图文件夹的根目录,按回车键,会出现tensorboard的版本和一个网址,总体显示效果如下图:

复制网址到浏览器中,在此处是复制:http://8AEYUVZ5PNOFCBX:6006 到浏览器中,

最终结果如下图:

好啦,以上就是如何显示loss曲线和acc曲线以及LeNet5模型建立及训练的过程啦。

如果,文中有哪些地方描述的不恰当,请大家批评指正,不喜欢也不要喷我,好不好~~~

以上这篇pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    Pytorch训练过程出现nan的解决方式
    下一条:
    基于MSELoss()与CrossEntropyLoss()的区别详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客