PyTorch 基礎筆記

?PyTorch基礎筆記,變量與計算.

Torch 很好用, 但是 Lua 又不是特別流行, 所有開發(fā)團隊將 Lua 的 Torch 移植到了更流行的語言 Python 上,所以就有了PyTorch.

對比TensorFlow

PyTorch最大優(yōu)點就是建立的神經網絡是動態(tài)的, 對比靜態(tài)的 Tensorflow, 他能更有效地處理一些問題, 比如說 RNN 變化時間長度的輸出. Tensorflow 自己說自己在分布式訓練上下了很大的功夫, 那我就默認 Tensorflow 在這一點上要超出 PyTorch, 但是 Tensorflow 的靜態(tài)計算圖使得他在 RNN 上有一點點被動 (雖然它用其他途徑解決了), 不過用 PyTorch 的時候, 你會對這種動態(tài)的 RNN 有更好的理解.

而且 Tensorflow 的高度工業(yè)化, 它的底層代碼… 你是看不懂的. PyTorch 好那么一點點, 如果你深入 API, 你至少能比看 Tensorflow 多看懂一點點 PyTorch 的底層在干嘛.

Numpy 和 Torch

Torch 自稱為神經網絡界的 Numpy, 因為他能將 torch 產生的 tensor 放在 GPU 中加速運算 (前提是你有合適的 GPU), 就像 Numpy 會把 array 放在 CPU 中加速運算.所以神經網絡用 Torch 的 tensor 形式數據是最好的. 就像 Tensorflow 當中的 tensor 一樣.

PyTorch把 torch 做的和 numpy 能很好的兼容.

比如這樣就能自由地轉換 numpy array 和 torch tensor 了:

import torch
import numpy as np

np_data = np.arange(6).reshape((2, 3))
torch_data = torch.from_numpy(np_data)
tensor2array = torch_data.numpy()
print(
    '\nnumpy array:', np_data,          # [[0 1 2], [3 4 5]]
    '\ntorch tensor:', torch_data,      #  0  1  2 \n 3  4  5    [torch.LongTensor of size 2x3]
    '\ntensor to array:', tensor2array, # [[0 1 2], [3 4 5]]
)

Torch中的數學計算

其實 torch 中 tensor 的運算和 numpy array 的如出一轍, 我們就以對比的形式來看.如果想了解 torch 中其它更多有用的運算符, 可以查閱API.

# abs 絕對值計算
data = [-1, -2, 1, 2]
tensor = torch.FloatTensor(data)  # 轉換成32位浮點 tensor
print(
    '\nabs',
    '\nnumpy: ', np.abs(data),          # [1 2 1 2]
    '\ntorch: ', torch.abs(tensor)      # [1 2 1 2]
)

# sin   三角函數 sin
print(
    '\nsin',
    '\nnumpy: ', np.sin(data),      # [-0.84147098 -0.90929743  0.84147098  0.90929743]
    '\ntorch: ', torch.sin(tensor)  # [-0.8415 -0.9093  0.8415  0.9093]
)

# mean  均值
print(
    '\nmean',
    '\nnumpy: ', np.mean(data),         # 0.0
    '\ntorch: ', torch.mean(tensor)     # 0.0
)

除了簡單的計算, 矩陣運算才是神經網絡中最重要的部分.

所以展示矩陣的乘法. 注意一下包含了一個 numpy 中可行, 但是 torch 中不可行的方式.

# matrix multiplication 矩陣點乘
data = [[1,2], [3,4]]
tensor = torch.FloatTensor(data)  # 轉換成32位浮點 tensor
# correct method
print(
    '\nmatrix multiplication (matmul)',
    '\nnumpy: ', np.matmul(data, data),     # [[7, 10], [15, 22]]
    '\ntorch: ', torch.mm(tensor, tensor)   # [[7, 10], [15, 22]]
)

# !!!!  下面是錯誤的方法 !!!!
data = np.array(data)
print(
    '\nmatrix multiplication (dot)',
    '\nnumpy: ', data.dot(data),        # [[7, 10], [15, 22]] 在numpy 中可行
    '\ntorch: ', tensor.dot(tensor)     # torch 會轉換成 [1,2,3,4].dot([1,2,3,4) = 30.0
)

變量Variable

在 Torch 中的 Variable 就是一個存放會變化的值的地理位置. 里面的值會不停的變化. 如果用一個 Variable 進行計算, 那返回的也是一個同類型的 Variable.

定義一個 Variable:

import torch
from torch.autograd import Variable # torch 中 Variable 模塊


tensor = torch.FloatTensor([[1,2],[3,4]])

variable = Variable(tensor, requires_grad=True)

print(tensor)
"""
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable)
"""
Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

Variable 計算, 梯度

再對比一下 tensor 的計算和 variable 的計算.

t_out = torch.mean(tensor*tensor)       # x^2
v_out = torch.mean(variable*variable)   # x^2
print(t_out)
print(v_out)    # 7.5

到目前為止, 看不出什么不同, 但是時刻記住, Variable 計算時, 它在背景幕布后面一步步默默地搭建著一個龐大的系統(tǒng),叫做計算圖, computational graph. 這個圖是用來將所有的計算步驟 (節(jié)點) 都連接起來,最后進行誤差反向傳遞的時候, 一次性將所有 variable 里面的修改幅度 (梯度) 都計算出來, tensor 沒有這個能力.

v_out = torch.mean(variable*variable) 就是在計算圖中添加的一個計算步驟, 計算誤差反向傳遞的時候有他一份功勞,
我們就來舉個例子:

v_out.backward()    # 模擬 v_out 的誤差反向傳遞

# Variable 是計算圖的一部分, 可以用來傳遞誤差.
# v_out = 1/4 * sum(variable*variable) 這是計算圖中的 v_out 計算步驟
# 針對于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2

print(variable.grad)    # 初始 Variable 的梯度
'''
 0.5000  1.0000
 1.5000  2.0000
'''

獲取 Variable 里面的數據

直接print(variable)只會輸出 Variable 形式的數據, 在很多時候是用不了的(比如想要用 plt 畫圖),
所以我們要轉換一下, 將它變成 tensor 形式.

print(variable)     #  Variable 形式
"""
Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data)    # tensor 形式
"""
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data.numpy())    # numpy 形式
"""
[[ 1.  2.]
 [ 3.  4.]]
"""
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末婶恼,一起剝皮案震驚了整個濱河市校镐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌赘风,老刑警劉巖娇斩,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁卷,死亡現場離奇詭異,居然都是意外死亡犬第,警方通過查閱死者的電腦和手機锦积,發(fā)現死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉嗓,“玉大人丰介,你說我怎么就攤上這事〖郑” “怎么了哮幢?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長志珍。 經常有香客問我橙垢,道長,這世上最難降的妖魔是什么伦糯? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任钢悲,我火速辦了婚禮,結果婚禮上舔株,老公的妹妹穿的比我還像新娘。我一直安慰自己还棱,他們只是感情好载慈,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著珍手,像睡著了一般办铡。 火紅的嫁衣襯著肌膚如雪辞做。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天寡具,我揣著相機與錄音秤茅,去河邊找鬼。 笑死童叠,一個胖子當著我的面吹牛框喳,可吹牛的內容都是我干的。 我是一名探鬼主播厦坛,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼五垮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杜秸?” 一聲冷哼從身側響起放仗,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撬碟,沒想到半個月后诞挨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡呢蛤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年惶傻,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾稀。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡达罗,死狀恐怖,靈堂內的尸體忽然破棺而出静秆,到底是詐尸還是另有隱情粮揉,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布抚笔,位于F島的核電站扶认,受9級特大地震影響,放射性物質發(fā)生泄漏殊橙。R本人自食惡果不足惜辐宾,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膨蛮。 院中可真熱鬧叠纹,春花似錦、人聲如沸敞葛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹谐。三九已至持偏,卻和暖如春驼卖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿秆。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工酌畜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卿叽。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓桥胞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親附帽。 傳聞我的和親對象是個殘疾皇子埠戳,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容