一篇文章入门深度学习框架PyTorch
生活随笔
收集整理的這篇文章主要介紹了
一篇文章入门深度学习框架PyTorch
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一篇文章入門深度學習框架PyTorch
- 1 Tensor(張量)
- 2 Variable(變量)
- 3 Dataset(數據集)
- 4 nn.Module(模組)
- 5 torch.optim(優化)
- 一階優化算法
- 二階優化算法
- 6 模型的保存和加載
1 Tensor(張量)
- PyTorch里面處理的最基本的操作對象就是Tensor,Tensor表示的是一個多維矩陣,比如零維就是一個點,一維就是向量,二維就是一般的矩陣,多維就相當于一個多維數組
- Tensor和Numpy是對應的,可以和Numpy的ndarray互相轉換,唯一不同的是PyTorch可以再GPU上運行,numpy只能在CPU上運行。
- 常用的不同類型的Tensor:32位浮點型torch.FloatTensor,64位浮點型torch.DoubleTensor,16位整型torch.ShortTensor,32位整型torch.IntTensor,64位整型torch.LongTensor
- 結果
2 Variable(變量)
- Variable是神經網絡計算圖里特有的一個概念,提供了自動求導功能,位于torch.autograd.variable,在Numpy里不存在。神經網絡在做運算的時候,需要先構造一個計算圖譜,在里面進行前向傳播和反向傳播。
- Variable和Tensor本質上沒有區別,不過Variable會被放入一個計算圖中,然后進行前向傳播,反向傳播,自動求導。
- Variable屬性結構圖
- Variable有三個重要的屬性:data,grad,grad_fn。通過data可以取出Variable里面的Tensor數值,grad_fn表示的是得到這個Variable的操作,比如通過加減還是乘除來得到,grad是這個Variable的反向傳播梯度。
- 自動求導是不需要明確哪個函數對哪個函數求導,直接通過一行代碼對所有的需要梯度的變量進行求導。
- 運行結果
- 上面是標量的求導,也可以做矩陣的求導
- 運行結果
3 Dataset(數據集)
- 在處理任何機器學習問題之前都需要數據讀取并進行預處理。torch.utils.data.Dataset是代表這一數據的抽象類,可以自己定義數據類型集成和重寫這個抽象類。
- 通過上面的方式,可以定義需要的數據類,通過迭代的方式取得每一個數據,但是很難實現取batch,shuffle或者多線程取數據,可以通過torch.utils.data.DataLoader
4 nn.Module(模組)
- 在PyTorch里面編寫神經網絡,所有的層結構和損失函數都來自于torch.nn,所有的模型構建都繼承自nn.Module基類。
- 這樣就建立了一個計算圖,并且這個結構可以復用多次,每次調用就相當于用該計算圖定義的相同參數做一次前向傳播,這得益于PyTorch的自動求導功能,所以我們不需要自己編寫反向傳播,而所有的網絡層都由nn這個包得到,如線性層nn.Linear.
- 定義完模型之后,需要通過nn這個包定義損失函數,常見的損失函數有均方誤差、多分類的交叉熵、二分類的交叉熵.
5 torch.optim(優化)
- 在機器學習或者深度學習中,需要通過修改參數使得損失函數最小化或者最大化,優化算法就是一種調整模型參數更新的策略。
一階優化算法
- 一階優化算法使用各個參數的梯度值來更新參數,最常用的一階優化算法是梯度下降。梯度就是導數的多變量表達式,函數的梯度形成了一個向量場,同時也是一個方向,這個方向上的方向導數最大,且等于梯度。梯度下降的功能是通過尋找最小值,控制方差,更新模型參數,最終使模型收斂,網絡的參數更新公式是:
θ=θ?η??J(θ)?θ\theta=\theta-\eta \cdot {{\partial J(\theta)}\over{\partial \theta}} θ=θ?η??θ?J(θ)?
二階優化算法
- 二階優化算法使用了二階導數(也叫做Hessian方法)來最小化和最大化損失函數,主要基于牛頓法。但是由于二階導數計算成本很高,所以這種方法并沒有廣泛使用。
- torch.optim是一個實現各種優化算法的包,大多數常見的算法都能通過這個包來調用,比如隨機梯度下降,以及添加動量的隨機梯度下降,自適應學習率等。在調用的時候將需要優化的參數傳入,這些參數必須是Variable,然后傳入一些基本的設定,如學習率和動量。
6 模型的保存和加載
- 在PyTorch里面使用torch.save來保存模型的結構和參數,有兩種保存方式:
(1)保存整個模型的結構信息和參數信息,保存的對象是Model
# save方法:第一個參數是保存對象,第二個參數是保存路徑及名稱 torch.save(model,'./model.pth')(2)保存模型的參數,保存的對象是模型的狀態:model.state_dict()
# save方法:第一個參數是保存對象,第二個參數是保存路徑及名稱 torch.save(model.state_dict(),'./model_state.pth')- 加載模型有兩種方式,對應于保存模型的方式,map_location=device 更換設備
(1)加載完整的模型結構和參數信息,在網絡較大的時候,加載的時間較長,同時存儲空間較大。
load_model=torch.load(‘model.pth', map_location=device)(2)加載模型參數信息,需要先導入模型的結構,然后加載模型參數
model=YourModelClass() model.load_state_dic(torch.load('model_state.pth', map_location=device)) # -*- coding: utf-8 -*- # Import Package import torch import torch.nn as nn from torchvision import transforms,datasets from torch.utils.data import DataLoader import torch.nn.functional as F import torch.optim as optim# Prepare Dataset batch_size=64 transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,)) ]) train_dataset=datasets.MNIST(root='./dataset/',train=True,download=True,transform=transform ) train_loader=DataLoader(train_dataset,shuffle=True,batch_size=batch_size ) test_dataset=datasets.MNIST(root='./dataset/',train=False,download=True,transform=transform ) test_loader=DataLoader(train_dataset,shuffle=False,batch_size=batch_size )# Design Model class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.l1=nn.Linear(784,512)self.l2=nn.Linear(512,256)self.l3=nn.Linear(256,128)self.l4=nn.Linear(128,64)self.l5=nn.Linear(64,10)def forward(self,x):x=x.view(-1,784)x=F.relu(self.l1(x))x=F.relu(self.l2(x))x=F.relu(self.l3(x))x=F.relu(self.l4(x))return self.l5(x) model=Net()# Construct Loss and Optimizer criterion=nn.CrossEntropyLoss() optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)# Train and Test def train(epoch):running_loss=0.0for batch_idx,data in enumerate(train_loader,0):inputs,target=dataoptimizer.zero_grad()outputs=model(inputs)loss=criterion(outputs,target)loss.backward()optimizer.step()running_loss+=loss.item()if (batch_idx+1)%300==0:print('[%d, %5d] loss: %.3f'%(epoch+1,batch_idx+1,running_loss/300))running_loss=0 def test(test_model):correct=0total=0with torch.no_grad():for data in test_loader:images,labels=dataoutputs=test_model(images)_,predicted=torch.max(outputs.data,dim=1)total+=labels.size(0)correct+=(predicted==labels).sum().item()print("Accuracy on test set: %d %%"%(100*correct/total))for epoch in range(3):train(epoch) # 保存模型(包括模型結構和參數) torch.save(model,'model_structure_parameter.pth')# 加載保存模型(包括模型結構和參數) test_model=torch.load('model_structure_parameter.pth') test(test_model)for epoch in range(3):train(epoch) # 保存模型(包括模型參數) torch.save(model.state_dict(),'model__parameter.pth')# 加載保存模型(包括模型參數) test_model=Net() test_model.load_state_dict(torch.load('model__parameter.pth')) test(test_model)總結
以上是生活随笔為你收集整理的一篇文章入门深度学习框架PyTorch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章理解深度神经网络5个常用激活函数
- 下一篇: 深度学习中多层全连接网络的梯度下降法及其