日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch 构建神经网络模型总结

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch 构建神经网络模型总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 1、pytorch的數據類型
        • 2、自動微分功能
        • 3、定義網絡模型結構
        • 3.1 定義模型結構
        • 3.2 定義優化器(通過它來改變模型參數)
        • 3.3 定義損失函數(通過它來計算損失,并且計算負反饋的梯度)
        • 4、循環訓練神經網絡
      • 幾個重點理解的地方
        • 5.1 關于RNN的輸入
        • 5.2 關于回歸的效果影響

1、pytorch的數據類型

pytorch的數據都要使用叫tensor的類型,這個類型的數據應該是為pytorch量身打造的,為后面能夠自動微分打下基礎,所有的數據類型都應該轉化為tensor這個類型

2、自動微分功能

自動微分是為了解決機器學習的反饋問題,非常方便,自動微分要配合損失函數和優化器使用

3、定義網絡模型結構

定義需要的網絡模型結構,要繼承,要定義forward函數

3.1 定義模型結構

3.2 定義優化器(通過它來改變模型參數)

3.3 定義損失函數(通過它來計算損失,并且計算負反饋的梯度)

4、循環訓練神經網絡

import torch from torch import nn from torch.autograd import Variable import numpy as np import matplotlib.pyplot as plt#設定種子 保證隨機數的產生在程序每次執行時都一樣 torch.manual_seed(1)#---------------- 定義一個RNN 網絡模型 -------------------- class My_RNN(nn.Module):def __init__(self):super(My_RNN,self).__init__()# 建立一個基礎的RNN網絡層self.rnn = nn.RNN(input_size= 1, # 輸入向量的特征維數hidden_size=8, # 中間隱藏層節點數num_layers= 1, # 隱藏層數nonlinearity= 'relu', # 非線性激活函數bias= True, # 是否有偏置項batch_first= True, # 輸入數據的格式 (batch_size,step_size,feature_dimension)dropout= 0.1, # 隨機丟失系數 ,防止過擬合bidirectional= False #)# 建立輸出層self.out = nn.Linear(self.rnn.hidden_size,1) #輸出層把RNN層的32維輸出轉化為一維輸出# 前向傳遞函數,這個函數必須寫def forward(self,x,state):""":param x: (batch, time_step, input_size):param state: (n_layers, batch, hidden_size):return: (batch, time_step, output_size)""" out,state = self.rnn(x,state) #中間層運算out = self.out(out) #輸出層運算return out, statedef train_rnn(self,data_input, data_output, epochs=1, step_size=1, state=None):""":param data_input: 輸入數據一個numpy數組序列:param data_output: 輸出數據一個numpy數組序列:param epochs: 訓練數據上跑的遍數:param step_size: 時間步長:param state: RNN神經網絡的中間狀態:return:"""# ------- 產生一個優化器對象 -------------------optimizer = torch.optim.Adam(rnn.parameters(), lr=0.02)# ---------產生一個損失函數對象 ------------------loss_func = nn.MSELoss()for epoch in range(epochs):steps = np.int(np.floor(data_input.shape[0] / step_size))for step in range(np.int(steps)):train_data_in = data_input[step * step_size:(step + 1) * step_size].reshape(1, step_size, 1) #訓練數據必須滿足(batch_size,Step_size,featur_num)格式train_data_in = Variable(torch.from_numpy(train_data_in)) # 包裝訓練數據train_data_out = data_output[step * step_size:(step + 1) * step_size]# 前向計算網絡輸出prediction, state = self.forward(train_data_in, state) state = Variable(state.data) # 包裝state,下一次循環接著用# 計算誤差,做負反饋prediction = prediction.reshape(step_size, )train_data_out = torch.from_numpy(train_data_out).reshape(step_size, )loss = loss_func(prediction, train_data_out) # 計算誤差optimizer.zero_grad() # clear gradients for this training steploss.backward() # backpropagation, compute gradientsoptimizer.step() # apply gradients 更新參數# -------------繪圖--------------------if step == 1: # 每個epoch繪制一次,每個epoch的第一次step繪制plt.plot(np.linspace(0, step_size, step_size, dtype=int), train_data_out.flatten(), 'r-')plt.plot(np.linspace(0, step_size, step_size, dtype=int), prediction.data.numpy().flatten(), 'b-')plt.show()# -------------------產生訓練數據--------------- steps = np.linspace(0*np.pi,50*np.pi,500,dtype=np.float32) A = np.linspace(2000,0,500,dtype=np.float32) data_input = np.sin(steps) * A + np.cos(2*steps) * (0.5 * A) data_output = np.cos(steps) * A + np.sin(5*steps) * (0.5 * A) ## #-------------------產生測試數據,從訓練數據里面選 -------------------- # test_steps = np.linspace(0*np.pi,5*np.pi,100,dtype=np.float32)data_input_test = data_input[100:200].reshape(1,100,1) data_input_test = torch.from_numpy(data_input_test)data_output_test = data_output[100:200]# ------- 產生一個RNN模型的對象 ----------------- rnn = My_RNN() print(rnn)# -------------開始訓練 -------------------- rnn.train_rnn(data_input,data_output,20,10)# -----------利用訓練模型產生預測結果------------ state = None #中間隱藏層狀態 可以初始化為None Pre,state = rnn(data_input_test,state)#把預測結果畫出來 plt.plot(test_steps,data_input_test.flatten(),'g') #輸入數據 plt.plot(test_steps,data_output_test.flatten(),'r-') #輸出真實數據 plt.plot(test_steps,Pre.data.numpy().flatten(),'b-') #輸出預測數據 plt.show()

幾個重點理解的地方

5.1 關于RNN的輸入

RNN的輸入是一個三維的數據,第一維和第二維可以互換,分別表示計算批次大小batch_size或者時間步長step_size,第三維必須是數據的特征維,另外RNN的輸入除了這種方式之外,也可以是一種打包好的數據格式,利用pytorch函數

torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False, enforce_sorted=True)

這個函數跑一下就就理解了,它是針對輸入的step_size大小不一樣而作的計算優化

tensor_in = torch.FloatTensor([[1,2,3],[1,0,0]]).resize_(2,3,1) tensor_in = Variable(tensor_in) print(tensor_in) print(tensor_in.shape)seq_lengths = [3, 3] pack = nn_utils.rnn.pack_padded_sequence(tensor_in,seq_lengths,batch_first=True) print(pack)a = torch.randn((30,1)).reshape(2,5,3) print(a)


對于RNN的中間狀態輸入,初始狀態給一個None

5.2 關于回歸的效果影響

網絡層數影響很大
節點數影響也較大
簡單的回歸問題,網絡層數不要太高,節點數也不要太多

總結

以上是生活随笔為你收集整理的pytorch 构建神经网络模型总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。