pytorch是facebook在深度學習框架torch基礎上使用python重寫的深度學習框架
安裝pytorch便捷方法是登錄官網(https://pytorch.org/get-started/locally/)選擇匹配的版本進行下載
1. pytorch中的tensor
tensor意爲張量,即區別於標量的多維數據
1.1 tensor的數據類型
和numpy差不多,tensor中的數據類型有自己的定義方式
1.1.1 torch.FloatTensor
生成數據爲浮點型的tensor,參數可以是一個列表,也可以是一個維度值
import torch
a=torch.FloatTensor(2,3)
print(a)
b=torch.FloatTensor([1,2,3,4])
print(b)
輸出如下
1.1.2 torch.IntTensor
生成整形張量,同理於floattensor
a=torch.IntTensor(3,4)
print(a)
b=torch.IntTensor([2,4,6,8])
print(b)
輸出如下:
1.1.3 torch.rand
生成數據爲浮點型指定維度的隨機tensor,在0~1之間均勻分佈
a=torch.rand(2,3)
print(a)
1.1.4 torch.randn
生成浮點型指定維度的tensor,滿足均值爲0,方差爲1的正態分佈
1.1.5 arange
開始用的是range,不過在版本升級之後官方改成了arange
生成浮點型且指定首尾範圍的tensor,參數有三個,分別是起始範圍值,結束範圍值,步長
a=torch.arange(1,20,2)
print(a)
1.1.6 torch.zeros
生成浮點類型指定維度的全0tensor
a=torch.zeros(3,5)
print(a)
1.2 tensor的運算
- abs:返回輸出參數tensor的絕對值
- add:返回輸入參數的求和結果,可以對tensor間求和,也可以對tensor和標量求和(各對應元素相加)
- clamp:對參數變量按照自定義範圍進行裁剪,有三個參數,分別是待操作的tensor變量,裁剪上邊界,裁剪下邊界,具體的裁剪過程是:對於每個元素x,假定裁剪上邊界a,下邊界爲b,x<b取b,b<x<a取x,a<x取a,即裁剪之後保證每個元素都落在上下邊界裏。
- div:求商,同add,可以是tenso之間或者tensor與標量(各對應元素相除)
- mul:求積,同div
- pow:求冪,同div
- mm:矩陣乘法
- mv:矩陣與向量乘法,第一個參數是矩陣,第二個參數必須是與矩陣列數相等的一維向量
a=torch.randn(2,3)
print("a\n",a)
print("a的絕對值: \n",torch.abs(a))
b=torch.randn(2,3)
print("b\n",b)
print("a+b: \n",torch.add(a,b))
print("a+1:\n",torch.add(a,1))
print("clamp裁剪:\n",torch.clamp(a,0.5,-0.5))
print("a/b\n",torch.div(a,b))
print("a/2\n",torch.div(a,2))
print("a*b\n",torch.mul(a,b))
print("a*10\n",torch.mul(a,10))
print("a**b\n",torch.pow(a,b))
print("a**2\n",torch.pow(a,2))
a=torch.ones(2,3)
print("a\n",a)
b=torch.ones(3,2)
print("b\n",b)
print("aXb\n",torch.mm(a,b))
c=torch.ones(3)
print("c\n",c)
print("a·c\n",torch.mv(a,c))
輸出如下:
1.3 搭建一個簡易神經網絡
import torch
batch_n=100
hidden_layer =100
input_data=1000
output_data=10
首先導入包,然後聲明四個整型變量,batchn表示輸入數據的數量,hiddenlayer表示經過隱藏層保留的數據特徵個數,inputdate表示輸入數據的數據特徵個數,outputdata就表示輸出數據的數據特徵個數
這裏賦值之後的含義就變成輸入的數據是100條,每條數據有1000特徵,經過隱藏層之後變成了100個特徵,最後輸出時變成10個特徵,這10個特徵就可以看成是輸出結果屬於十個類別的可能性
x=torch.randn(batch_n,input_data)
y=torch.randn(batch_n,output_data)
w1=torch.randn(input_data,hidden_layer)
w2=torch.randn(hidden_layer,output_data)
因爲沒有引入真正的樣本數據,所以我們隨機生成滿足維度要求的輸入輸出張量x,y,也隨機初始化w1和w2兩層神經網絡,可以把數據經過網絡看成是矩陣的乘法運算,這樣就可以掌握參數維度的定義
epoch_n=20
learning_rate=1e-6
這裏定義了循環次數和學習速率,循環次數就是我們要用這兩層網絡反覆處理多少遍數據,學習速率就是改變梯度相關參數時的幅度,學習速率大,參數就改變的劇烈,結果也改變的劇烈,學習速率小改變的幅度小,可以逐漸接近期望值,不會剎不住車
for each in range(epoch_n):
h1=x.mm(w1)
h1=h1.clamp(min=0)
y_pred=h1.mm(w2)
loss=(y_pred-y).pow(2).sum()
print("Epoch:{},Loss:{:.4f}".format(each,loss))
grad_y_pred=2*(y_pred-y)
grad_w2=h1.t().mm(grad_y_pred)
grad_h=grad_y_pred.clone()
grad_h=grad_h.mm(w2.t())
grad_h.clamp(min=0)
grad_w1=x.t().mm(grad_h)
w1 -= learning_rate*grad_w1
w2 -= learning_rate*grad_w2
這各循環就是神經網絡的核心,首先根據指定的循環次數epoch進行循環,在每層循環中,首先將輸入數據x(100,1000)和第一層網絡w1(1000,100)相乘,此時h1變成(100,100),隨後使用裁剪函數,過濾掉小於零的值,這就是常見的Relu激活方法,隨後h1(100,100)再次乘w2(100,10),獲得的預測結果ypred就是滿足輸出要求的(100,10),這個結果是我們第一輪預測的結果,隨後我們要與期望結果y進行比較,來確定誤差,比較的方法就是求標準差,二者差值的平方和,得到損失函數loss,然後使用format在每次循環都輸出loss,通過loss的大小可以直觀判斷預測結果距離期望結果的誤差大小,隨後就是根據梯度的反向傳播,更新參數網絡w1,w2的過程,再重複執行20次循環後,我們可以從輸出結果直觀看出loss逐漸變小,預測結果在逐漸接近期望值,這就是神經網絡的基本過程