【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据
生活随笔
收集整理的這篇文章主要介紹了
【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 邏輯回歸與擬合過(guò)程
1.1 準(zhǔn)備數(shù)據(jù)-code_01_moons.py(第1部分)
import sklearn.datasets import torch import numpy as np import matplotlib.pyplot as plt from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary# 1.1 準(zhǔn)備數(shù)據(jù) np.random.seed(0) #設(shè)置隨機(jī)種子 X,Y = sklearn.datasets.make_moons(200,noise=0.2)#生成兩組半圓形數(shù)據(jù) arg = np.squeeze(np.argwhere(Y==0),axis=1) #獲取第1組數(shù)據(jù)索引 arg2 = np.squeeze(np.argwhere(Y==1),axis=1) #獲取第2組數(shù)據(jù)索引 plt.title("moons data") #設(shè)置可視化標(biāo)題 plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label='data1') #顯示第一組數(shù)據(jù)索引 plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label='data2')#顯示第二組數(shù)據(jù)索引 plt.legend() #顯示圖例 plt.show()1.2 定義網(wǎng)絡(luò)模型-LogicNet_fun.py(第1部分)
# 1.2 定義網(wǎng)絡(luò)模型 class LogicNet(nn.Module): #繼承nn.Module類(lèi),構(gòu)建網(wǎng)絡(luò)模型def __init__(self,inputdim,hiddendim,outputdim): #初始化網(wǎng)絡(luò)結(jié)構(gòu) ===》即初始化接口部分super(LogicNet,self).__init__()self.Linear1 = nn.Linear(inputdim,hiddendim) #定義全連接層self.Linear2 = nn.Linear(hiddendim,outputdim) #定義全連接層self.criterion = nn.CrossEntropyLoss() #定義交叉熵函數(shù)def forward(self,x):# 搭建用兩個(gè)全連接層組成的網(wǎng)絡(luò)模型 ===》 即正向接口部分:將網(wǎng)絡(luò)層模型結(jié)構(gòu)按照正向傳播的順序搭建x = self.Linear1(x)# 將輸入傳入第一個(gè)全連接層x = torch.tanh(x)# 將第一個(gè)全連接層的結(jié)果進(jìn)行非線性變化x = self.Linear2(x)# 將網(wǎng)絡(luò)數(shù)據(jù)傳入第二個(gè)全連接層return xdef predict(self,x):# 實(shí)現(xiàn)LogicNet類(lèi)的預(yù)測(cè)窗口 ===》 即預(yù)測(cè)接口部分:利用搭建好的正向接口,得到模型預(yù)測(cè)結(jié)果#調(diào)用自身網(wǎng)絡(luò)模型,并對(duì)結(jié)果進(jìn)行softmax()處理,分別的出預(yù)測(cè)數(shù)據(jù)屬于每一個(gè)類(lèi)的概率pred = torch.softmax(self.forward(x),dim=1)# 將正向結(jié)果進(jìn)行softmax(),分別的出預(yù)測(cè)結(jié)果屬于每一個(gè)類(lèi)的概率return torch.argmax(pred,dim=1)# 返回每組預(yù)測(cè)概率中最大的索引def getloss(self,x,y):# 實(shí)現(xiàn)LogicNet類(lèi)的損失值接口 ===》 即損失值計(jì)算接口部分:計(jì)算模型的預(yù)測(cè)結(jié)果與真實(shí)值之間的誤差,在反向傳播時(shí)使用y_pred = self.forward(x)loss = self.criterion(y_pred,y)# 計(jì)算損失值的交叉熵return loss1.3 實(shí)例化網(wǎng)絡(luò)模型-code_01_moons.py(第2部分)
# 1.3 搭建網(wǎng)絡(luò)模型 model = LogicNet(inputdim=2,hiddendim=3,outputdim=2) #實(shí)例化模型 輸入數(shù)據(jù)的維度、隱藏節(jié)點(diǎn)的數(shù)量、模型最終結(jié)果的分類(lèi)數(shù) optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定義優(yōu)化器 在反向傳播時(shí)使用1.4 神經(jīng)網(wǎng)絡(luò)的訓(xùn)練模型-code_01_moons.py(第3部分)
#1.4 訓(xùn)練模型 xt = torch.from_numpy(X).type(torch.FloatTensor) #將數(shù)據(jù)轉(zhuǎn)化為張量形式 yt = torch.from_numpy(Y).type(torch.LongTensor) epochs = 10000 #訓(xùn)練次數(shù) losses = [] # 損失值列表 for i in range(epochs):loss = model.getloss(xt,yt)losses.append(loss.item())optimizer.zero_grad() #梯度清零# loss.backword() 寫(xiě)錯(cuò)了 # 反向傳播loss.backward()# 反向傳播的損失值optimizer.step()# 更新參數(shù)1.5?訓(xùn)練結(jié)果的可視化實(shí)現(xiàn)
1.5.1 定義可視化函數(shù)-LogicNet_fun.py(第2部分)
# 1.5 訓(xùn)練可視化 def moving_average(a,w=10): #計(jì)算移動(dòng)平均損失值if len(a) < w:return a[:]return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]def moving_average_to_simp(a,w=10): #if len(a) < w:return a[:]val_list = []for idx, val in enumerate(a):if idx < w:# 如果列表 a 的下標(biāo)小于 w, 直接將元素添加進(jìn) xxx 列表val_list.append(val)else:# 向前取 10 個(gè)元素計(jì)算平均值, 添加到 xxx 列表val_list.append(sum(a[(idx - w):idx]) / w)def plot_losses(losses):avgloss = moving_average(losses)#獲得損失值的移動(dòng)平均值plt.figure(1)plt.subplot(211)plt.plot(range(len(avgloss)),avgloss,'b--')plt.xlabel('step number')plt.ylabel('Training loss')plt.title('step number vs Training loss')plt.show()1.5.2 調(diào)用可視化函數(shù)-code_01_moons.py(第4部分)
#1.5 訓(xùn)練可視化 plot_losses(losses)1.6 網(wǎng)絡(luò)模型評(píng)估即預(yù)測(cè)精度計(jì)算-code_01_moons.py(第5部分)
#1.6 模型評(píng)估 from sklearn.metrics import accuracy_score print(accuracy_score(model.predict(xt),yt))1.7?預(yù)測(cè)結(jié)果模型可視化
1.7.1 可視化函數(shù)構(gòu)建--LogicNet_fun.py(第3部分)
# 1.7 數(shù)據(jù)可視化模型 def predict(x): #封裝支持Numpy的預(yù)測(cè)接口x = torch.from_numpy(x).type(torch.FloatTensor)model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)ans = model.predict(x)return ans.numpy()def plot_decision_boundary(pred_func,X,Y): #在直角模型中實(shí)現(xiàn)預(yù)測(cè)結(jié)果的可視化#計(jì)算范圍x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5h=0.01xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#根據(jù)數(shù)據(jù)輸入進(jìn)行預(yù)測(cè)Z = pred_func(np.c_[xx.ravel(),yy.ravel()])Z = Z.reshape(xx.shape)#將數(shù)據(jù)的預(yù)測(cè)結(jié)果進(jìn)行可視化plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)plt.title("Linear predict")arg = np.squeeze(np.argwhere(Y==0),axis=1)arg2 = np.squeeze(np.argwhere(Y==1),axis=1)plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')plt.show()1.7.2 可視化函數(shù)調(diào)用--code_01_moons.py(第6部分)
# 1.7 數(shù)據(jù)預(yù)測(cè)可視化模型 plot_decision_boundary(lambda x:predict(x),xt.numpy(),yt.numpy())2 總結(jié)與回顧
2.1 深度學(xué)習(xí)的步驟
準(zhǔn)備數(shù)據(jù)、搭建網(wǎng)絡(luò)模型、訓(xùn)練模型、使用及評(píng)估模型
2.1.1 概述步驟
將任務(wù)中的數(shù)據(jù)進(jìn)行收集整理,通過(guò)建立合適的網(wǎng)絡(luò)模型進(jìn)行預(yù)測(cè),在構(gòu)建過(guò)程中通過(guò)一定次數(shù)的迭代學(xué)習(xí)數(shù)據(jù)特征來(lái)行程可用的數(shù)據(jù)模型,最后就是使用構(gòu)建好的模型來(lái)解決實(shí)際問(wèn)題。
2.2 訓(xùn)練模型
2.3 模型是如何訓(xùn)練的?
?
3 代碼匯總
3.1?code_01_moons.py
import sklearn.datasets import torch import numpy as np import matplotlib.pyplot as plt from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary# 1.1 準(zhǔn)備數(shù)據(jù) np.random.seed(0) #設(shè)置隨機(jī)種子 X,Y = sklearn.datasets.make_moons(200,noise=0.2)#生成兩組半圓形數(shù)據(jù) arg = np.squeeze(np.argwhere(Y==0),axis=1) #獲取第1組數(shù)據(jù)索引 arg2 = np.squeeze(np.argwhere(Y==1),axis=1) #獲取第2組數(shù)據(jù)索引 plt.title("moons data") #設(shè)置可視化標(biāo)題 plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label='data1') #顯示第一組數(shù)據(jù)索引 plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label='data2')#顯示第二組數(shù)據(jù)索引 plt.legend() #顯示圖例 plt.show()# 1.3 搭建網(wǎng)絡(luò)模型 model = LogicNet(inputdim=2,hiddendim=3,outputdim=2) #實(shí)例化模型 輸入數(shù)據(jù)的維度、隱藏節(jié)點(diǎn)的數(shù)量、模型最終結(jié)果的分類(lèi)數(shù) optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定義優(yōu)化器 在反向傳播時(shí)使用#1.4 訓(xùn)練模型 xt = torch.from_numpy(X).type(torch.FloatTensor) #將數(shù)據(jù)轉(zhuǎn)化為張量形式 yt = torch.from_numpy(Y).type(torch.LongTensor) epochs = 10000 #訓(xùn)練次數(shù) losses = [] # 損失值列表 for i in range(epochs):loss = model.getloss(xt,yt)losses.append(loss.item())optimizer.zero_grad() #梯度清零# loss.backword() 寫(xiě)錯(cuò)了 # 反向傳播loss.backward()# 反向傳播的損失值optimizer.step()# 更新參數(shù)#1.5 訓(xùn)練可視化 plot_losses(losses)#1.6 模型評(píng)估 from sklearn.metrics import accuracy_score print(accuracy_score(model.predict(xt),yt))# 1.7 數(shù)據(jù)預(yù)測(cè)可視化模型 plot_decision_boundary(lambda x:predict(x),xt.numpy(),yt.numpy())3.2?LogicNet_fun.py
import torch.nn as nn #引入torch網(wǎng)絡(luò)模型庫(kù) import torch import numpy as np import matplotlib.pyplot as plt# 1.2 定義網(wǎng)絡(luò)模型 class LogicNet(nn.Module): #繼承nn.Module類(lèi),構(gòu)建網(wǎng)絡(luò)模型def __init__(self,inputdim,hiddendim,outputdim): #初始化網(wǎng)絡(luò)結(jié)構(gòu) ===》即初始化接口部分super(LogicNet,self).__init__()self.Linear1 = nn.Linear(inputdim,hiddendim) #定義全連接層self.Linear2 = nn.Linear(hiddendim,outputdim) #定義全連接層self.criterion = nn.CrossEntropyLoss() #定義交叉熵函數(shù)def forward(self,x):# 搭建用兩個(gè)全連接層組成的網(wǎng)絡(luò)模型 ===》 即正向接口部分:將網(wǎng)絡(luò)層模型結(jié)構(gòu)按照正向傳播的順序搭建x = self.Linear1(x)# 將輸入傳入第一個(gè)全連接層x = torch.tanh(x)# 將第一個(gè)全連接層的結(jié)果進(jìn)行非線性變化x = self.Linear2(x)# 將網(wǎng)絡(luò)數(shù)據(jù)傳入第二個(gè)全連接層return xdef predict(self,x):# 實(shí)現(xiàn)LogicNet類(lèi)的預(yù)測(cè)窗口 ===》 即預(yù)測(cè)接口部分:利用搭建好的正向接口,得到模型預(yù)測(cè)結(jié)果#調(diào)用自身網(wǎng)絡(luò)模型,并對(duì)結(jié)果進(jìn)行softmax()處理,分別的出預(yù)測(cè)數(shù)據(jù)屬于每一個(gè)類(lèi)的概率pred = torch.softmax(self.forward(x),dim=1)# 將正向結(jié)果進(jìn)行softmax(),分別的出預(yù)測(cè)結(jié)果屬于每一個(gè)類(lèi)的概率return torch.argmax(pred,dim=1)# 返回每組預(yù)測(cè)概率中最大的索引def getloss(self,x,y):# 實(shí)現(xiàn)LogicNet類(lèi)的損失值接口 ===》 即損失值計(jì)算接口部分:計(jì)算模型的預(yù)測(cè)結(jié)果與真實(shí)值之間的誤差,在反向傳播時(shí)使用y_pred = self.forward(x)loss = self.criterion(y_pred,y)# 計(jì)算損失值的交叉熵return loss# 1.5 訓(xùn)練可視化 def moving_average(a,w=10): #計(jì)算移動(dòng)平均損失值if len(a) < w:return a[:]return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]def moving_average_to_simp(a,w=10): #if len(a) < w:return a[:]val_list = []for idx, val in enumerate(a):if idx < w:# 如果列表 a 的下標(biāo)小于 w, 直接將元素添加進(jìn) xxx 列表val_list.append(val)else:# 向前取 10 個(gè)元素計(jì)算平均值, 添加到 xxx 列表val_list.append(sum(a[(idx - w):idx]) / w)def plot_losses(losses):avgloss = moving_average(losses)#獲得損失值的移動(dòng)平均值plt.figure(1)plt.subplot(211)plt.plot(range(len(avgloss)),avgloss,'b--')plt.xlabel('step number')plt.ylabel('Training loss')plt.title('step number vs Training loss')plt.show()# 1.7 數(shù)據(jù)可視化模型 def predict(x): #封裝支持Numpy的預(yù)測(cè)接口x = torch.from_numpy(x).type(torch.FloatTensor)model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)ans = model.predict(x)return ans.numpy()def plot_decision_boundary(pred_func,X,Y): #在直角模型中實(shí)現(xiàn)預(yù)測(cè)結(jié)果的可視化#計(jì)算范圍x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5h=0.01xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#根據(jù)數(shù)據(jù)輸入進(jìn)行預(yù)測(cè)Z = pred_func(np.c_[xx.ravel(),yy.ravel()])Z = Z.reshape(xx.shape)#將數(shù)據(jù)的預(yù)測(cè)結(jié)果進(jìn)行可視化plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)plt.title("Linear predict")arg = np.squeeze(np.argwhere(Y==0),axis=1)arg2 = np.squeeze(np.argwhere(Y==1),axis=1)plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')plt.show()總結(jié)
以上是生活随笔為你收集整理的【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 清华大学计算机学院主页,计算机图形学基础
- 下一篇: ERROR 2002 (HY000):