轉載自:https://blog.csdn.net/dss_dssssd/article/details/83892824
版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/dss_dssssd/article/details/83892824
————————————————
版權聲明:本文為CSDN博主「墨氳」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/dss_dssssd/article/details/83892824
神經網絡訓練的基本步驟如下:
1、准備數據集;
2、定義網絡結構;
3、定義損失函數;
4、定義優化算法;
5、迭代訓練;
准備好tensor形式的輸入數據以及標簽;
定義好網絡前向傳播用於計算網絡的輸出(output)以及網絡的損失函數(loss)
反向傳播進行網絡參數更新:以下三個步驟
(1)將上一個迭代所計算的梯度進行清零:optimizer.zero_grad()
(2)進行本次迭代的梯度計算,計算梯度值:loss.backward()
(3)更新網絡的權值參數:optimizer.step()
保存訓練集上的loss以及驗證集上的loss以及准確率,並打印可視化;
import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # Hyper-parameters 定義迭代次數, 學習率以及模型形狀的超參數 input_size = 1 output_size = 1 num_epochs = 60 learning_rate = 0.001 # Toy dataset 1. 准備數據集 x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], [9.779], [6.182], [7.59], [2.167], [7.042], [10.791], [5.313], [7.997], [3.1]], dtype=np.float32) y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], [3.366], [2.596], [2.53], [1.221], [2.827], [3.465], [1.65], [2.904], [1.3]], dtype=np.float32) # Linear regression model 2. 定義網絡結構 y=w*x+b 其中w的size [1,1], b的size[1,] model = nn.Linear(input_size, output_size) # Loss and optimizer 3.定義損失函數, 使用的是最小平方誤差函數 criterion = nn.MSELoss() # 4.定義迭代優化算法, 使用的是隨機梯度下降算法 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) loss_dict = [] # Train the model 5. 迭代訓練 for epoch in range(num_epochs): # Convert numpy arrays to torch tensors 5.1 准備tensor的訓練數據和標簽 inputs = torch.from_numpy(x_train) targets = torch.from_numpy(y_train) # Forward pass 5.2 前向傳播計算網絡結構的輸出結果 outputs = model(inputs) # 5.3 計算損失函數 loss = criterion(outputs, targets) # Backward and optimize 5.4 反向傳播更新參數 optimizer.zero_grad() loss.backward() optimizer.step() # 可選 5.5 打印訓練信息和保存loss loss_dict.append(loss.item()) if (epoch+1) % 5 == 0: print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # Plot the graph 畫出原y與x的曲線與網絡結構擬合后的曲線 predicted = model(torch.from_numpy(x_train)).detach().numpy() plt.plot(x_train, y_train, 'ro', label='Original data') plt.plot(x_train, predicted, label='Fitted line') plt.legend() plt.show() # 畫loss在迭代過程中的變化情況 plt.plot(loss_dict, label='loss for every epoch') plt.legend() plt.show() ———————————————— 版權聲明:本文為CSDN博主「墨氳」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/dss_dssssd/article/details/83892824