深度學習pytorch基礎

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逐漸變小,預測結果在逐漸接近期望值,這就是神經網絡的基本過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章