pyTorch非線性迴歸代碼實現

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt

# 從-1到1均勻生成100個數據
tensor_x = torch.linspace(-1, 1, 100)
'''
這裏是把一維矩陣轉二維矩陣,dim=1表示從tensor_x.shape的第1個下標維度添加1維
tensor_x.shape 是一維矩陣,大小是100,沒有方向
添加後shape變成了(100, 1)
'''
x = torch.unsqueeze(tensor_x, dim=1)
# y = x的平方加上一些噪點, torch.rand()是生成一串指定size,大於等於0小於1的數據
y = x.pow(2) + 0.2*torch.rand(x.size())

# x = Variable(x)
# y = Variable(y)

# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()

k = True

class Net(torch.nn.Module):
    '''
    這是一個三層的神經網絡
    '''
    def __init__(self, n_feature, n_hidden, n_output):
        '''
        初始化
        :param n_feature: 特徵數
        :param n_hidden: 隱藏層神經元個數
        :param n_output: 輸出數
        '''
        super(Net, self).__init__()
        # 參數一是前一層網絡神經元的個數,參數二是該網絡層神經元的個數
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
        # relu 激活函數,把小於或等於0的數直接等於0。此時得到第二層的神經網絡數據
        # x = F.relu(self.hidden(x))
        x = F.relu(self.hidden(x))
        # 得到第三層神經網絡輸出數據
        x = self.predict(x)
        return x

# 創建一個三層的神經網絡, 每層的神經元數量分別是1, 10 ,1
net = Net(1, 10, 1)

# SGD是一種優化器,net.parameters()是神經網絡中的所有參數,並設置學習率
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
# 定義損失函數, MSELoss代表均方差
loss_func = torch.nn.MSELoss()

# 讓plt變成實時打印,打開交互模式
plt.ion()
plt.show()

for t in range(100):
    # 調用搭建好的神經網絡模型,得到預測值
    prediction = net(x)
    # 用定義好的損失函數,得出預測值和真實值的loss
    loss = loss_func(prediction, y)

    # 每次都需要把梯度將爲0
    optimizer.zero_grad()
    # 誤差反向傳遞
    loss.backward()
    # 調用優化器進行優化,將參數更新值施加到 net 的 parameters 上
    optimizer.step()

    if t % 10 == 0:
        # 清除當前座標軸
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        # r- 是紅色 lw 是線寬
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        '''
        給圖形添加標籤,0.5, 0 表示X軸和Y軸座標,
        'Loss=%.4f'%loss.data.numpy()表示標註的內容,
        .4f表示保留小數點後四位
        fontdict是設置字體大小和顏色
        '''
        plt.text(0.5, 0, 'Loss=%.4f'%loss.data.numpy(), fontdict={'size':20, 'color': 'red'})
        # 間隔多久再次進行繪圖
        plt.pause(0.1)

運行上述代碼,圖形會繪製10次,最後的輸出如下:

在這裏插入圖片描述

發佈了23 篇原創文章 · 獲贊 14 · 訪問量 2744
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章