pytorch三層全連接層實現(xiàn)手寫字母識別方式
先用最簡單的三層全連接神經(jīng)網(wǎng)絡(luò),然后添加激活層查看實驗結(jié)果,最后加上批標(biāo)準(zhǔn)化驗證是否有效
首先根據(jù)已有的模板定義網(wǎng)絡(luò)結(jié)構(gòu)SimpleNet,命名為net.py
import torch from torch.autograd import Variable import numpy as np import matplotlib.pyplot as plt from torch import nn,optim from torch.utils.data import DataLoader from torchvision import datasets,transforms #定義三層全連接神經(jīng)網(wǎng)絡(luò) class simpleNet(nn.Module): def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):#輸入維度,第一層的神經(jīng)元個數(shù)、第二層的神經(jīng)元個數(shù),以及第三層的神經(jīng)元個數(shù) super(simpleNet,self).__init__() self.layer1=nn.Linear(in_dim,n_hidden_1) self.layer2=nn.Linear(n_hidden_1,n_hidden_2) self.layer3=nn.Linear(n_hidden_2,out_dim) def forward(self,x): x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) return x #添加激活函數(shù) class Activation_Net(nn.Module): def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim): super(NeutalNetwork,self).__init__() self.layer1=nn.Sequential(#Sequential組合結(jié)構(gòu) nn.Linear(in_dim,n_hidden_1),nn.ReLU(True)) self.layer2=nn.Sequential( nn.Linear(n_hidden_1,n_hidden_2),nn.ReLU(True)) self.layer3=nn.Sequential( nn.Linear(n_hidden_2,out_dim)) def forward(self,x): x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) return x #添加批標(biāo)準(zhǔn)化處理模塊,皮標(biāo)準(zhǔn)化放在全連接的后面,非線性的前面 class Batch_Net(nn.Module): def _init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim): super(Batch_net,self).__init__() self.layer1=nn.Sequential(nn.Linear(in_dim,n_hidden_1),nn.BatchNormld(n_hidden_1),nn.ReLU(True)) self.layer2=nn.Sequential(nn.Linear(n_hidden_1,n_hidden_2),nn.BatchNormld(n_hidden_2),nn.ReLU(True)) self.layer3=nn.Sequential(nn.Linear(n_hidden_2,out_dim)) def forword(self,x): x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) return x
訓(xùn)練網(wǎng)絡(luò),
import torch from torch.autograd import Variable import numpy as np import matplotlib.pyplot as plt %matplotlib inline from torch import nn,optim from torch.utils.data import DataLoader from torchvision import datasets,transforms #定義一些超參數(shù) import net batch_size=64 learning_rate=1e-2 num_epoches=20 #預(yù)處理 data_tf=transforms.Compose( [transforms.ToTensor(),transforms.Normalize([0.5],[0.5])])#將圖像轉(zhuǎn)化成tensor,然后繼續(xù)標(biāo)準(zhǔn)化,就是減均值,除以方差 #讀取數(shù)據(jù)集 train_dataset=datasets.MNIST(root='./data',train=True,transform=data_tf,download=True) test_dataset=datasets.MNIST(root='./data',train=False,transform=data_tf) #使用內(nèi)置的函數(shù)導(dǎo)入數(shù)據(jù)集 train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True) test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False) #導(dǎo)入網(wǎng)絡(luò),定義損失函數(shù)和優(yōu)化方法 model=net.simpleNet(28*28,300,100,10) if torch.cuda.is_available():#是否使用cuda加速 model=model.cuda() criterion=nn.CrossEntropyLoss() optimizer=optim.SGD(model.parameters(),lr=learning_rate) import net n_epochs=5 for epoch in range(n_epochs): running_loss=0.0 running_correct=0 print("epoch {}/{}".format(epoch,n_epochs)) print("-"*10) for data in train_loader: img,label=data img=img.view(img.size(0),-1) if torch.cuda.is_available(): img=img.cuda() label=label.cuda() else: img=Variable(img) label=Variable(label) out=model(img)#得到前向傳播的結(jié)果 loss=criterion(out,label)#得到損失函數(shù) print_loss=loss.data.item() optimizer.zero_grad()#歸0梯度 loss.backward()#反向傳播 optimizer.step()#優(yōu)化 running_loss+=loss.item() epoch+=1 if epoch%50==0: print('epoch:{},loss:{:.4f}'.format(epoch,loss.data.item()))
訓(xùn)練的結(jié)果截圖如下:
測試網(wǎng)絡(luò)
#測試網(wǎng)絡(luò) model.eval()#將模型變成測試模式 eval_loss=0 eval_acc=0 for data in test_loader: img,label=data img=img.view(img.size(0),-1)#測試集不需要反向傳播,所以可以在前項傳播的時候釋放內(nèi)存,節(jié)約內(nèi)存空間 if torch.cuda.is_available(): img=Variable(img,volatile=True).cuda() label=Variable(label,volatile=True).cuda() else: img=Variable(img,volatile=True) label=Variable(label,volatile=True) out=model(img) loss=criterion(out,label) eval_loss+=loss.item()*label.size(0) _,pred=torch.max(out,1) num_correct=(pred==label).sum() eval_acc+=num_correct.item() print('test loss:{:.6f},ac:{:.6f}'.format(eval_loss/(len(test_dataset)),eval_acc/(len(test_dataset))))
訓(xùn)練的時候,還可以加入一些dropout,正則化,修改隱藏層神經(jīng)元的個數(shù),增加隱藏層數(shù),可以自己添加。
以上這篇pytorch三層全連接層實現(xiàn)手寫字母識別方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python繪圖并標(biāo)記出指定點(最大值點)方法實例
我們在用python畫散點圖的時候經(jīng)常會需要標(biāo)記出特定的點,這篇文章主要給大家介紹了關(guān)于Python繪圖并標(biāo)記出指定點(最大值點)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05python循環(huán)某一特定列的所有行數(shù)據(jù)(方法示例)
在Python中,處理表格數(shù)據(jù)(比如CSV文件、Excel文件等)時,我們通常會使用pandas庫,因為它提供了豐富的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,下面,我將以處理CSV文件中的某一特定列的所有行數(shù)據(jù)為例,給出詳細、完整的代碼示例,感興趣的朋友跟隨小編一起看看吧2024-08-08學(xué)點簡單的Django之第一個Django程序的實現(xiàn)
這篇文章主要介紹了學(xué)點簡單的Django之第一個Django程序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02淺談tensorflow與pytorch的相互轉(zhuǎn)換
本文主要介紹了簡單介紹一下tensorflow與pytorch的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06關(guān)于Python可視化Dash工具之plotly基本圖形示例詳解
這篇文章主要介紹了關(guān)于Python可視化Dash工具之plotly基本圖形示例詳解,需要的朋友可以參考下2021-03-03pytest多線程與多設(shè)備并發(fā)appium
這篇文章介紹了pytest多線程與多設(shè)備并發(fā)appium,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06Python 實現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子
這篇文章主要介紹了Python 實現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03