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__()方法返回數據集的總長度。
模板如下:
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(加載數據的時候使用幾個子進程),返回一個可迭代對象。
詳細有關參數見博客: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
以上我們可以直接用(其他的只能通過自己自定義數據集),示例如下:
torchvision.models
torchvision提供了訓練好的模型,可以加載后直接使用(見下面代碼),或者在進行遷移學習torchvision.models模塊的子模塊中包含以下模型結構:
- AlexNet
- VGG
- ResNet
- SqueezeNet
- DenseNet
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對象。
詳細有關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為例。
詳細參數見博客: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机器学习/深度学习代码笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内免备案主机(免备案主机哪里好)
- 下一篇: 深度学习Pytorch--梯度与反向传播