pytorch 构建神经网络模型总结
文章目錄
- 1、pytorch的數(shù)據(jù)類型
- 2、自動微分功能
- 3、定義網(wǎng)絡(luò)模型結(jié)構(gòu)
- 3.1 定義模型結(jié)構(gòu)
- 3.2 定義優(yōu)化器(通過它來改變模型參數(shù))
- 3.3 定義損失函數(shù)(通過它來計算損失,并且計算負(fù)反饋的梯度)
- 4、循環(huán)訓(xùn)練神經(jīng)網(wǎng)絡(luò)
- 幾個重點理解的地方
- 5.1 關(guān)于RNN的輸入
- 5.2 關(guān)于回歸的效果影響
1、pytorch的數(shù)據(jù)類型
pytorch的數(shù)據(jù)都要使用叫tensor的類型,這個類型的數(shù)據(jù)應(yīng)該是為pytorch量身打造的,為后面能夠自動微分打下基礎(chǔ),所有的數(shù)據(jù)類型都應(yīng)該轉(zhuǎn)化為tensor這個類型
2、自動微分功能
自動微分是為了解決機(jī)器學(xué)習(xí)的反饋問題,非常方便,自動微分要配合損失函數(shù)和優(yōu)化器使用
3、定義網(wǎng)絡(luò)模型結(jié)構(gòu)
定義需要的網(wǎng)絡(luò)模型結(jié)構(gòu),要繼承,要定義forward函數(shù)
3.1 定義模型結(jié)構(gòu)
3.2 定義優(yōu)化器(通過它來改變模型參數(shù))
3.3 定義損失函數(shù)(通過它來計算損失,并且計算負(fù)反饋的梯度)
4、循環(huán)訓(xùn)練神經(jīng)網(wǎng)絡(luò)
import torch from torch import nn from torch.autograd import Variable import numpy as np import matplotlib.pyplot as plt#設(shè)定種子 保證隨機(jī)數(shù)的產(chǎn)生在程序每次執(zhí)行時都一樣 torch.manual_seed(1)#---------------- 定義一個RNN 網(wǎng)絡(luò)模型 -------------------- class My_RNN(nn.Module):def __init__(self):super(My_RNN,self).__init__()# 建立一個基礎(chǔ)的RNN網(wǎng)絡(luò)層self.rnn = nn.RNN(input_size= 1, # 輸入向量的特征維數(shù)hidden_size=8, # 中間隱藏層節(jié)點數(shù)num_layers= 1, # 隱藏層數(shù)nonlinearity= 'relu', # 非線性激活函數(shù)bias= True, # 是否有偏置項batch_first= True, # 輸入數(shù)據(jù)的格式 (batch_size,step_size,feature_dimension)dropout= 0.1, # 隨機(jī)丟失系數(shù) ,防止過擬合bidirectional= False #)# 建立輸出層self.out = nn.Linear(self.rnn.hidden_size,1) #輸出層把RNN層的32維輸出轉(zhuǎn)化為一維輸出# 前向傳遞函數(shù),這個函數(shù)必須寫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: 輸入數(shù)據(jù)一個numpy數(shù)組序列:param data_output: 輸出數(shù)據(jù)一個numpy數(shù)組序列:param epochs: 訓(xùn)練數(shù)據(jù)上跑的遍數(shù):param step_size: 時間步長:param state: RNN神經(jīng)網(wǎng)絡(luò)的中間狀態(tài):return:"""# ------- 產(chǎn)生一個優(yōu)化器對象 -------------------optimizer = torch.optim.Adam(rnn.parameters(), lr=0.02)# ---------產(chǎn)生一個損失函數(shù)對象 ------------------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) #訓(xùn)練數(shù)據(jù)必須滿足(batch_size,Step_size,featur_num)格式train_data_in = Variable(torch.from_numpy(train_data_in)) # 包裝訓(xùn)練數(shù)據(jù)train_data_out = data_output[step * step_size:(step + 1) * step_size]# 前向計算網(wǎng)絡(luò)輸出prediction, state = self.forward(train_data_in, state) state = Variable(state.data) # 包裝state,下一次循環(huán)接著用# 計算誤差,做負(fù)反饋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 更新參數(shù)# -------------繪圖--------------------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()# -------------------產(chǎn)生訓(xùn)練數(shù)據(jù)--------------- 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) ## #-------------------產(chǎn)生測試數(shù)據(jù),從訓(xùn)練數(shù)據(jù)里面選 -------------------- # 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]# ------- 產(chǎn)生一個RNN模型的對象 ----------------- rnn = My_RNN() print(rnn)# -------------開始訓(xùn)練 -------------------- rnn.train_rnn(data_input,data_output,20,10)# -----------利用訓(xùn)練模型產(chǎn)生預(yù)測結(jié)果------------ state = None #中間隱藏層狀態(tài) 可以初始化為None Pre,state = rnn(data_input_test,state)#把預(yù)測結(jié)果畫出來 plt.plot(test_steps,data_input_test.flatten(),'g') #輸入數(shù)據(jù) plt.plot(test_steps,data_output_test.flatten(),'r-') #輸出真實數(shù)據(jù) plt.plot(test_steps,Pre.data.numpy().flatten(),'b-') #輸出預(yù)測數(shù)據(jù) plt.show()幾個重點理解的地方
5.1 關(guān)于RNN的輸入
RNN的輸入是一個三維的數(shù)據(jù),第一維和第二維可以互換,分別表示計算批次大小batch_size或者時間步長step_size,第三維必須是數(shù)據(jù)的特征維,另外RNN的輸入除了這種方式之外,也可以是一種打包好的數(shù)據(jù)格式,利用pytorch函數(shù)
torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False, enforce_sorted=True)這個函數(shù)跑一下就就理解了,它是針對輸入的step_size大小不一樣而作的計算優(yōu)化
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的中間狀態(tài)輸入,初始狀態(tài)給一個None
5.2 關(guān)于回歸的效果影響
網(wǎng)絡(luò)層數(shù)影響很大
節(jié)點數(shù)影響也較大
簡單的回歸問題,網(wǎng)絡(luò)層數(shù)不要太高,節(jié)點數(shù)也不要太多
總結(jié)
以上是生活随笔為你收集整理的pytorch 构建神经网络模型总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: anaconda pycharm 动手学
- 下一篇: LSTM 和 GRU