pytorch神經網絡解決回歸問題(非常易懂)


對於pytorch的深度學習框架,在建立人工神經網絡時整體的步驟主要有以下四步:

1、載入原始數據

2、構建具體神經網絡

3、進行數據的訓練

4、數據測試和驗證

pytorch神經網絡的數據載入,以MINIST書寫字體的原始數據為例:

import torch

import matplotlib.pyplot as  plt

def plot_curve(data):

    fig=plt.figure()

    plt.plot(range(len(data)),data,color="blue")

    plt.legend(["value"],loc="upper right")

    plt.xlabel("step")

    plt.ylabel("value")

    plt.show()

 

def plot_image(img,label,name):

    fig=plt.figure()

    for i in range(6):

        plt.subplot(2,3,i+1)

        plt.tight_layout()

        plt.imshow(img[i][0]*0.3081+0.1307,cmap="gray",interpolation="none")

        plt.title("{}:{}".format(name, label[i].item()))

        plt.xticks([])

        plt.yticks([])

    plt.show()

def one_hot(label,depth=10):

    out=torch.zeros(label.size(0),depth)

    idx=torch.LongTensor(label).view(-1,1)

    out.scatter_(dim=1,index=idx,value=1)

    return out

 

batch_size=512

import torch

from torch import nn                         #完成神經網絡的構建包

from torch.nn import functional as F         #包含常用的函數包

from torch import optim                      #優化工具包

import torchvision                           #視覺工具包

import  matplotlib.pyplot as plt

from utils import plot_curve,plot_image,one_hot

#step1 load dataset   加載數據包

train_loader=torch.utils.data.DataLoader(

    torchvision.datasets.MNIST("minist_data",train=True,download=True,transform=torchvision.transforms.Compose(

        [torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,),(0.3081,))

         ])),

    batch_size=batch_size,shuffle=True)

test_loader=torch.utils.data.DataLoader(

    torchvision.datasets.MNIST("minist_data",train=True,download=False,transform=torchvision.transforms.Compose(

        [torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,),(0.3081,))

         ])),

    batch_size=batch_size,shuffle=False)

x,y=next(iter(train_loader))

print(x.shape,y.shape)

plot_image(x,y,"image")

print(x)

print(y)

以構建一個簡單的回歸問題的神經網絡為例,其具體的實現代碼如下所示:

import torch

import torch.nn.functional as F  # 激勵函數都在這

 

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1)

y = x.pow(2) + 0.2 * torch.rand(x.size())  # noisy y data (tensor), shape=(100, 1)

 

class Net(torch.nn.Module):  # 繼承 torch 的 Module(固定)

    def __init__(self, n_feature, n_hidden, n_output):  # 定義層的信息,n_feature多少個輸入, n_hidden每層神經元, n_output多少個輸出

        super(Net, self).__init__()  # 繼承 __init__ 功能(固定)

        # 定義每層用什么樣的形式

        self.hidden = torch.nn.Linear(n_feature, n_hidden)  # 定義隱藏層,線性輸出

        self.predict = torch.nn.Linear(n_hidden, n_output)  # 定義輸出層線性輸出

 

    def forward(self, x):  # x是輸入信息就是data,同時也是 Module 中的 forward 功能,定義神經網絡前向傳遞的過程,把__init__中的層信息一個一個的組合起來

        # 正向傳播輸入值, 神經網絡分析出輸出值

        x = F.relu(self.hidden(x))  # 定義激勵函數(隱藏層的線性值)

        x = self.predict(x)  # 輸出層,輸出值

        return x

 

 

net = Net(n_feature=1, n_hidden=10, n_output=1)

 

print(net)  # net 的結構

"""

Net (

  (hidden): Linear (1 -> 10)

  (predict): Linear (10 -> 1)

)

"""

# optimizer 是訓練的工具

optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  # 傳入 net 的所有參數, 學習率

loss_func = torch.nn.MSELoss()  # 預測值和真實值的誤差計算公式 (均方差)

 

for t in range(100):  # 訓練的步數100步

    prediction = net(x)  # 喂給 net 訓練數據 x, 每迭代一步,輸出預測值

 

    loss = loss_func(prediction, y)  # 計算兩者的誤差

 

    # 優化步驟:

    optimizer.zero_grad()  # 清空上一步的殘余更新參數值

    loss.backward()  # 誤差反向傳播, 計算參數更新值

    optimizer.step()  # 將參數更新值施加到 net 的 parameters 上

 

import matplotlib.pyplot as plt

 

plt.ion()  # 實時畫圖something about plotting

 

for t in range(200):

    prediction = net(x)  # input x and predict based on x

 

    loss = loss_func(prediction, y)  # must be (1. nn output, 2. target)

 

    optimizer.zero_grad()  # clear gradients for next train

    loss.backward()  # backpropagation, compute gradients

    optimizer.step()  # apply gradients

 

    if t % 5 == 0:  # 每五步繪一次圖

        # plot and show learning process

        plt.cla()

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

        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)

        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})

        plt.pause(0.1)

 

plt.ioff()

plt.show()

 


免責聲明!

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



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