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