有時候我們訓練了乙個模型, 希望儲存它下次直接使用,不需要下次再花時間去訓練 ,本節我們來講解一下pytorch快速搭建神經網路及其儲存提取方法詳解
一、pytorch快速搭建神經網路方法
先看實驗**:
import torch
import torch.nn.functional as f
# 方法1,通過定義乙個net類來建立神經網路
class net(torch.nn.module):
dewww.cppcns.comf __init__(self, n_feature, n_hidden, n_output):
super(net, self).__init__()
self.hidden = torch.nn.linear(n_feat程式設計客棧ure, n_hidden)
self.predict = torch.nn.linear(n_hidden, n_output)
def forward(self, x):
x = f.relu(self.hidden(x))
x = self.predict(x)
return x
net1 = net(2, 10, 2)
print('方法1:\n', net1)
# 方法2 通過torch.nn.sequential快速建立神經網路結構
net2 = torch.nn.sequential(
torch.nn.linear(2, 10),
torch.nn.relu(),
torch.nn.linear(10, 2),
) print('方法2:\n', net2)
# 經驗證,兩種方法構建的神經網路功能相同,結構細節稍有不同
'''''
方法1:
net (
(hidden): linear (2 -> 10)
(predict): linear (10 -> 2)
) 方法2:
sequential (
(0): linear (2 -> 10)
(1): relu ()
(2): linear (10 -> 2)
) '''
先前學習了通過定義乙個net類來構建神經網路的方法,classnet中首先通過super函式繼承torch.nn.module模組的構造方法,再通過新增屬性的方式搭建神經網路各層的結構資訊,在forward方法中完善神經網路各層之間的連線資訊,然後再通過定義net類物件的方式完成對神經網路結構的構建。
構建神經網路的另乙個方法,也可以說是快速構建方法,就是通過torch.nn.sequential,直接完成對神經網路的建立。
兩種方法構建得到的神經網路結構完全相同,都可以通過print函式來列印輸出網路資訊,不過列印結果會有些許不同。
二、pytorch的神經網路儲存和提取
在學習和研究深度學習的時候,當我們通過一定時間的訓練,得到了乙個比較好的模型的時候,我們當然希望將這個模型及模型引數儲存下來,以備後用,所以神經網路的儲存和模型引數提取過載是很有必要的。
首先,我們需要在需要儲存網路結構及其模型引數的神經網路的定義、訓練部分之後通過torch.s**e()實現對網路結構和模型引數的儲存。有兩種儲存方式:一是儲存年整個神經網路的的結構資訊和模型引數資訊,s**e的物件是網路net;二是只儲存神經網路的訓練模型引數,s**e的物件是net.state_dict(),儲存結果都以.pkl檔案形式儲存。
對應程式設計客棧上面兩種儲存方式,過載方式也有兩種。對應第一種完整網路結構資訊,過載的時候通過torch.load(『.pkl')直接初始化新的神經網路物件即可。對應第二種只儲存模型引數資訊,需要首先搭建相同的神經網路結構,通過net.load_state_dict(torch.load('.pkl'))完成模型引數的過載。在網路比較大的時候,第一種方法會花費較多的時間。
**實現:
import torch
from torch.autograd import variable
import matplotlib.pyplot as plt
torch.manual_seed(1) # 設定隨機數種子
# 建立資料
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size())
x, y = variable(x, requires_grad=false), variable(y, requires_grad=false)
# 將待儲存的神經網路定義在乙個函式中
def s**e():
# 神經網路結構
net1 = torch.nn.sequential(
torch.nn.linear(1, 10),
torch.nn.relu(),
torch.nn.linear(10, 1),
) optimizer = torch.optim.sgd(net1.parameters(), lr=0.5)
loss_function = torch.nn.mseloss()
# 訓練部分
for i in range(300):
prediction = net1(x)
loss = loss_function(prediction, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 繪圖部分
plt.figure(1, figsize=(10, 3))
plt.subplot(131)
plt.title('net1')
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
# 儲存神經網路
torch.s**e(net1, '7-net.pkl') # 儲存整個神經網路的結構和模型引數
torch.s**e(net1.state_dict(), '7-net_params.pkl') # 只儲存神經網路的模型引數
# 載入整個神經網路的結構及其模型引數
def reload_net():
net2 = torch.load('7-net')
prediction = net2(x)
plt.subplot(132)
plt.title('net2')
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
# 只載入神經網路的模型引數,神經網路的結構需要與儲存的神經網路相同的結構
def reload_params():
# 首先搭建相同的神經網路結構
net3 = torch.nn.sequential(
torch.nn.linear(1, 10),
torch.nn.relu
torch.nn.linear(10, 1),
) # 載入神經網路的模型引數
net3.load_state_dict(torch.load('7-net_params.pkl'))
prediction = net3(x)
plt.subplot(133)
plt.title('net3')
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
# 執行測試
s**e()
reload_net()
reload_params()
實驗結果:
本文標題: pytorch快速搭建神經網路及其儲存提取方法詳解
本文位址:
pytorch 快速搭建神經網路
另一種搭建神經網路的方法,並不定義類 快速搭建乙個神經網路模組 net2 torch.nn.sequential 在這個括號裡面一層一層的壘神經元就好了 torch.nn.linear 2,10 如果中間有激勵函式,也加進來 torch.nn.relu torch.nn.linear 10,2 等同...
pytorch搭建神經網路入門
autograd自動求導 pytorch 是乙個基於python的科學計算包,用於代替numpy,可以利用gpu的效能進行計算 作為乙個深度學習平台。張量 tensor 類似於numpy中的ndarray,但還可以在gpu上使用,實現加速計算的效果。建立張量的幾種方式 建立乙個沒有初始化的矩陣張量 ...
pytorch搭建簡單的神經網路
主要是熟悉pytorch這個開源框架。這個網路主要是用來擬合y x 2這個函式用的 所以說很簡單啦 自己生成的訓練資料,全部用來做訓練集了。網路結構 乙個輸入的向量,一層隱藏層,一層輸出層。隱藏層用的relu啟用函式,輸出層什麼都沒加,直接線性輸出。from torch.autograd impor...