最近聽了張江老師的深度學習課程,用pytorch實現神經網路**,之前做titanic生存率**的時候稍微了解過tensorflow,聽說tensorflow能做的pyorch都可以做,而且更方便快捷,自己嘗試了一下**的邏輯確實比較簡單。
pytorch涉及的基本資料型別是tensor(張量)和autograd(自動微分變數),對於這些概念我也是一知半解,tensor和向量,矩陣等概念都有交叉的部分,下次有時間好好補一下數學的基礎知識,不過現階段的任務主要是應用,學習掌握思維和方法即可,就不再深究了。tensor和ndarray可以相互轉換,python的numpy庫中的命令也都基本適用。
一些基本的**:
import torch #匯入torch包
x = torch.rand(5, 3) #產生乙個5*3的tensor,在 [0,1) 之間隨機取值
y = torch.ones(5, 3) #產生乙個5*3的tensor,元素都是1
#和numpy的命令一致
#tensor的運算
z = x + y #兩個tensor可以直接相加
q = x.mm(y.transpose(0, 1)) #x乘以y的轉置 mm為矩陣的乘法,矩陣相乘必須某乙個矩陣的行與另乙個矩陣的列相等
##tensor與numpy.ndarray之間的轉換
import numpy as np #匯入numpy包
a = np.ones([5, 3]) #建立乙個5*3全是1的二維陣列(矩陣)
b = torch.from_numpy(a) #利用from_numpy將其轉換為tensor
c = torch.floattensor(a) #另外一種轉換為tensor的方法,型別為floattensor,還可以使longtensor,整型資料型別
b.numpy() #從乙個tensor轉化為numpy的多維陣列
from torch.autograd程式設計客棧 import variable #匯入自動梯度的運算包,主要用variable這個類
x = variable(torch.ones(2, 2), requires_grad=true) #建立乙個variable,包裹了乙個2*2張量,將需要計算梯度屬性置為true
下面用pytorch做乙個簡單的線性關係**
線性關係是一種非常簡單的變數之間的關係,因變數和自變數**性關係的情況下,可以使用線性回歸演算法對乙個或多個因變數和自變數間的線性關係進行建模,該模型的係數可以用最小二乘法進行求解。生活中的場景往往會比較複雜,需要考慮多元線性關係和非線性關係,用其他的回歸分析方法求解。
這裡po上**:
#人為生成一些樣本點作為原始資料
x = variable(torch.linspace(0, 100).type(torch.floattensor))
rand = variable(torch.randn(100)) * 10 #隨機生成100個滿足標準正態分佈的隨機數,均值為0,方差為1.將這個數字乘以10,標準方差變為10
y = x + rand #將x和rand相加,得到偽造的標籤資料y。所以(x,y)應能近似地落在y=x這條直線上
import matplotlib.pyplot as plt #匯入畫圖的程式包
plt.figure(figsize=(10,8)) #設定繪製視窗大小為10*8 inch
plt.plot(x.data.numpy(), y.data.numpy(), 'o') #繪製資料,考慮到x和y都是variable,需要用data獲取它們包裹的tensor,並專成numpy
plt.xlabel('x')
plt.ylabel('y')
plt.show()
圖示:訓練模型:
#a,b就是要構建的線性函式的係數
a = variable(torch.rand(1), requires_grad = true) #建立a變數,並隨機賦值初始化
b = variable(torch.rand(1), requires_grad = true) #建立b變數,並隨機賦值初始化
print('initial parameters:', [a, b])
learning_rate = 0.0001 #設定學習率
for i in range(1000):
### 增加了這部分**,清空儲存在變數a,b中的梯度資訊,以免在backward的過程中會反覆不停地累加
if (a.grad is not none) and (b.grad is not none):
a.grad.data.zero_()
b.grad.data.zero_()
predictions www.cppcns.com= a.expand_as(x) * x+ b.expand_as(x) #計算在當前a、b條件下的模型**數值
loss = torch.mean((predictions - y) ** 2) #通過與標籤資料y比較,計算誤差
print('loss:', loss)
loss.backward() #對損失函式進行梯度反傳,backward的方向傳播演算法
a.data.add_(- learning_rate * a.grad.data) #利用上一步計算中得到的a的梯度資訊更新a中的data數值
b.data.add_(- learning_rate * b.grad.data) #利用上一步計算中得到的b的梯度資訊更新b中的data數值
##擬合
x_data = x.data.numpy()
plt.figure(figsize = (10, 7))
xplot = plt.plot(x_data, y.data.numpy(), 'o') # 繪製原始資料
yplot = plt.plot(x_data, a.data.numpy() * x_data + b.data.numpy()) #繪製擬合資料
plt.xlabel('x')
plt.ylabel('y')
str1 = str(a.data.numpy()[0]) + 'x +' + str(b.data.numpy()[0]) #圖例資訊
plt.legend([xplot, yplot],['data', str1]) #繪製圖例
plt.show()
圖示:測試:
x_test = variable(torch.floattensor([1, 2, 10, 100, 1000])) #隨便選擇一些點1,2,……,1000
predictions = a.expand_as(x_test) * x_test + b.expand_as(x_test) #計算模型的**結果
predictions #輸出
ok,大功告成,可以看到用pytorch做機器學習確實無論是準確度還是方便性都有優勢,繼續探索學習。
本文標題: 利用pytorch實現簡單的線性回歸演算法
本文位址: /jiaoben/python/298434.html
pytorch五 用Variable實現線性回歸
匯入相關包 import torch as t import matplotlib.pyplot as plt 構造資料 def get fake data batch size 8 設定隨機種子數,這樣每次生成的隨機數都是一樣的 t.manual seed 10 產生隨機資料 y 2 x 3,加上...
利用pytorch構建簡單神經網路
省略了資料集的處理過程 轉為tensor x torch.tensor input features,dtype float y torch.tensor labels,dtype float 權重引數初始化,設計網路結構 輸入348 14 weights torch.randn 14 128 dt...
pytorch實現最簡單的線性回歸
import torch import time from torch.autograd import variable import torch.nn.functional as f x torch.unsqueeze torch.linspace 2,2,10 dim 1 y x.pow 2 0...