PyTorch快速搭建神經網路及其儲存提取方法詳解

2022-09-27 11:06:11 字數 4112 閱讀 9546

有時候我們訓練了乙個模型, 希望儲存它下次直接使用,不需要下次再花時間去訓練 ,本節我們來講解一下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...