快速上手Pytorch


這篇文章需要大家對深度學(xué)習(xí)里的神經(jīng)網(wǎng)絡(luò)訓(xùn)練有一定的基礎(chǔ)厢蒜,我以前訓(xùn)練網(wǎng)絡(luò)一直都是用的TensorFlow叁征,后面需要把模型和數(shù)據(jù)遷移到Pytorch平臺上去,發(fā)現(xiàn)很多里面有很多知識點需要注意,寫這篇文章一方面是給自己做個筆記梯找,總結(jié)下自己的經(jīng)驗情组,另一方面是為了方便想要快速上手Pytorch的同學(xué)燥筷。這篇文章主要內(nèi)容有:

  • Tensorflow的PlayGround
  • Pytorch介紹和安裝
  • Torch和Torchvision里的常用包
  • Variable、Tensor院崇、Numpy之間的關(guān)系
  • CPU與GPU
  • 示例--GAN生成MINIST數(shù)據(jù)

Tensorflow的PlayGround

PlayGround是一個在線演示肆氓、實驗的神經(jīng)網(wǎng)絡(luò)平臺,是一個入門神經(jīng)網(wǎng)絡(luò)非常直觀的網(wǎng)站底瓣。這個圖形化平臺非常強大谢揪,將神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程直接可視化。假若有的同學(xué)剛剛想入門深度學(xué)習(xí)這一領(lǐng)域捐凭,可以去看看:
PlayGround地址:http://playground.tensorflow.org
這里也有一篇PlayGround介紹寫的非常詳細的文章:
參考地址:https://finthon.com/tensorflow-playground-nn/

Pytorch介紹和安裝


2017年1月拨扶,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。Pytorch和Torch底層實現(xiàn)都用的是C語言茁肠,但是Torch的調(diào)用需要掌握Lua語言患民,相比而言使用Python的人更多,根本不是一個數(shù)量級垦梆,所以Pytorch基于Torch做了些底層修改匹颤、優(yōu)化并且支持Python語言調(diào)用。
它是一個基于Python的可續(xù)計算包托猩,目標(biāo)用戶有兩類:

  1. 使用GPU來運算numpy
  2. 一個深度學(xué)習(xí)平臺印蓖,提供最大的靈活型和速度

如何安裝Pytorch呢?

  • 基礎(chǔ)環(huán)境
    一臺PC設(shè)備京腥、一張高性能NVIDIA顯卡(可選)赦肃、Ubuntu系統(tǒng)
  • 安裝步驟
  1. Anaconda(可選)和Python
  2. 顯卡驅(qū)動和CUDA
  3. 運行Pytorch的安裝命令

Torch和Torchvision里的常用包

Torch

  • torch:張量相關(guān)的運算,例如創(chuàng)建公浪、索引他宛、切片連接因悲、轉(zhuǎn)置堕汞、加減乘除

  • torch.nn:包含搭建網(wǎng)絡(luò)層的模塊(Modules)和一系列的loss函數(shù),例如全連接晃琳、卷積讯检、池化琐鲁、BN批處理dropout人灼、CrossEntropyLoss围段、MSELoss

  • torch.nn.functional:常用的激活函數(shù)reluleaky_relu投放、sigmoid

  • torch.autograd:提供Tensor所有操作的自動求導(dǎo)方法

  • torch.optim:各種參數(shù)優(yōu)化方法奈泪,例如SGDAdaGrad灸芳、RMSProp涝桅、Adam

  • torch.nn.init:可以用它更改nn.Module的默認參數(shù)初始化方式

  • torch.utils.data:用于加載數(shù)據(jù)

Torchvision

  • torchvision.datasets:常用數(shù)據(jù)集,MNIST烙样、COCO冯遂、CIFAR10Imagenet

  • torchvision.models:常用模型谒获,AlextNet蛤肌、VGGResNet批狱、DenseNet

  • torchvision.transforms:圖片相關(guān)處理裸准,裁剪尺寸縮放赔硫、歸一化

  • torchvision.utils:將給定的Tensor保存成image文件

Variable炒俱、Tensor、Numpy之間的關(guān)系

  • Numpy
    NumPy是Python語言的一個擴充程序庫卦停。支持高級大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫向胡。
    例子:
>>> import numpy as np
>>> x=np.array([[1,2,3],[9,8,7],[6,5,4]])
  • Tensor
    PyTorch 提供一種類似 NumPy 的抽象方法來表征張量(或多維數(shù)組)恼蓬,它可以利用 GPU 來加速訓(xùn)練惊完。


  • Variable


  1. PyTorch 張量的簡單封裝
  2. 幫助建立計算圖
  3. Autograd(自動微分庫)的必要部分
  4. 將關(guān)于這些變量的梯度保存在 .grad 中
  • Tensor、Variable处硬、Numpy之間相互轉(zhuǎn)化
  1. 將Numpy矩陣轉(zhuǎn)換為Tensor張量
    sub_ts = torch.from_numpy(sub_img)
  2. 將Tensor張量轉(zhuǎn)化為Numpy矩陣
    sub_np1 = sub_ts.numpy()
  3. 將Tensor轉(zhuǎn)換為Variable
    sub_va = Variable(sub_ts)
  4. 將Variable轉(zhuǎn)換為Tensor
    sub_np2 = sub_va.data

CPU與GPU

Pytorch支持CPU運行小槐,但是速度非常慢,一張好的NVIDIA顯卡能夠大大減少網(wǎng)絡(luò)訓(xùn)練時間荷辕,以我自己經(jīng)驗來看凿跳,15年MacBook Pro 與戴爾工作站附加一張顯存11GB的1080ti顯卡相比,后者速度是前者速度的224倍疮方,尤其訓(xùn)練復(fù)雜網(wǎng)絡(luò)一定要在GPU上跑控嗜。Pytorch中把數(shù)據(jù)和模型從CPU遷移到GPU非常簡單:


直接對變量、張量骡显、模型使用.cuda()即可把他們遷移到GPU上疆栏,反過來遷移到CPU上曾掂,使用.cpu()
當(dāng)有多行顯卡時壁顶,想充分利用它們珠洗,則可使用model = nn.DataParallel(model)命令:

常見問題

  • 這里的不同位置包含GPU與CPU,還包含不同GPU之間
  • 不同位置的Variable之間不能直接相互運算
  • 不同位置的Tensor直接不能直接相互運算
  • 不同位置的Variable模型不能直接訓(xùn)練
  • 使用指定顯卡:.cuda(<顯卡號數(shù)>)

示例--GAN生成MINIST數(shù)據(jù)

最后看個實例若专,如何使用GAN網(wǎng)絡(luò)生成MINIST 數(shù)據(jù)许蓖,主要內(nèi)容有:


MNIST數(shù)據(jù)集

MNIST數(shù)據(jù)集是一個手寫體數(shù)據(jù)集,圖片大小都是28x28调衰,包含0-9共10個數(shù)字膊爪,各種風(fēng)格:



下載好的數(shù)據(jù)集:


測試集t10k開頭,訓(xùn)練集train開頭嚎莉,images是圖片蚁飒,labels是標(biāo)簽

GAN網(wǎng)絡(luò)模型


輸入100長度的噪聲向量,經(jīng)過一個全連接萝喘,兩個卷積層淮逻,一個下采樣之后生成成28x28大小的圖片,這一部分是生成器
生成的假圖片和MNIST里的真圖片經(jīng)過兩個卷積層下采樣之后阁簸,再次經(jīng)歷兩個全連接層后輸出一個1長度的單位向量爬早,1代表輸入圖片為真,0代表輸入圖片為假

GAN訓(xùn)練和Loss



訓(xùn)練判別器D時启妹,要使得V整體變大筛严,訓(xùn)練生成器G時,要使得V整體變小饶米。
這是一個博弈的過程桨啃,就像制造假錢的犯罪團伙和驗鈔機的關(guān)系,犯罪團伙需要努力提高技術(shù)檬输,讓驗鈔機無法識別出來其制造的假幣照瘾,而驗鈔機要能夠正確的分辨出真正的紙幣還有假幣。
理論上當(dāng)判別器D只有一半的概率0.5能識別出假圖片時丧慈,就已經(jīng)收斂了析命,實際上達不到一半的概率,沒關(guān)系逃默,使得假圖片概率盡量高就行了鹃愤,最終看上去效果不錯。
這是一張由生成器生成的假圖片完域,你能區(qū)分出來嗎软吐?

可視化

可視化方式有兩種,一種是利用torchvision里面的包 torchvision.utils吟税,另外一種是利用visdom插件凹耙,下面是二者的對比:


上面那張生成的假圖片就是利用torchvision.utils里的save_image函數(shù)來存儲在本地的鸟蟹。
而以下這張圖是利用visdom,在瀏覽器中查看到的效果:

visdom不光可以查看圖片使兔,還可以查看loss變化曲線圖等各種功能建钥。

具體的代碼實現(xiàn)去工程里查看,這里給出分享地址:
https://github.com/gcfrun/GAN_MNIST_Pytorch
mnist_data.py:數(shù)據(jù)輸入模塊
mnist_net.py:網(wǎng)絡(luò)模型模塊
mnist_loss.py:Loss計算模塊
mnist_train.py:迭代訓(xùn)練模塊
mnist_visual.py:可視化模塊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虐沥,一起剝皮案震驚了整個濱河市熊经,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欲险,老刑警劉巖镐依,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異天试,居然都是意外死亡槐壳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門喜每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來务唐,“玉大人,你說我怎么就攤上這事带兜》愕眩” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵刚照,是天一觀的道長刑巧。 經(jīng)常有香客問我,道長无畔,這世上最難降的妖魔是什么啊楚? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮浑彰,結(jié)果婚禮上恭理,老公的妹妹穿的比我還像新娘。我一直安慰自己闸昨,他們只是感情好蚯斯,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饵较,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遭赂。 梳的紋絲不亂的頭發(fā)上循诉,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音撇他,去河邊找鬼茄猫。 笑死狈蚤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的划纽。 我是一名探鬼主播脆侮,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勇劣!你這毒婦竟也來了靖避?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤比默,失蹤者是張志新(化名)和其女友劉穎幻捏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體命咐,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡篡九,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醋奠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榛臼。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窜司,靈堂內(nèi)的尸體忽然破棺而出讽坏,到底是詐尸還是另有隱情,我是刑警寧澤例证,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布路呜,位于F島的核電站,受9級特大地震影響织咧,放射性物質(zhì)發(fā)生泄漏胀葱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一笙蒙、第九天 我趴在偏房一處隱蔽的房頂上張望抵屿。 院中可真熱鬧,春花似錦捅位、人聲如沸轧葛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尿扯。三九已至,卻和暖如春焰雕,著一層夾襖步出監(jiān)牢的瞬間衷笋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工矩屁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辟宗,地道東北人爵赵。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像泊脐,于是被迫代替她去往敵國和親空幻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361