基于Pytorch全连接神经网络实现多分类
(一)計算機視覺工具包的介紹? ? ? ?
為了方便開發(fā)者應用,PyTorch專門開發(fā)了一個視覺工具包torchvision,主要包含以下三個部分:
1.models
? ? ? ?models提供了深度學習中各種經(jīng)典的神經(jīng)網(wǎng)絡及預訓練模型,包括AlexNet、VGG系列、ResNet系列、Inception系列等。例如下面的代碼實現(xiàn)了加載預訓練模型ResNet34(如果不存在就會自動下載),預訓練模型保存在/.torch/models/下。對加載的預訓練模型,讀者可以根據(jù)自己的喜歡更改。
from torchvision import models from torch import nn # 加載預訓練模型 resnet34 = models.resnet34(pretrained=True, num_classes=1000) # 修改最后的全連接層改為100分類問題,(默認ImageNet上的1000分類) resnet34.fc = nn.Linear(512, 100)2.datasets
? ? ? ?datasets提供常用的數(shù)據(jù)集,數(shù)據(jù)集在設計上繼承torch.utils.data.Dataset,主要包括MNIST、CIFAR10/100、ImageNet、COCO等。
from torchvision import datasets # 指定數(shù)據(jù)集路徑為data,如果數(shù)據(jù)集不存在則自動下載 train_dataset = datasets.MNIST(root='./data', train=True, transform=data_tf, download=True) test_dataset = datasets.MNIST(root='./data', train=True, transform=data_tf)3.transforms
? ? ? ? transforms提供常用的圖像處理的函數(shù),主要有Tensor及PIL Image(PIL:Python Image Library, Python圖像庫)對象的操作。
?對Tensor的有:
(1)Normalize():標準化(減去均值后,除以標準化)
(2)ToPILImage():將Tensor對象轉(zhuǎn)換為PIL Image對象
對PIL Image有:
(1)Scale()調(diào)整圖像的尺寸,長寬比保持不變
(2)CenterCrop()、RandomCrop()、RandomResizedCrop():裁剪圖片
(3)Pad():填充圖片
(4)ToTensor:將PIL Image對象轉(zhuǎn)化為Tensor對象,會自動的將[0,255]歸一化到[0,1]
如果需要進行多個操作,可以通過Compose()函數(shù)將這些操作拼接起來,起類似于nn.Sequential()函數(shù),注意這些函數(shù)以函數(shù)的形式存在真正使用要調(diào)用它的_call_方法,這點類似于nn.Module()函數(shù)
Compose()函數(shù)示例代碼如下:
from torchvision import transforms as Ttransform = T.Compose([T.Resize(128), # 縮放圖像,保持長寬比不變,最短邊長度為128T.CenterCrop(128), # 從圖片中間切出128*128的圖片T.toTensor(),T.Normalize(mean=[.8, .8, .8], std=[.8, .8, .8]) ])二、全連接神經(jīng)網(wǎng)絡實現(xiàn)多分類
from torchvision import models from torch import nn from torchvision import datasetsclass simpleNet(nn.Module): # 定義一個最簡單的三層全連接神經(jīng)網(wǎng)絡,每一層都是線性的def __init__(self, in_dim, n_hidden_1, n_hiddle_2, out_dim):super(simpleNet,self).__init__()self.layer1 = nn.Linear(in_dim, n_hidden_1)self.layer2 = nn.Linear(n_hidden_1, n_hiddle_2)self.layer3 = nn.Linear(n_hiddle_2, out_dim)def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)return x """改進一下simpleNet網(wǎng)絡,添加激勵函數(shù),增強網(wǎng)絡的非線性,將新網(wǎng)絡命名為Activation_Net。激勵函數(shù)的選擇有很多,這里選擇RELU()函數(shù) """ class Activation_Net(nn.Module):# 在上面的simpleNet網(wǎng)絡的基礎上,在每層的輸出部分添加激勵函數(shù)def __init__(self, in_dim, n_hiddle_1, n_hiddle_2, out_dim):super(Activation_Net, self).__init__()# 下部分代碼(除了輸出層)的輸出部分都添加了激勵函數(shù),最后還用了nn.Sequential()函數(shù),這個函數(shù)將# nn.Linear()函數(shù)和nn.ReLU()函數(shù)組合到一起作為self。layer。注意輸出層不能有激勵函數(shù),因為輸出結(jié)果表示實際的預測值self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hiddle_1), nn.ReLU(True))self.layer2 = nn.Sequential(nn.Linear(n_hiddle_1, n_hiddle_2), nn.ReLU(True))self.layer3 = nn.Sequential(nn.Linear(n_hiddle_2, out_dim))def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)return x """最后我們還需要增加一個加快收斂速度的函數(shù)——即為批標準化函數(shù),將新網(wǎng)絡命名為Batch_Net,對于批處理同樣使用nn.Sequential()函數(shù),將nn.BatchNormld()函數(shù)組合進了網(wǎng)絡中,注意,批標準化函數(shù)一般放在激勵函數(shù)的前面 """ class Batch_Net(nn.Module):def __init__(self, in_dim, n_hiddle_1, n_hiddle_2, out_dim):super(Batch_Net, self).__init__()self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hiddle_1), nn.BatchNorm1d(n_hiddle_1), nn.ReLU(True))self.layer2 = nn.Sequential(nn.Linear(n_hiddle_1, n_hiddle_2), nn.BatchNorm1d(n_hiddle_2), nn.ReLU(True))self.layer3 = nn.Sequential(nn.Linear(n_hiddle_2, out_dim))def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)return x?
總結(jié)
以上是生活随笔為你收集整理的基于Pytorch全连接神经网络实现多分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSA算法实现数字签名--java实现
- 下一篇: ffmpeg的IO操作