日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

Pytorch机器学习/深度学习代码笔记

發布時間:2023/12/3 pytorch 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch机器学习/深度学习代码笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼步驟筆記

  • 導入模塊
  • 設置參數
  • 數據預處理
    • 定義數據集
      • 1.Dataset
      • 2.ImageFolder
    • 加載數據集
      • DataLoader
  • torchvision--數據預處理要使用的庫
    • torchvision.datasets
    • torchvision.models
    • torchvision.transforms
  • 訓練網絡參數
    • 訓練前的準備
      • 設置指定的訓練設備(GPU、CPU)
      • 定義損失函數
      • 定義優化器
    • 訓練過程
    • 驗證/測試過程
    • 運行

導入模塊

import torch from tensorboardX import SummaryWriter //可視化

設置參數

batch_size=64 works=4 epochs=20 train_path="train" val_path="val"

數據預處理

流程:先定義數據集,再將定義的數據集導入數據載入器(Dataloader)來讀取數據。

定義數據集有兩種方式,一種是自定義Dataset包裝類,和DataLoader類一樣,它是torch.utils.data的里的一個類,另一種是直接調用ImageFolder函數,它是torchvision.datasets里的函數。

定義數據集

1.Dataset

Dataset是一個抽象類,可以自定義數據集,為了能夠方便的讀取,需要將要使用的數據包裝為Dataset類。
自定義的Dataset需要繼承它并且實現兩個成員方法:
1.__getitem__():該方法定義用索引(0到len(self))獲取一條數據或一個樣本。
2.__len__()方法返回數據集的總長度。
模板如下:

import torch.utils.data #定義一個數據集 class CaptionDataset(Dataset):""" 數據集演示 """def __init__(self,transform=None): """實現初始化方法,在初始化的時候將數據讀載入"""....(包括加載數據路徑)def __getitem__(self):return self....def __len__(self):return len(...)# 實例化這個類,然后我們就得到了Dataset類型的數據,記下來就將這個類傳給DataLoader,就可以了。 train_data= CaptionDataset(transform=transform) #transform需自己定義(見下面torchvision.transforms)

2.ImageFolder

ImageFolder假設所有的文件按文件夾保存,每個文件夾下存儲同一個類別的圖片,文件夾名為類名,其構造函數如下:

import torchvision.datasets ImageFolder(root, transform=None, target_transform=None, loader=default_loader)

各參數含義:

root:在root指定的路徑下尋找圖片

transform:對PIL Image進行的轉換操作,transform的輸入是使用loader讀取圖片的返回對象

target_transform:對label的轉換

loader:給定路徑后如何讀取圖片,默認讀取為RGB格式的PIL Image對象

label:按照文件夾名順序排序后存成字典,即{類名:類序號(從0開始)}

舉例如下:

import torchvision.datasets #此處transform需自己定義(見下面torchvision.transforms),其他參數為默認值 train_data=torchvision.datasets.ImageFolder(root=train_path,transform=transform)

加載數據集

DataLoader

DataLoader是一個數據加載器類,實現了對數據集進行隨機采樣和多輪次迭代的功能。在訓練過程中,可以非常方便地實現多輪次小批量隨機梯度下降訓練。
常用參數有:Dataset數據集實例,batch_size(每個batch的大小,shuffle(是否進行攪亂操作),num_workers(加載數據的時候使用幾個子進程),返回一個可迭代對象。

import torch.utils.data train_loader = torch.utils.data.DataLoader(CaptionDataset(train_data, transform=transform),batch_size=batch_size, shuffle=True, num_workers=workers)

詳細有關參數見博客:PyTorch 中的數據類型 torch.utils.data.DataLoader

torchvision–數據預處理要使用的庫

torchvision是Pytorch中專門用來處理圖像的庫。
提供了常用圖片數據集(datasets);
訓練好的模型(models);
一般的圖像轉換操作類(transforms),

torchvision.datasets

torchvision.datasets可以理解為PyTorch團隊自定義的dataset,這些dataset幫我們提前處理好了很多的圖片數據集,我們拿來就可以直接使用:

  • MNIST
  • COCO
  • Captions
  • Detection
  • LSUN
  • ImageFolder
  • Imagenet-12
  • CIFAR
  • STL10
  • SVHN
  • PhotoTour
    以上我們可以直接用(其他的只能通過自己自定義數據集),示例如下:
import torchvision.datasets as datasets trainset = datasets.MNIST(root='./data', # 表示 MNIST 數據的加載的目錄train=True, # 表示是否加載數據庫的訓練集,false的時候加載測試集download=True, # 表示是否自動下載 MNIST 數據集transform=None) # 表示是否需要對數據進行預處理,none為不進行預處理

torchvision.models

torchvision提供了訓練好的模型,可以加載后直接使用(見下面代碼),或者在進行遷移學習torchvision.models模塊的子模塊中包含以下模型結構:

  • AlexNet
  • VGG
  • ResNet
  • SqueezeNet
  • DenseNet
#導入預訓練模型 import torchvision.models model = torchvision.models.vgg16(pretrained=True) #True代表已經訓練好的模型

torchvision.transforms

transform模塊提供了一般的圖像轉換操作類,用作數據處理和數據增強。
主要提供了對PIL Image對象和Tensor對象的常用操作。

對PIL Image對象的常用操作有:

  • Resize:調整圖片尺寸
  • CenterCrop、RandomCrop、RandomSizedCrop:裁剪圖片
  • Pad:填充
  • ToTensor:將PIL Image對象轉成Tensor,會自動將[0,255]歸一化至[0,1]

對Tensor對象的常用操作有:

  • Normalize:標準化,即減均值,除以標準差
  • ToPILImage:將Tensor轉為PIL Image對象。
import torchvision.transforms as transforms transform = transforms.Compose([transforms.RandomCrop(32, padding=4), #先四周填充0,在把圖像隨機裁剪成32*32transforms.RandomHorizontalFlip(), #圖像一半的概率翻轉,一半的概率不翻轉transforms.RandomRotation((-45,45)), #隨機旋轉transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), #R,G,B每層的歸一化用到的均值和方差 ])

詳細有關transforms的用法見博客:PyTorch 學習筆記(三):transforms的二十二個方法

訓練網絡參數

訓練前的準備

設置指定的訓練設備(GPU、CPU)

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

定義損失函數

torch.nn模塊中定義了很多標準地損失函數。

import torch.nn as nn xentropy=nn.CrossEntropyLoss() #此處定義一個交叉熵損失函數對象,該對象可以調用backward()方法實現誤差反向傳播。

定義優化器

torch.optim模塊提供了很多優化算法類,
比如:torch.optim.SGD,torch.optim.Adam,torch.optim.RMSprop。這里以SGD為例。

#import torch.optim net=CNN().to(device) #使用gpu構造一個CNN對象 optimizer=torch.optim.SGD(params=net.parameters(),lr=0.01,momentum=0.9) #上式參數依次為:需要網絡模型的參數、學習率、動量參數

詳細參數見博客:torch.optim.SGD()各參數的解釋

訓練過程

神經網絡訓練過程的一步迭代包含四個主要步驟:

  • 前向運算,計算給定輸入的預測結果
  • 計算損失函數值
  • 反向傳播(BP),計算參數梯度(計算之前要先梯度清零)
  • 使用梯度下降法更新參數值

詳細代碼如下:

def train(net,optimizer,loss_fn,num_epoch,data_loader,device): '''參數分別為網絡模型、損失函數(對應之前的xentropy)、epoch總次數、數據加載器、訓練設備'''net.train() #進入訓練模型for epoch in range(num_epoch):print('Epoch {}/{}'.format(epoch+1, num_epochs))running_loss=0running_corrects=0for i,data in enumerate(data_loader):inputs=data[0].to(device) #輸入labels=data[1].to(device) #真實值標簽#下面優化過程optimizer.zero_grad() #先把前一步的梯度清除,設置梯度值為0outputs=net(inputs) #前向運算,計算網絡模型在inputs上的輸出outputsloss=loss_fn(outputs,labels) #計算損失函數值loss.backward() #進行反向傳播,計算梯度optimizer.step() #使用優化器的step()方法,進行梯度下降,更新模型參數#可以輸出兩種loss,loss為每次迭代的loss,running_loss為每個epoch的loss,之后再取平均值。running_loss+=loss.item() #計算每個epoch的loss總值_, preds = torch.max(outputs, 1)running_corrects += torch.sum(preds == labels).item()epoch_loss=running__loss/len(train_data) #計算每個epoch的平均lossepoch_acc = running_corrects / len(train_data)print('{} Loss: {:.4f} Acc: {:.4f}'.format('train', epoch_loss, epoch_acc))

驗證/測試過程

測試和驗證集過程不用反向傳播,也不用更新梯度。

def evaluate(net,loss_fn,data_load,device):net.eval() #進入模型評估模式,驗證和測試都是這個running_loss=0correct=0.0total=0for data in data_loader:inputs=data[0].to(device) #輸入labels=data[1].to(device) #真實值標簽with torch.no_grad(): outputs=net(inputs)loss=loss_fn(outputs,labels)running_loss+=loss.item()_,predicted=torch.max(outputs.data,1)total+=labels.size(0) #另一種計算總數的方法correct+=(predicted==labels).sum().item() #計算預測對的數epoch_loss = running_loss/len(val_data)acc=correct/total #計算準確率print('{} Loss: {:.4f} Acc: {:.4f}'.format('valid', epoch_loss, acc))

運行

有兩種方式:

  • 1.設立一個主函數main(),將for epoch in epochs:以及train函數和test函數放到main()里運行就可以了。
  • 2.將for epoch in epochs:和test函數放入train函數,再直接運行train()函數就可以了。
    完整代碼實例:pytorch實現圖像分類代碼實例

總結

以上是生活随笔為你收集整理的Pytorch机器学习/深度学习代码笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。