最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch繪制并顯示loss曲線和acc曲線,LeNet5識別圖像準確率

 更新時間:2020年01月02日 15:00:58   作者:Zaria_z  
今天小編就為大家分享一篇pytorch繪制并顯示loss曲線和acc曲線,LeNet5識別圖像準確率,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我用的是Anaconda3 ,用spyder編寫pytorch的代碼,在Anaconda3中新建了一個pytorch的虛擬環(huán)境(虛擬環(huán)境的名字就叫pytorch)。

以下內(nèi)容僅供參考哦~~

1.首先打開Anaconda Prompt,然后輸入activate pytorch,進入pytorch.

2.輸入pip install tensorboardX,安裝完成后,輸入python,用from tensorboardX import SummaryWriter檢驗是否安裝成功。如下圖所示:

3.安裝完成之后,先給大家看一下我的文件夾,如下圖:

假設用LeNet5框架識別圖像的準確率,LeNet.py代碼如下:

import torch
import torch.nn as nn
from torchsummary import summary
from torch.autograd import Variable
import torch.nn.functional as F
 
class LeNet5(nn.Module): #定義網(wǎng)絡 pytorch定義網(wǎng)絡有很多方式,推薦以下方式,結(jié)構(gòu)清晰 
 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()線性結(jié)構(gòu),輸入輸出維度均為一維,故需要把數(shù)據(jù)拉為一維  
  #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)))

示網(wǎng)絡結(jié)構(gòu)如下圖:

訓練代碼(LeNet_train_test.py)如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Jan 2 15:53:33 2019
@author: Administrator
"""
 
import torch
import torch.nn as nn
import os
import numpy as np
import matplotlib.pyplot as plt
from torchvision import datasets,transforms
import torchvision
import LeNet
from torch import optim
import time
from torch.optim import lr_scheduler
from tensorboardX import SummaryWriter
 
 
writer = SummaryWriter('LeNet5')
data_transforms = {
  'train':transforms.Compose([
    #transforms.Resize(56),
    transforms.RandomResizedCrop(32),#
    transforms.RandomHorizontalFlip(),#已給定的概率隨即水平翻轉(zhuǎn)給定的PIL圖像
    transforms.ToTensor(),#將圖片轉(zhuǎn)換為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 data
inputs,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(參數(shù)梯度為零)
    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()

最終的二分類結(jié)果為:

樣本圖像是pytorch官網(wǎng)中介紹遷移學習時用到的,螞蟻與蜜蜂的二分類圖像,圖像大小不一。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數(shù)據(jù)集的loss和acc曲線,同理測試數(shù)據(jù)集亦是如此。

好啦,下面開始顯示loss和acc:

1.打開Anaconda Prompt,再次進入pytorch虛擬環(huán)境,

2.輸入tensorboard --logdir=C:\Users\Administrator\.spyder-py3\python\pytorch\LeNet\LeNet5\1,紅色部分是來自上圖文件夾的根目錄,按回車鍵,會出現(xiàn)tensorboard的版本和一個網(wǎng)址,總體顯示效果如下圖:

復制網(wǎng)址到瀏覽器中,在此處是復制:http://8AEYUVZ5PNOFCBX:6006 到瀏覽器中,

最終結(jié)果如下圖:

好啦,以上就是如何顯示loss曲線和acc曲線以及LeNet5模型建立及訓練的過程啦。

如果,文中有哪些地方描述的不恰當,請大家批評指正,不喜歡也不要噴我,好不好~~~

以上這篇pytorch繪制并顯示loss曲線和acc曲線,LeNet5識別圖像準確率就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python 調(diào)用c語言函數(shù)的方法

    python 調(diào)用c語言函數(shù)的方法

    本篇文章主要介紹了python 調(diào)用c語言函數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • python實現(xiàn)簡單的tcp 文件下載

    python實現(xiàn)簡單的tcp 文件下載

    這篇文章主要介紹了python如何實現(xiàn)簡單的tcp文件下載,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-09-09
  • Python實現(xiàn)PS濾鏡碎片特效功能示例

    Python實現(xiàn)PS濾鏡碎片特效功能示例

    這篇文章主要介紹了Python實現(xiàn)PS濾鏡碎片特效功能,結(jié)合實例形式分析了Python實現(xiàn)PS濾鏡碎片效果的具體步驟與相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python實現(xiàn)按照指定要求逆序輸出一個數(shù)字的方法

    Python實現(xiàn)按照指定要求逆序輸出一個數(shù)字的方法

    這篇文章主要介紹了Python實現(xiàn)按照指定要求逆序輸出一個數(shù)字的方法,涉及Python針對字符串的遍歷、判斷、輸出等相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • python之如何進行去重問題

    python之如何進行去重問題

    這篇文章主要介紹了python之如何進行去重問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python如何讀取、寫入CSV數(shù)據(jù)

    Python如何讀取、寫入CSV數(shù)據(jù)

    這篇文章主要介紹了Python如何讀寫CSV數(shù)據(jù),文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Python使用Matplotlib繪制3D圣誕樹

    Python使用Matplotlib繪制3D圣誕樹

    這篇文章主要為大家詳細介紹了Python如何使用Matplotlib繪制3D圣誕樹,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • Python GUI程序類寫法與Label介紹

    Python GUI程序類寫法與Label介紹

    這篇文章主要介紹了Python GUI程序類寫法與Label介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • Django之路由層的實現(xiàn)

    Django之路由層的實現(xiàn)

    這篇文章主要介紹了Django之路由層的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Django框架自定義session處理操作示例

    Django框架自定義session處理操作示例

    這篇文章主要介紹了Django框架自定義session處理操作,結(jié)合實例形式分析了Django框架session操作的原理以及基于session的登陸、驗證等相關操作技巧,需要的朋友可以參考下
    2019-05-05

最新評論

成安县| 亳州市| 巴里| 克东县| 梧州市| 内乡县| 阳信县| 信宜市| 防城港市| 历史| 洪雅县| 始兴县| 云浮市| 肇庆市| 开鲁县| 浦县| 鹤岗市| 山阳县| 三原县| 孝昌县| 建阳市| 华阴市| 乌拉特中旗| 洪湖市| 宣城市| 澄迈县| 临城县| 南雄市| 科尔| 肇源县| 安化县| 达日县| 镶黄旗| 岳阳县| 依安县| 广丰县| 南投市| 合山市| 昌都县| 名山县| 工布江达县|