Pytorch——迴歸問題

ckxllf發表於2020-03-12

  1.前言

  我會這次會來見證神經網路是如何透過簡單的形式將一群資料用一條線條來表示. 或者說, 是如何在資料當中找到他們的關係, 然後用神經網路模型來建立一個可以代表他們關係的線條.

  2.資料準備

  我們建立一些假資料來模擬真實的情況. 比如一個一元二次函式: y = a * x^2 + b, 我們給 y 資料加上一點噪聲來更加真實的展示它.

  import torch

  import matplotlib.pyplot as plt

  #製造一些資料

  x = torch.unsqueeze(torch.linspace(-1,1,100),dim = 1) #torch.Size([100, 1]) #把[a,b,c]變成[[a,b,c]]

  #print(x)

  y = 2*(x.pow(2)) + 0.5*torch.rand(x.size()) #torch.rand為均勻分佈,返回一個張量,包含了從區間[0, 1)的均勻分佈中抽取的一組隨機數。張量的形狀由引數sizes定義

  #print(y)

  #畫圖

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

  plt.show()

  3.搭建神經網路

  建立一個神經網路我們可以直接運用 torch 中的體系. 先定義所有的層屬性(init()), 然後再一層層搭建(forward(x))層於層的關係連結. 建立關係的時候, 我們會用到激勵函式

  from torch import nn

  import torch.nn.functional as F

  class NetWork(nn.Module):

  def __init__(self,n_input,n_hidden,n_output):

  super(NetWork,self).__init__()

  self.hidden = nn.Linear(n_input,n_hidden)

  self.output_for_predict = nn.Linear(n_hidden,n_output)

  def forward(self,x):

  x = F.relu(self.hidden(x)) #對x進入隱層後的輸出應用啟用函式(相當於一個篩選的過程)

  output = self.output_for_predict(x) #做線性變換,將維度為1

  return output

  network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)

  print(network) #列印模型的層次結構

  4.訓練搭建的神經網路

  訓練的步驟很簡單, 如下:

  from torch import nn

  import torch.nn.functional as F

  class NetWork(nn.Module):

  def __init__(self,n_input,n_hidden,n_output):

  super(NetWork,self).__init__()

  self.hidden = nn.Linear(n_input,n_hidden)

  self.output_for_predict = nn.Linear(n_hidden,n_output)

  def forward(self,x):

  x = F.relu(self.hidden(x)) #對x進入隱層後的輸出應用啟用函式(相當於一個篩選的過程)

  output = self.output_for_predict(x) #做線性變換,將維度為1

  return output

  network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)

  print(network) #列印模型的層次結構

  optimizer = torch.optim.SGD(network.parameters(),lr = 0.2)

  criterion = torch.nn.MSELoss() #均方誤差,用於計算預測值與真實值之間的誤差

  for i in range(500): #訓練步數(相當於迭代次數)

  predication = network(x)

  loss = criterion(predication, y) #predication為預測的值,y為真實值

  optimizer.zero_grad()

  loss.backward() #反向傳播,更新引數

  optimizer.step() #將更新的引數值放進network的parameters

  5.視覺化操作

  x = torch.unsqueeze(torch.linspace(-1,1,100),dim = 1) #torch.Size([100, 1]) #把[a,b,c]變成[[a,b,c]]

  #print(x) 鄭州哪裡做人流好

  y = 2*(x.pow(2)) + 0.5*torch.rand(x.size()) #torch.rand為均勻分佈,返回一個張量,包含了從區間[0, 1)的均勻分佈中抽取的一組隨機數。張量的形狀由引數sizes定義

  #print(y)

  #畫圖

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

  # plt.show()

  from torch import nn

  import torch.nn.functional as F

  class NetWork(nn.Module):

  def __init__(self,n_input,n_hidden,n_output):

  super(NetWork,self).__init__()

  self.hidden = nn.Linear(n_input,n_hidden)

  self.output_for_predict = nn.Linear(n_hidden,n_output)

  def forward(self,x):

  x = F.relu(self.hidden(x)) #對x進入隱層後的輸出應用啟用函式(相當於一個篩選的過程)

  output = self.output_for_predict(x) #做線性變換,將維度為1

  return output

  network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)

  print(network) #列印模型的層次結構

  plt.ion() # 開啟互動模式

  plt.show()

  optimizer = torch.optim.SGD(network.parameters(),lr = 0.2)

  criterion = torch.nn.MSELoss() #均方誤差,用於計算預測值與真實值之間的誤差

  for i in range(500): #訓練步數(相當於迭代次數)

  predication = network(x)

  loss = criterion(predication, y) #predication為預測的值,y為真實值

  optimizer.zero_grad()

  loss.backward() #反向傳播,更新引數

  optimizer.step() #將更新的引數值放進network的parameters

  if i % 10 == 0:

  plt.cla() # 清座標軸

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

  plt.plot(x.data.numpy(),predication.data.numpy(),'ro', lw=5) #畫預測曲線,用紅色o作為標記

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

  plt.pause(0.1)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2679779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章