pytorch神經網絡實現的基本步驟


轉載自: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM