[Pytorch系列-26]:神经网络基础 - 多个带激活函数的神经元实现非线性回归
作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:https://blog.csdn.net/HiWangWenBing/article/details/120600621
目錄
前言 深度學習模型框架
第1章 業務領域分析
1.1? 步驟1-1:業務領域分析
1.2 步驟1-2:業務建模
1.3 代碼實例前置條件
第2章 前向運算模型定義
2.1?步驟2-1:數據集選擇
2.2?步驟2-2:數據預處理
2.3 步驟2-3:神經網絡建模
2.4 步驟2-4:神經網絡輸出
第3章 后向運算模型定義
3.1 步驟3-1:定義loss函數
3.2? 步驟3-2:定義優化器
3.3 步驟3-3:模型訓練
3.4 步驟3-4:模型驗證
3.5 步驟3-5:模型可視化
第4章 模型部署
4.1 步驟4-1:模型部署
前言 深度學習模型框架
[人工智能-深度學習-8]:神經網絡基礎 - 機器學習、深度學習模型、模型訓練_文火冰糖(王文兵)的博客-CSDN博客_神經網絡與深度學習第1章 白話機器學習[人工智能-綜述-4]:白話深度學習-- 無基礎小白都能理解機器學習的核心概念_文火冰糖(王文兵)的博客-CSDN博客[人工智能-深度學習-7]:神經網絡基礎 - 人工神經網絡ANN_文火冰糖(王文兵)的博客-CSDN博客第2章 機器學習的模型與步驟2.1深度學習與機器學習上述三個概念中:人工智能的概念最廣泛,所以有能機器具有類”人“一樣智能的技術、非技術(如倫理)的領域,都是人工智能。機器獲取“智能”的一個重要手段是,機器具備“自我學習”的能力,...https://blog.csdn.net/HiWangWenBing/article/details/120462734
第1章 業務領域分析
1.1? 步驟1-1:業務領域分析
非線性回歸,樣本是帶噪聲的數據。
從樣本數據可以看出,內在的規律可能是一個拋物線,但肯定一元一次的函數(直線)
因此,這是非線性回歸問題。
1.2 步驟1-2:業務建模
單個神經元是都輸入和單個輸出。
可以構建兩層的神經網絡:
(1)隱藏層1:
- 一維的輸入屬性X
- 多個并行的神經元,這里初步選10個神經元
- 每個神經元有一個激活函數relu
(2)輸出層:
- 由于是單輸入,因此輸出層只需要一個神經元即可。
1.3 代碼實例前置條件
#環境準備 import numpy as np # numpy數組庫 import math # 數學運算庫 import matplotlib.pyplot as plt # 畫圖庫import torch # torch基礎庫 import torch.nn as nn # torch神經網絡庫 import torch.nn.functional as F # torch神經網絡庫print("Hello World") print(torch.__version__) print(torch.cuda.is_available()) Hello World 1.8.0 False第2章 前向運算模型定義
2.1?步驟2-1:數據集選擇
這里不需要采用已有的開源數據集,只需要自己構建數據集即可。
#2-1 準備數據集 #x_sample = torch.linspace(-1, 1, 100).reshape(-1, 1) 或者 x_sample = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)#噪聲服從正態分布 noise = torch.randn(x_sample.size())y_sample = x_sample.pow(2) + 1 + 0.1 * noisey_line = x_sample.pow(2) + 1 #可視化數據 print(x_sample.shape) print(y_sample.shape) print(y_line.shape) plt.scatter(x_sample.data.numpy(), y_sample.data.numpy()) plt.plot(x_sample, y_line,'green') torch.Size([100, 1]) torch.Size([100, 1]) torch.Size([100, 1])Out[51]:
[<matplotlib.lines.Line2D at 0x279b8d43130>]2.2?步驟2-2:數據預處理
# 2-2 對數據預處理 x_train = x_sample y_train = y_sample2.3 步驟2-3:神經網絡建模
# 2-3 定義網絡模型 class Net(torch.nn.Module):# 定義神經網絡def __init__(self, n_feature, n_hidden, n_output):super(Net, self).__init__()#定義隱藏層L1# n_feature:輸入屬性的維度# n_hidden: 神經元的個數 = 輸出屬性的個數self.hidden = torch.nn.Linear(n_feature, n_hidden)#定義輸出層:# n_hidden:輸入屬性的維度# n_output: 神經元的個數 = 輸出屬性的個數self.predict = torch.nn.Linear(n_hidden, n_output)#定義前向運算def forward(self, x):h1 = self.hidden(x)s1 = F.relu(h1)out = self.predict(s1) return outmodel = Net(1,10,1) print(model) print(model.parameters) print(model.parameters()) Net((hidden): Linear(in_features=1, out_features=10, bias=True)(predict): Linear(in_features=10, out_features=1, bias=True) ) <bound method Module.parameters of Net((hidden): Linear(in_features=1, out_features=10, bias=True)(predict): Linear(in_features=10, out_features=1, bias=True) )> <generator object Module.parameters at 0x00000279B78BC820>2.4 步驟2-4:神經網絡輸出
# 2-4 定義網絡預測輸出 y_pred = model.forward(x_train) print(y_pred.shape) torch.Size([100, 1])第3章 后向運算模型定義
3.1 步驟3-1:定義loss函數
這里采用的MSE loss函數
# 3-1 定義loss函數: # loss_fn= MSE loss loss_fn = nn.MSELoss()print(loss_fn) MSELoss()3.2? 步驟3-2:定義優化器
# 3-2 定義優化器 Learning_rate = 0.01 #學習率# optimizer = SGD: 基本梯度下降法 # parameters:指明要優化的參數列表 # lr:指明學習率 optimizer = torch.optim.SGD(model.parameters(), lr = Learning_rate) print(optimizer) SGD ( Parameter Group 0dampening: 0lr: 0.01momentum: 0nesterov: Falseweight_decay: 0 )3.3 步驟3-3:模型訓練
# 3-3 模型訓練 # 定義迭代次數 epochs = 5000loss_history = [] #訓練過程中的loss數據 y_pred_history =[] #中間的預測結果for i in range(0, epochs):#(1) 前向計算y_pred = model(x_train)#(2) 計算lossloss = loss_fn(y_pred, y_train)#(3) 反向求導loss.backward()#(4) 反向迭代optimizer.step()#(5) 復位優化器的梯度optimizer.zero_grad() # 記錄訓練數據loss_history.append(loss.item()) y_pred_history.append(y_pred.data)if(i % 1000 == 0):print('epoch {} loss {:.4f}'.format(i, loss.item())) print("\n迭代完成") print("final loss =", loss.item()) print(len(loss_history)) print(len(y_pred_history)) epoch 0 loss 0.5406 epoch 1000 loss 0.0303 epoch 2000 loss 0.0159 epoch 3000 loss 0.0148 epoch 4000 loss 0.0141迭代完成 final loss = 0.013485318049788475 5000 50003.4 步驟3-4:模型驗證
NA
3.5 步驟3-5:模型可視化
(1)前向數據
# 3-4 可視化模型數據 #model返回的是總tensor,包含grad_fn,用data提取出的tensor是純tensor y_pred = model.forward(x_train).data.numpy().squeeze() print(x_train.shape) print(y_pred.shape) print(y_line.shape)plt.scatter(x_train, y_train, label='SampleLabel') plt.plot(x_train, y_pred, color ="red", label='Predicted') plt.plot(x_train, y_line, color ="green", label ='Line')plt.legend() plt.show() torch.Size([100, 1]) (100,) torch.Size([100, 1])?
備注:
從如上的幾何圖形可以看出:
- 人工神經網絡模型的擬合圖形與拋物線接近,但并不平滑。
(2)后向loss值迭代過程
#顯示loss的歷史數據 plt.plot(loss_history, "r+") plt.title("loss value")(3)前向預測函數的迭代過程
for i in range(0, len(y_pred_history)):if(i % 100 == 0):plt.scatter(x_train, y_train, color ="black", label='SampleLabel')plt.plot(x_train, y_pred_history[i], label ='Line')plt.plot(x_train, y_line, color ="green", label ='Line', linewidth=4) plt.plot(x_train, y_pred, color ="red", label='Predicted', linewidth=4)?從上圖,可以清晰的看出,前向預測函數,如何一步步收斂到最終的圖形的。
其中:
紅色圖形:迭代后的圖形
綠色圖形:解析函數的圖形
其他圖形:中間迭代的圖形
第4章 模型部署
4.1 步驟4-1:模型部署
NA
作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:https://blog.csdn.net/HiWangWenBing/article/details/120600621
總結
以上是生活随笔為你收集整理的[Pytorch系列-26]:神经网络基础 - 多个带激活函数的神经元实现非线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++char数据类型
- 下一篇: 大话转岗 PHP 开发小结