pytorch和python有什么区别_PyTorch到底好用在哪里?
先來回答一下你提的幾個問題:Pytorch連最基本的maximum, minimum, tile等等這些numpy和tensorflow中最簡單的運算都沒有,用view來reshape還會報錯contiguous(雖然我知道怎么解決),官方手冊也查不到相應說明,這個東西到底好用在哪里?
你說的那幾個函數pytorch中都有(或者可以實現)maximum: torch.max() 同時包含了numpy.max 和numpy.maximum的功能
minimum:torch.min()
np.tile(arr,(100,100)) 等價于 tensor.repeat(100,100)
contiguous的問題我經常聽別人提問,但我從未遇到過(我幾乎從未調用過`tensor.contiguous()`),大多數人也很少會把tensor弄成不連續。之所以tensor會不連續,是為了能夠共享內存,更高效的內存利用(其實只要PyTorch在設計的時候把所有的不連續操作都返回一個連續的tensor即可解決這個問題,但是不值得,大多數不連續的tensor都會進行一個reduce操作,然后就變成了連續的了)。
numpy那么多函數,PyTorch不可能都支持,即使不支持,也可以在numpy中實現,然后轉成tensor,畢竟numpy和tensor之間的轉換極其高效快速(他們共享內存).這個東西到底好用在哪里?
還是說就是定義網絡結構簡單?
PyTorch到底好在哪,其實我也只是有個朦朧的感覺,總覺的用的舒服自在,用其它框架的時候總是覺得這里或者那里別扭。第一次用PyTorch幾乎是無痛上手,而且隨著使用的增加,更是越來越喜歡:
PyTorch不僅僅是定義網絡結構簡單,而且還很直觀靈活。靜態圖的網絡定義都是聲明式的,而動態圖可以隨意的調用函數(if,for,list什么的隨便用),兩者的差距不是一點點。網絡的定義在任何框架中都應該是屬于最基礎最簡單的一個內容,即使是接口繁多的tensorflow,通過不斷的查文檔,新手也能把模型搭起來或者是看懂別人的模型。這個PyTorch也不例外,它的優勢在于模型定義十分直觀易懂,很容易看懂看別人寫的代碼。可以看看pytorch/vision 里面的幾個經典的網絡定義,我覺得很難找到比它更簡潔易懂的模型定義了。
網絡模型定義只是很基礎的一部分,更重要的是模型的使用。比如在使用預訓練模型finetue時,我們需要修改預訓練模型某些層,新增某些層,刪除某些層,新增的層希望給他較高的學習率,之前預訓練的層希望學習率設為0。scene-baseline 是我前幾天為AI challenger 場景分類寫的baseline,可以參考一下,只用了幾行代碼就實現了預訓練模型finetune(新增某些層,刪除某些層,修改某些層),以及為不同層設置不同學習率 scene-baseline-optimizer 。
再比如在盡可能不修改原來模型源代碼的情況下,獲取預訓練好模型的某些層的輸出(Fast Neural Style需要用到),或者是使用多個預訓練好的子模型,分別初始化一個復雜模型的某一部分,因為子模型的結構都是相似的,所以可以讓這些子模型共享某些層的參數(知乎看山杯我就用了這個策略。表述的可能很復雜,其實在模型的構建只用了幾行)
談太多框架的使用,可能比較枯燥,只有你自己用了才知道,PyTorch真的是越用越順手。
下面說幾點其它的看法,沒有什么條理,不論證舉例,只說想法,只是個人看法,不必太認真:
1.PyTorch比TF更符合Unix/Python哲學
Unix哲學:做一件事,并把它做好。(真的要在做實驗的時候考慮如何把模型部署到手機,利用TPU加速?)
Unix哲學:KISS(keep it simple, stupid)。github上TF有接近100萬行代碼,PyTorch只有它的十分之一多一點。TensorFlow創造了 圖、會話、命名空間、PlaceHolder 等一大堆全新的概念,簡直就是一門新的語言。TensorFlow是Make It Complicated ,TensorFlow+Keras是Make It Complicated And Hide It。而Keras的Hide it又違反了Python的哲學(扁平勝于嵌套 ),喪失了靈活性。而PyTorch就是tensor-autograd-nn 三級封裝~ 簡潔易懂
Python之禪:盡量找一種,最好是唯一一種直觀易懂的實現方案(猜猜TF中RNN有多少種實現,猜猜除了Keras、Sonnet、TFLearn、TensorLayer、Slim、PrettyLayer之外tensorflow還有多少個第三方API )。PyTorch的不同人寫的代碼都差不多,很容易看懂。The Zen of Python, by Tim Peters
優美勝于丑陋
明了勝于晦澀
簡潔勝于復雜 復雜勝于凌亂
扁平勝于嵌套
間隔勝于緊湊
可讀性很重要
即便假借特例的實用性之名,也不可違背這些規則
不要包容所有錯誤,除非你確定需要這樣做
當存在多種可能,不要嘗試去猜測
而是盡量找一種,最好是唯一一種直觀易懂的實現方案雖然這并不容易,因為你不是 Python 之父
做也許好過不做,但不假思索就動手還不如不做
如果你很難向人描述你的實現,那肯定不是一個好實現命名空間是一種絕妙的理念,我們應當多加利用
如果你很難向人描述你的實現,那肯定不是一個好實現
2.快速
在大多數人寫的代碼中PyTorch都比TensorFlow快,并不是說TensorFlow慢,只是你要用TensorFlow寫出同等速度的代碼會稍微困難一些(單單是數據加載這一塊就會難倒許多人)
3.強大的社區
facebook的FAIR強力支持,FAIR是全球TOP3的AI研究機構。PyTorch論壇,文檔,tutorial,一應俱全。FAIR的幾位工程師更是全職維護開發,github上PyTorch每天都有許多pull request和討論。
你很難聽到有誰說TF好用,最多是諸如谷歌支持,社區強大,文檔完善,功能齊全等等。但是PyTorch你只要深度用過一段時間,就會喜歡上它的。很多人自來水安利PyTorch,當然不是facebook給錢,或者是博得多少點擊量,真的是因為它太好用了。
其實關于TensorFlow還有一點讓我頗為不滿的是,現在媒體總是覺得谷歌的東西就是最好的,每回TensorFlow有什么更新,都要搞個大新聞。而且,谷歌喜歡把一個項目的目標當成這個項目的特點來宣傳,但是TensorFlow的實際表現,配不上它的名氣。
4.簡潔易懂的代碼
一個框架你不懂源碼,你就不能完全掌握它的運行原理,像tensorflow的`sess.run`簡直就是個黑箱。而PyTorch幾乎是我用過框架中源碼最易懂的,任何一個操作,不論多么高級復雜,都能輕松的找到它對應tensor操作(Caffe/tinydnn也挺簡潔的,但是我的C++比較渣)
nn.Module代碼是PyTorch中對所有模型對象的封裝,我覺得幾乎所有人都應該看看,深度學習框架的設計可以很簡單!現在Gluon,Sonnet,nnabla等框架也都開始模仿這個設計api~
5.快速實現
深度學習煉丹的過程中,我們肯定都有許多奇思妙想,但這些奇思妙想需要做實驗來驗證。如果實現比較困難費時,在不確定這個想法是否有效的情況下,我們很容易打退堂鼓。PyTorch可以解放你的想法,用tensor的思維思考代碼,一切操作皆tensor,一切tensor能做的,PyTorch都能做到,而且做的像操作tensor一樣。
用TensorFlow 我能找到很多別人的代碼
用PyTorch 我能輕松實現自己的想法
而且github上很多tensorflow的代碼也不能跑了不是嗎?畢竟TF常年一步一大更新,不怎么考慮向后兼容。隨著同學的更新TF,我眼睜睜看的我的TF代碼從運行正常,到警告,到報錯
PyTorch實現的項目在github上也有很多,不是嗎?基本上所有的研究方向都能找到質量很高的PyTorch開源方案。
6.關于PyTorch的幾個誤解
PyTorch社區不強大 ?:看上文
PyTorch 文檔不齊全?:我覺得PyTorch的文檔幾乎是所有框架中最好的,這些文檔都是作者在設計的時候就寫好的,不是別人看著代碼,憑借著自己理解寫的。 而且PyTorch文檔中的給出了很多示例,在IPython下可以直接拷貝運行,做實驗測試。
PyTorch中沒有TensorBoard? lanpa/tensorboard-pytorch 不僅功能強大(支持Tensorboard幾乎所有的操作,連計算圖都支持,只是顯示效果不好),而且接口簡單(比tf的tensorboard api易用)。而且除了Tensorboard還有Visdom可以用~
PyTorch動態圖性能比較差?見上文,同等水平的人用PyTorch寫出來的代碼普遍要比TensorFlow快。當然我認為極限情況下TensorFlow會比PyTorch快,詳情可以看TensorFlow官方的benchmark,只是寫的代碼很復雜,普通用戶寫不出來。
總感覺表述有點匱乏,表達也不是很流暢,還有很多沒表達出來的。可以看看其他人是怎么說的:
PyTorch和TensorFlow到底哪個更好?看看一線開發者怎么說 (帖子是3月份初發的,這時候PyTorch才發布一個多月,但幾乎所有用過的人已經都在夸贊)
總結
以上是生活随笔為你收集整理的pytorch和python有什么区别_PyTorch到底好用在哪里?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android布局的属性,android
- 下一篇: 如何截取_【实用技巧】如何截取网页长图