導航:首頁 > 編程語言 > python論文摘要

python論文摘要

發布時間:2023-03-21 11:39:52

A. python數據挖掘技術及應用論文怎麼寫

python數據挖掘技術及應用論文選題如下:
1、基於關鍵冊肆詞的文本知識型姿明的挖掘系統的設計與實現。
2、基於MapRece的氣候數據的分析。
3、基於概率圖模型的蛋白質功能預測。
4、基於第三方庫的人臉識別系統的設計與實現。
5、基於hbase搜卜告索引擎的設計與實現。
6、基於Spark-Streaming的黑名單實時過濾系統的設計與實現。
7、客戶潛在價值評估系統的設計與實現。
8、基於神經網路的文本分類的設計與實現。

B. 萬字干貨,Python語法大合集,一篇文章帶你入門

這份資料非常純粹,只有Python的基礎語法,專門針對想要學習Python的小白。

Python中用#表示單行注釋,#之後的同行的內容都會被注釋掉。

使用三個連續的雙引號表示多行注釋,兩個多行注釋標識之間內容會被視作是注釋。

Python當中的數字定義和其他語言一樣:

我們分別使用+, -, *, /表示加減乘除四則運算符。

這里要注意的是,在Python2當中,10/3這個操作會得到3,而不是3.33333。因為除數和被除數都是整數,所以Python會自動執行整數的計算,幫我們把得到的商取整。如果是10.0 / 3,就會得到3.33333。目前Python2已經不再維護了,可以不用關心其中的細節。

但問題是Python是一個 弱類型 的語言,如果我們在一個函數當中得到兩個變數,是無法直接判斷它們的類型的。這就導致了同樣的計算符可能會得到不同的結果,這非常蛋疼。以至於程序員在運算除法的時候,往往都需要手工加上類型轉化符,將被除數轉成浮點數。

在Python3當中撥亂反正,修正了這個問題,即使是兩個整數相除,並且可以整除的情況下,得到的結果也一定是浮點數。

如果我們想要得到整數,我們可以這么操作:

兩個除號表示 取整除 ,Python會為我們保留去除余數的結果。

除了取整除操作之外還有取余數操作,數學上稱為取模,Python中用%表示。

Python中支持 乘方運算 ,我們可以不用調用額外的函數,而使用**符號來完成:

當運算比較復雜的時候,我們可以用括弧來強制改變運算順序。

Python中用首字母大寫的True和False表示真和假。

用and表示與操作,or表示或操作,not表示非操作。而不是C++或者是Java當中的&&, || 和!。

在Python底層, True和False其實是1和0 ,所以如果我們執行以下操作,是不會報錯的,但是在邏輯上毫無意義。

我們用==判斷相等的操作,可以看出來True==1, False == 0.

我們要小心Python當中的bool()這個函數,它並不是轉成bool類型的意思。如果我們執行這個函數,那麼 只有0會被視作是False,其他所有數值都是True

Python中用==判斷相等,>表示大於,>=表示大於等於, <表示小於,<=表示小於等於,!=表示不等。

我們可以用and和or拼裝各個邏輯運算:

注意not,and,or之間的優先順序,其中not > and > or。如果分不清楚的話,可以用括弧強行改變運行順序。

關於list的判斷,我們常用的判斷有兩種,一種是剛才介紹的==,還有一種是is。我們有時候也會簡單實用is來判斷,那麼這兩者有什麼區別呢?我們來看下面的例子:

Python是全引用的語言,其中的對象都使用引用來表示。is判斷的就是 兩個引用是否指向同一個對象 ,而==則是判斷兩個引用指向的具體內容是否相等。舉個例子,如果我們把引用比喻成地址的話,is就是判斷兩個變數的是否指向同一個地址,比如說都是沿河東路XX號。而==則是判斷這兩個地址的收件人是否都叫張三。

顯然,住在同一個地址的人一定都叫張三,但是住在不同地址的兩個人也可以都叫張三,也可以叫不同的名字。所以如果a is b,那麼a == b一定成立,反之則不然。

Python當中對字元串的限制比較松, 雙引號和單引號都可以表示字元串 ,看個人喜好使用單引號或者是雙引號。我個人比較喜歡單引號,因為寫起來方便。

字元串也支持+操作,表示兩個字元串相連。除此之外,我們把兩個字元串寫在一起,即使沒有+,Python也會為我們拼接:

我們可以使用[]來查找字元串當中某個位置的字元,用 len 來計算字元串的長度。

我們可以在字元串前面 加上f表示格式操作 ,並且在格式操作當中也支持運算,比如可以嵌套上len函數等。不過要注意,只有Python3.6以上的版本支持f操作。

最後是None的判斷,在Python當中None也是一個對象, 所有為None的變數都會指向這個對象 。根據我們前面所說的,既然所有的None都指向同一個地址,我們需要判斷一個變數是否是None的時候,可以使用is來進行判斷,當然用==也是可以的,不過我們通常使用is。

理解了None之後,我們再回到之前介紹過的bool()函數,它的用途其實就是判斷值是否是空。所有類型的 默認空值會被返回False ,否則都是True。比如0,"",[], {}, ()等。

除了上面這些值以外的所有值傳入都會得到True。

Python當中的標准輸入輸出是 input和print

print會輸出一個字元串,如果傳入的不是字元串會自動調用__str__方法轉成字元串進行輸出。 默認輸出會自動換行 ,如果想要以不同的字元結尾代替換行,可以傳入end參數:

使用input時,Python會在命令行接收一行字元串作為輸入。可以在input當中傳入字元串,會被當成提示輸出:

Python支持 三元表達式 ,但是語法和C++不同,使用if else結構,寫成:

上段代碼等價於:

Python中用[]表示空的list,我們也可以直接在其中填充元素進行初始化:

使用append和pop可以在list的末尾插入或者刪除元素:

list可以通過[]加上下標訪問指定位置的元素,如果是負數,則表示 倒序訪問 。-1表示最後一個元素,-2表示倒數第二個,以此類推。如果訪問的元素超過數組長度,則會出發 IndexError 的錯誤。

list支持切片操作,所謂的切片則是從原list當中 拷貝 出指定的一段。我們用start: end的格式來獲取切片,注意,這是一個 左閉右開區間 。如果留空表示全部獲取,我們也可以額外再加入一個參數表示步長,比如[1:5:2]表示從1號位置開始,步長為2獲取元素。得到的結果為[1, 3]。如果步長設置成-1則代表反向遍歷。

如果我們要指定一段區間倒序,則前面的start和end也需要反過來,例如我想要獲取[3: 6]區間的倒序,應該寫成[6:3:-1]。

只寫一個:,表示全部拷貝,如果用is判斷拷貝前後的list會得到False。可以使用del刪除指定位置的元素,或者可以使用remove方法。

insert方法可以 指定位置插入元素 ,index方法可以查詢某個元素第一次出現的下標。

list可以進行加法運算,兩個list相加表示list當中的元素合並。 等價於使用extend 方法:

我們想要判斷元素是否在list中出現,可以使用 in關鍵字 ,通過使用len計算list的長度:

tuple和list非常接近,tuple通過()初始化。和list不同, tuple是不可變對象 。也就是說tuple一旦生成不可以改變。如果我們修改tuple,會引發TypeError異常。

由於小括弧是有改變優先順序的含義,所以我們定義單個元素的tuple, 末尾必須加上逗號 ,否則會被當成是單個元素:

tuple支持list當中絕大部分操作:

我們可以用多個變數來解壓一個tuple:

解釋一下這行代碼:

我們在b的前面加上了星號, 表示這是一個list 。所以Python會在將其他變數對應上值的情況下,將剩下的元素都賦值給b。

補充一點,tuple本身雖然是不可變的,但是 tuple當中的可變元素是可以改變的 。比如我們有這樣一個tuple:

我們雖然不能往a當中添加或者刪除元素,但是a當中含有一個list,我們可以改變這個list類型的元素,這並不會觸發tuple的異常:

dict也是Python當中經常使用的容器,它等價於C++當中的map,即 存儲key和value的鍵值對 。我們用{}表示一個dict,用:分隔key和value。

。我們用{}表示一個dict,用:分隔key和value。

dict的key必須為不可變對象,所以 list、set和dict不可以作為另一個dict的key ,否則會拋出異常:

我們同樣用[]查找dict當中的元素,我們傳入key,獲得value,等價於get方法。

我們可以call dict當中的keys和values方法,獲取dict當中的所有key和value的集合,會得到一個list。在Python3.7以下版本當中,返回的結果的順序可能和插入順序不同,在Python3.7及以上版本中,Python會保證返回的順序和插入順序一致:

我們也可以用in判斷一個key是否在dict當中,注意只能判斷key。

如果使用[]查找不存在的key,會引發KeyError的異常。如果使用 get方法則不會引起異常,只會得到一個None

setdefault方法可以 為不存在的key 插入一個value,如果key已經存在,則不會覆蓋它:

我們可以使用update方法用另外一個dict來更新當前dict,比如a.update(b)。對於a和b交集的key會被b覆蓋,a當中不存在的key會被插入進來:

我們一樣可以使用del刪除dict當中的元素,同樣只能傳入key。

Python3.5以上的版本支持使用**來解壓一個dict:

set是用來存儲 不重復元素 的容器,當中的元素都是不同的,相同的元素會被刪除。我們可以通過set(),或者通過{}來進行初始化。注意當我們使用{}的時候,必須要傳入數據,否則Python會將它和dict弄混。

set當中的元素也必須是不可變對象,因此list不能傳入set。

可以調用add方法為set插入元素:

set還可以被認為是集合,所以它還支持一些集合交叉並補的操作。

set還支持 超集和子集的判斷 ,我們可以用大於等於和小於等於號判斷一個set是不是另一個的超集或子集:

和dict一樣,我們可以使用in判斷元素在不在set當中。用可以拷貝一個set。

Python當中的判斷語句非常簡單,並且Python不支持switch,所以即使是多個條件,我們也只能 羅列if-else

我們可以用in來循環迭代一個list當中的內容,這也是Python當中基本的循環方式。

如果我們要循環一個范圍,可以使用range。range加上一個參數表示從0開始的序列,比如range(10),表示[0, 10)區間內的所有整數:

如果我們傳入兩個參數,則 代表迭代區間的首尾

如果我們傳入第三個元素,表示每次 循環變數自增的步長

如果使用enumerate函數,可以 同時迭代一個list的下標和元素

while循環和C++類似,當條件為True時執行,為false時退出。並且判斷條件不需要加上括弧:

Python當中使用 try和except捕獲異常 ,我們可以在except後面限制異常的類型。如果有多個類型可以寫多個except,還可以使用else語句表示其他所有的類型。finally語句內的語法 無論是否會觸發異常都必定執行

在Python當中我們經常會使用資源,最常見的就是open打開一個文件。我們 打開了文件句柄就一定要關閉 ,但是如果我們手動來編碼,經常會忘記執行close操作。並且如果文件異常,還會觸發異常。這個時候我們可以使用with語句來代替這部分處理,使用with會 自動在with塊執行結束或者是觸發異常時關閉打開的資源

以下是with的幾種用法和功能:

凡是可以使用in語句來迭代的對象都叫做 可迭代對象 ,它和迭代器不是一個含義。這里只有可迭代對象的介紹,想要了解迭代器的具體內容,請移步傳送門:

Python——五分鍾帶你弄懂迭代器與生成器,夯實代碼能力

當我們調用dict當中的keys方法的時候,返回的結果就是一個可迭代對象。

我們 不能使用下標來訪問 可迭代對象,但我們可以用iter將它轉化成迭代器,使用next關鍵字來獲取下一個元素。也可以將它轉化成list類型,變成一個list。

使用def關鍵字來定義函數,我們在傳參的時候如果指定函數內的參數名, 可以不按照函數定義的順序 傳參:

可以在參數名之前加上*表示任意長度的參數,參數會被轉化成list:

也可以指定任意長度的關鍵字參數,在參數前加上**表示接受一個dict:

當然我們也可以兩個都用上,這樣可以接受任何參數:

傳入參數的時候我們也可以使用*和**來解壓list或者是dict:

Python中的參數 可以返回多個值

函數內部定義的變數即使和全局變數重名,也 不會覆蓋全局變數的值 。想要在函數內部使用全局變數,需要加上 global 關鍵字,表示這是一個全局變數:

Python支持 函數式編程 ,我們可以在一個函數內部返回一個函數:

Python中可以使用lambda表示 匿名函數 ,使用:作為分隔,:前面表示匿名函數的參數,:後面的是函數的返回值:

我們還可以將函數作為參數使用map和filter,實現元素的批量處理和過濾。關於Python中map、rece和filter的使用,具體可以查看之前的文章:

五分鍾帶你了解map、rece和filter

我們還可以結合循環和判斷語來給list或者是dict進行初始化:

使用 import語句引入一個Python模塊 ,我們可以用.來訪問模塊中的函數或者是類。

我們也可以使用from import的語句,單獨引入模塊內的函數或者是類,而不再需要寫出完整路徑。使用from import *可以引入模塊內所有內容(不推薦這么干)

可以使用as給模塊內的方法或者類起別名:

我們可以使用dir查看我們用的模塊的路徑:

這么做的原因是如果我們當前的路徑下也有一個叫做math的Python文件,那麼 會覆蓋系統自帶的math的模塊 。這是尤其需要注意的,不小心會導致很多奇怪的bug。

我們來看一個完整的類,相關的介紹都在注釋當中

以上內容的詳細介紹之前也有過相關文章,可以查看:

Python—— slots ,property和對象命名規范

下面我們來看看Python當中類的使用:


這里解釋一下,實例和對象可以理解成一個概念,實例的英文是instance,對象的英文是object。都是指類經過實例化之後得到的對象。


繼承可以讓子類 繼承父類的變數以及方法 ,並且我們還可以在子類當中指定一些屬於自己的特性,並且還可以重寫父類的一些方法。一般我們會將不同的類放在不同的文件當中,使用import引入,一樣可以實現繼承。

我們創建一個蝙蝠類:

我們再創建一個蝙蝠俠的類,同時繼承Superhero和Bat:

執行這個類:

我們可以通過yield關鍵字創建一個生成器,每次我們調用的時候執行到yield關鍵字處則停止。下次再次調用則還是從yield處開始往下執行:

除了yield之外,我們還可以使用()小括弧來生成一個生成器:

關於生成器和迭代器更多的內容,可以查看下面這篇文章:

五分鍾帶你弄懂迭代器與生成器,夯實代碼能力

我們引入functools當中的wraps之後,可以創建一個裝飾器。裝飾器可以在不修改函數內部代碼的前提下,在外麵包裝一層其他的邏輯:

裝飾器之前也有專門的文章詳細介紹,可以移步下面的傳送門:

一文搞定Python裝飾器,看完面試不再慌

不知道有多少小夥伴可以看到結束,原作者的確非常厲害,把Python的基本操作基本上都囊括在裡面了。如果都能讀懂並且理解的話,那麼Python這門語言就算是入門了。


如果你之前就有其他語言的語言基礎,我想本文讀完應該不用30分鍾。當然在30分鍾內學會一門語言是不可能的,也不是我所提倡的。但至少通過本文我們可以做到熟悉Python的語法,知道大概有哪些操作,剩下的就要我們親自去寫代碼的時候去體會和運用了。

根據我的經驗,在學習一門新語言的前期,不停地查閱資料是免不了的。希望本文可以作為你在使用Python時候的查閱文檔。

最後,我這里有各種免費的編程類資料,有需要的及時私聊我,回復"學習",分享給大家,正在發放中............





C. 如何用Python玩轉TF-IDF之尋找相似文章並生成摘要

應用1:關鍵詞自動生成

核心思想是對於某個文檔中的某個詞,計算其在這個文檔中的標准化TF值,然後計算這個詞在整個語料庫中的標准化IDF值。在這里,標准化是說對原始的計算公式進行了一些變換以取得更好的衡量效果,並避免某些極端情況的出現。這個詞的TF-IDF值便等於TF*IDF。對於這個文檔中的所有詞計算它們的TF-IDF值,並按照由高到低的順序進行排序,由此我們便可以提取我們想要的數量的關鍵詞。

TF-IDF的優點是快捷迅速,結果相對來說比較符合實際情況。缺點是當一篇文檔中的兩個詞的IDF值相同的時候,出現次數少的那個詞有可能更為重要。再者,TF-IDF演算法無法體現我詞的位置信息,出現位置靠前的詞與出現位置靠後的詞,都被視為重要性相同,這是不正確的。存在的解決辦法是對文章的第一段和每段的第一句話給予比較大的權重。

應用2:計算文本相似度

明白了對於每個詞,如何計算它的TF-IDF值。那麼計算文本相似度也輕而易舉。我們已經計算了文章中每個詞的TF-IDF值,那麼我們便可以將文章表徵為詞的TF-IDF數值向量。要計算兩個文本的相似度,只需要計算餘弦即可,餘弦值越大,兩個文本便越相似。

應用3:自動摘要

2007年,美國學者的論文<A Survey on Automatic Text Summarization>總結了目前的自動摘要演算法,其中很重要的一種就是詞頻統計。這種方法最早出自1958年IBM公司一位科學家的論文<The Automatic Creation of Literature Abstracts>。這位科學家認為,文章的信息都包含在句子中,有的句子包含的信息多,有的句子包含的信息少。自動摘要就是找出那些包含信息最多的句子。那麼句子的信息量怎麼衡量呢?論文中採用了關鍵詞來衡量。如果包含的關鍵詞越多,就說明這個句子越重要,這位科學家提出用Cluster的來表示關鍵詞的聚集。所謂簇,就是包含多個關鍵詞的句子片段。


以第一個圖為例,其中的cluster一共有7個詞,其中4個是關鍵詞。因此它的重要性分值就等於(4*4)/7=2.3。然後,找出包含cluster重要性分值最高的句子(比如5句),把它們合在一起,就構成了這篇文章的自動摘要。具體實現可以參見<Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites>(O'Reilly, 2011)一書的第8章,Python代碼見github。這種演算法後來被簡化,不再區分cluster,只考慮句子包含的關鍵詞。偽代碼如下。

Summarizer(originalText,maxSummarySize):
//計算文本的詞頻,生成一個列表,比如[(10,'the'),(3,'language'),(8,'code')...]
wordFrequences=getWordCounts(originalText)
//過濾掉停用詞,列表變成[(3,'language'),(8,'code')...]
contentWordFrequences=filtStopWords(wordFrequences)
//按照詞頻的大小進行排序,形成的列表為['code','language'...]
contentWordsSortbyFreq=sortByFreqThenDropFreq(contentWordFrequences)
//將文章分成句子
sentences=getSentences(originalText)
//選擇關鍵詞首先出現的句子
setSummarySentences={}
:
firstMatchingSentence=search(sentences,word)
setSummarySentences.add(firstMatchingSentence)
ifsetSummarySentences.size()=maxSummarySize:
break
//將選中的句子按照出現順序,組成摘要
summary=""
foreachsentenceinsentences:
:
summary=summary+""+sentence
returnsummary


類似的演算法已經被寫成了工具,比如基於Java的Classifier4J庫的SimpleSummariser模塊、基於C語言的OTS庫、以及基於classifier4J的C#實現和python實現。

D. 用沐神的方法閱讀PyTorch FX論文

作者丨BBuf

來源丨GiantPandaCV

編輯丨極市平台

torch.fx 對於PyTorch來說確實是一個比較好的工作,因為它消除了一些動態圖和靜態圖的Gap。比如在圖改寫方面, torch.fx 讓PyTorch想做一些其它靜態圖框架的運算元融合優化非常容易。並侍差閉且 torch.fx 讓後訓練量化和感知訓練量化以及AMP等的實現難度大大降低,這得益於我們可以直接在Python層操作這個IR,所以我認為這是一個不錯的工作。尤其是對使用PyTorch開發的演算法工程師來說,現慶洞在可以基於這個特性大開腦洞了。 torch.fx 的賣點就是,它使用純Python語言實現了一個可以捕獲PyTorch程序的計算圖並轉化為一個IR的庫,並且非常方便的在這個IR上做Pass,同時提供將變換後的IR Codegen合法的Python代碼功能。我覺得算是達到了在Eager下寫Pass就像做鏈表插入刪除題目一樣順滑。

PyTorch FX論文的鏈接在: https://arxiv.org/pdf/2112.08429.pdf 。

下面我就以沐神的論文閱讀順序來分享一下閱讀體驗,幫助大家搞清楚PyTorch FX這個特性到底是什麼,以及它可以在PyTorch中發揮什麼作用。

摘要部分簡單指明了像PyTorch這種基於動態圖執行模式的深度學習框架雖然提升了用戶的易用性。但是在一些真實場景中,用戶可能是需要捕獲和變換程序結構(也可以直接理解為神經網路的結構)來進行性能優化,可視化,分析和硬體調優等。為了解決這個痛點,PyTorch設計了 torch.fx 這個模塊來做PyTorch程序的捕獲和變換,這個模塊是純Python開發的。

這一節主要是講了一下 torch.fx 的賣點,就是說動態圖雖然易用性很強,但是圖結構不能被提前感知和變換,但通過這篇論文的 torch.fx 模塊,這件事就成啦!

早期的圖模式或者叫 define-and-run 的靜態圖框架有Caffe,TensorFlow等,它們設計了一個表示圖的IR,用戶通過調用這些框架提供的API來構建IR。然後我們可以在這個IR上做程序微分,將IR切分到設備上實現並行,量化,性能優化等等。但這些事情一般都要求開發者在領域特定的語言上去做,比如以OneFlow的靜態圖模式為例,要做圖切分,量化,性能優化等老裂都需要基於C++去開發,並且調試也會相對比較難(要藉助pdb,gdb等等專業工具)。

現在的eager模式或者叫 define-by-run 的動態圖框架有PyTorch,TensorFlow Eager模式等,它們可以隨心所欲的讓用戶基於腳本語言編程並且可以解決大多數的訓練(基於自動微分)和預測任務。但是有一些變換比如 「量化和運算元融合」 是不能直接做的,而這一點在靜態圖模式下則很簡單。為了消除這種Gap,動態圖框架需要一種從用戶的程序捕獲圖結構的方法來使能這些變換。

在捕獲和變換程序時,eager和graph模式的深度學習框架都必須在 「捕獲程序結構」 「程序特化」 「保存程序的IR的設計」 方面做出選擇。這些選擇的組合決定了可在框架中表示的 「程序空間」 「編寫變換的難易程度」以及「生成的變換程序的性能」 「一般來說,支持程序的高性能運行需要更復雜的捕獲框架和IR,從而使轉換更難編寫」 。每一段相關工作我就不詳細過了,只描述每一段工作的核心是在說什麼,相關細節大家可以查看原始論文。

這一節提到了PyTorch的 jit.trace ,MxNet Gluon,TensorFlow的 tf.function 等程序捕獲方法,並指出這些方法只能處理Python的一些子集。然後,TorchScript通過在AST上分析可以處理控制流和更多的Python語法。然後還提了一下Julia和Swift For TensorFlow中將捕獲程序結構的介面集成到了非Python的宿主語言中,要使用的話需要用戶放棄Python生態系統。

對於 a+b 這個Python語句來說,這個表達式對 a 和 b 的類型沒有限制。但當深度學習框架捕獲程序時一般會對這兩個變數進行特化,以便它們只對特定類型或者張量有效。在深度學習框架中處理的大多數程序都是特化類型的程序,特化程度越高,能夠處理的輸入就越少。例如 torch.jit.trace 在執行trace的時候只能處理某些擁有合法輸入shape的輸入。接下來還討論了LazyTensor和Jax的 jit 來說明為了更好的處理特化程序中捕獲的失敗,它們做了哪些努力。

深度學習框架都有自己的IR設計,Caffe和TensorFlow使用Protocol Buffers格式。而PyTorch和MxNet使用C++數據結構來表示IR並額外綁定到Python。這些IR設計在runtime階段表現都會比較好並且可以統一被序列化。但從另外一個角度來說,這些IR表示相比於純Python語言的表示都需要更高的學習成本。接下來,這一節討論了控制流和狀態的問題,用來表明要處理這些問題需要設計較為復雜的IR以及要基於這個IR做較為復雜的分析才行。

基於上面幾點,論文提出了 torch.fx 的基本設計原則:

這一節主要對一些相關工作進行了展開,以此來突出 torch.fx 的核心賣點,就是說我雖然不能像TorchScript這樣的IR處理一些比較難的Case(比如動態控制流),但是我在神經網路這個領域里做得夠用就可以了。最關鍵的是我的實現很簡單,是純Python的庫,這樣用戶寫變換就會很簡單,學習成本會很小並且易用。(簡單不代表不強大!

以簡單為基本原則, torch.fx 通過符號跟蹤來捕獲程序,並通過一個簡單的6個指令的IR來表示它們,並基於這個IR重新生成Python代碼來運行它。為了避免JIT特化中的重捕獲的復雜性, torch.fx 沒有對程序本身進行特化,而是依靠變換來決定在捕獲期間需要實現哪些特化。用戶也可以配置符號跟蹤的過程來實現自定義捕獲需求。

Figure1給我們展示了使用 torch.fx.symbolic_trace 捕獲程序的例子,輸入可以是一個 torch.nn.Mole 或者函數,並且捕獲之後的結構被存在一個Graph對象裡面。該 Graph 對象和 GraphMole 中的模塊參數相結合, GraphMole 是 torch.nn.Mole 的子類,其 forward 方法運行捕獲的 Graph 。我們可以列印此圖的 Nodes 以查看捕獲的 IR。 placeholder 節點表示輸入,單個 output 節點表示 Graph 的結果。 call_function 節點直接引用了它將調用的 Python 函數。 call_method 節點直接調用其第一個參數的方法。 Graph 被重組為 Python 代碼( traced.code )以供調用。

Figure2展示了使用 torch.fx 進行變換的示例。變換是找到一個激活的所有實例並將它們替換為另一個。在這里,我們使用它來將 gelu 替換 relu 。

torch.fx 的符號跟蹤機制使用一個Proxy數據結構來記錄給定一個輸入之後經過了哪些Op。Proxy是一個ck-typed類型的Python類記錄了在它之上的的屬性訪問和調用方法,是程序中真實Op的上層抽象。ck-typed可以看一下這里的介紹: https://zh.wikipedia.org/wiki/%E9%B8%AD%E5%AD%90%E7%B1%BB%E5%9E%8B 。PyTorch的運算元以及Python子集的某些函數都會被這個Proxy包裝一次,然後在符號跟蹤傳入的是一個 nn.Mole 時,會對這個 nn.Mole 中的子 nn.Mole 也進行Proxy包裝,當然還包含輸入數據。這樣程序中的輸入和其它Op都是ck-typed類型的Proxy對象,我們就可以執行這個程序了,也就是符號跟蹤的過程。符號跟蹤的過程通過一個 Tracer 類進行配置,它的方法可以被重寫以控制哪些值被作為Proxy對象保留,哪些值被unpack。(Proxy記錄下來的Op可以進行unpack,unpack之後可以拿到真實的Tensor, Parameter和運算符等等)。通過Proxy和Tracer類的配合, torch.fx 就可以完成PyTorch程序的符號跟蹤,需要注意的是這里的符號跟蹤的意思就是運行一遍這個被代理之後的 nn.Mole 的forward。

torch.fx 的中間表示(IR)由一個Python數據結構 Graph 來做的。這個 Graph 實際上是一個包含一系列 Node 的線性表。節點有一個字元串操作碼 opcode ,描述節點代表什麼類型的操作(操作碼的語義可以在附錄 A.1 中找到)。節點有一個關聯的目標,它是調用節點( call_mole 、 call_function 和 call_method )的調用目標。最後,節點有 args 和 kwargs ,在trace期間它們一起表示 Python 調用約定中的目標參數(每個opcode對應的 args 和 kwargs 的語義可以在附錄 A.2 中找到)。節點之間的數據依賴關系表示為 args 和 kwargs 中對其他節點的引用。

torch.fx 將程序的狀態存儲在 GraphMole 類中。 GraphMole 是轉換程序的容器,暴露轉換後生成的代碼,並提供 nn.Mole 類似的參數管理APIs。 GraphMole 可以在任何可以使用普通的 nn.Mole 的地方使用,以提供轉換後的代碼和PyTorch 生態系統的其餘部分之間的互操作性。

torch.fx 變換pipline的最後階段是代碼生成。 torch.fx 並不是退出 Python 生態系統並進入定製的運行時,而是從變換後的 IR 生成有效的 Python 源代碼。然後將此變換後的代碼載入到 Python 中,生成一個可調用的 Python 對象,並作為 forward 方法安裝在 GraphMole 實例上。使用代碼生成允許將 torch.fx 變換的結果安裝在模型中並用於進一步的變換。例如,在圖3中,我們拿到trace原始程序的結果並將其安裝為新模塊中的激活函數。

到這里PyTorch FX特性就精讀完了,但查看FX的論文可以發現還有一節叫作Design Decisions,分別介紹了Symbolic Tracing,Configurable Program Capture,AoT Capture without Specialization,Python-based IR and Transforms等等FX實現中依賴的一些想法和 決策,以及它們的好處等。我理解這一節就是Introction的加強版,所以就不繼續講解這一小節了,如果你擔心會錯過什麼細節知識可以閱讀論文原文。

torch.fx 的一個目標就是簡化深度學習模型產生的IR,下面的Figure5以ResNet50為例展示了TorchScript IR和 torch.fx IR的差別,相比於TorchScript IR, torch.fx IR確實簡單並且可讀性更強。

我們知道後量化以及量化感知訓練可以提示程序推理時的性能,下面的Figure6就展示了基於 torch.fx 實現的後量化(使用FBGEMM量化運算元)應用在DeepRecommender模型之後,在Intel Xeon Gold 6138 CPU @2.00GHz上的性能表現。基於 torch.fx 實現的後量化模型推理速度相比float類型的模型要高3.3倍。並且基於 torch.fx 實現量化操作相比基於TorchScript IR要簡單很多。

torch.fx 還可以做Op融合,Figure7展示了基於 torch.fx 做了Conv+BN融合後應用在ResNet50上,在n NVIDIA Tesla V100-SXM2 16GB with CUDA version 11.0 和 Intel Xeon Gold 6138 CPU @ 2.00GHz的性能表現,可以看到在GPU上減少了約6%的latency,在CPU上減少了約40%的latency(多線程)和約18%的latency(單線程)。

除此之外 torch.fx 還可以應用在FLOPs計算,內存帶寬使用分析,工作負載的數據值大小估計等,用來分析程序運行時的內存和速度。 torch.fx 還可以用在形狀推斷,以及模型對應的DAG可視化作圖等等。

最後, torch.fx 在runtime階段還支持通過ASIC加速(即將 torch.fx 中的運算元lowering到對應的ASIC上),下面的Figure8展示了基於 torch.fx 推理ResNet50和LearningToPaint並將運算元lowering到TensorRT之後的加速情況:

torch.fx 對於PyTorch來說確實是一個比較好的工作,因為它消除了一些動態圖和靜態圖的Gap。比如在圖改寫方面, torch.fx 讓PyTorch想做一些其它靜態圖框架的運算元融合優化非常容易。並且 torch.fx 讓後訓練量化和感知訓練量化以及AMP等的實現難度大大降低,這得益於我們可以直接在Python層操作這個IR,所以我認為這是一個不錯的工作。尤其是對使用PyTorch開發的演算法工程師來說,現在可以基於這個特性大開腦洞了。我之前圍繞FX也做了一個QAT的工作,感興趣可以閱讀:基於OneFlow實現量化感知訓練: https://zhuanlan.hu.com/p/397650514

最後總結一下, torch.fx 的賣點就是,它使用純Python語言實現了一個可以捕獲PyTorch程序的計算圖並轉化為一個IR的庫,並且非常方便的在這個IR上做Pass,同時提供將變換後的IR Codegen合法的Python代碼功能。我覺得算是達到了在Eager下寫Pass就像做鏈表插入刪除題目一樣順滑。

沐神的論文閱讀方法,感覺確實比較科學,文章末尾再贊一次。

E. 網路爬蟲 python 畢業論文呢

做爬蟲,特別是python寫說容易挺容易,說難也挺難的,
舉個栗子 簡單的:將http://paste.ubuntu.com上面的所有代碼爬下來
寫個for循環,調用urllib2的幾個函數就成了,基本10行到20行以內的代碼
難度0

情景:
1.網站伺服器很卡,有些頁面打不開,urlopen直接就無限卡死在了某些頁面上(2.6以後urlopen有了timeout)
2.爬下來的網站出現亂碼,你得分析網頁的編碼
3.網頁用了gzip壓縮,你是要在header裡面約定好默認不壓縮還是頁面下載完畢後自己解壓
4.你的爬蟲太快了,被伺服器要求停下來喝口茶
5.伺服器不喜歡被爬蟲爬,會對對header頭部瀏覽器信息進行分析,如何偽造
6.爬蟲整體的設計,用bfs爬還是dfs爬
7.如何用有效的數據結構儲存url使得爬過的頁面不被重復爬到
8.比如1024之類的網站(逃,你得登錄後才能爬到它的內容,如何獲取cookies

以上問題都是寫爬蟲很常見的,由於python強大的庫,略微加了一些代碼而已
難度1

情景:
1.還是cookies問題,網站肯定會有一個地方是log out,爬蟲爬的過程中怎樣避免爬到各種Log out導致session失效
2.如果有驗證碼才能爬到的地方,如何繞開或者識別驗證碼
3.嫌速度太慢,開50個線程一起爬網站數據

難度2

情景:
1.對於復雜的頁面,如何有效的提取它的鏈接,需要對正則表達式非常熟練
2.有些標簽是用Js動態生成的,js本身可以是加密的,甚至奇葩一點是jsfuck,如何爬到這些

難度3

總之爬蟲最重要的還是模擬瀏覽器的行為,具體程序有多復雜,由你想實現的功能和被爬的網站本身所決定
爬蟲寫得不多,暫時能想到的就這么多,歡迎補充

F. python有哪些提取文本摘要的庫

1.google goose

1
2
3
4
5
6
7
8
9
10
11
12

>>> from goose import Goose
>>> url = 'http://edition.cnn.com/2012/02/22/world/europe/uk-occupy-london/index.html?hpt=ieu_c2'
>>> g = Goose()
>>> article = g.extract(url=url)
>>> article.title
u'Occupy London loses eviction fight'
>>> article.meta_description
"Occupy London protesters who have been camped outside the landmark St. Paul's Cathedral for the past four months lost their court bid to avoid eviction Wednesday in a decision made by London's Court of Appeal."
>>> article.cleaned_text[:150]
(CNN) -- Occupy London protesters who have been camped outside the landmark St. Paul's Cathedral for the past four months lost their court bid to avoi
>>> article.top_image.src
http://i2.cdn.turner.com/cnn/dam/assets/111017024308-occupy-london-st-paul-s-cathedral-story-top.jpg

2. python SnowNLP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

from snownlp import SnowNLP

s = SnowNLP(u'這個東西真心很贊拆櫻')

s.words # [u'這個爛御斗', u'東西', u'真心',
# u'很飢磨', u'贊']

s.tags # [(u'這個', u'r'), (u'東西', u'n'),
# (u'真心', u'd'), (u'很', u'd'),
# (u'贊', u'Vg')]

s.sentiments # 0.9769663402895832 positive的概率

s.pinyin # [u'zhe', u'ge', u'dong', u'xi',
# u'zhen', u'xin', u'hen', u'zan']

s = SnowNLP(u'「繁體字」「<a href="https://www..com/s?wd=%E7%B9%81%E4%BD%93%E4%B8%AD%E6%96%87&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">繁體中文</a>」的叫法在台灣亦很常見。')

s.han # u'「繁體字」「<a href="https://www..com/s?wd=%E7%B9%81%E4%BD%93%E4%B8%AD%E6%96%87&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">繁體中文</a>」的叫法
# 在台灣亦很常見。'

text = u'''
<a href="https://www..com/s?wd=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">自然語言處理</a>是<a href="https://www..com/s?wd=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">計算機科學</a>領域與<a href="https://www..com/s?wd=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">人工智慧</a>領域中的一個重要方向。
它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。
<a href="https://www..com/s?wd=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">自然語言處理</a>是一門融語言學、<a href="https://www..com/s?wd=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">計算機科學</a>、數學於一體的科學。
因此,這一領域的研究將涉及自然語言,即人們日常使用的語言,
所以它與語言學的研究有著密切的聯系,但又有重要的區別。
<a href="https://www..com/s?wd=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">自然語言處理</a>並不是一般地研究自然語言,
而在於研製能有效地實現自然語言通信的計算機系統,
特別是其中的軟體系統。因而它是<a href="https://www..com/s?wd=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">計算機科學</a>的一部分。
'''

s = SnowNLP(text)

s.keywords(3) # [u'語言', u'自然', u'計算機']

s.summary(3) # [u'因而它是計算機科學的一部分',
# u'自然語言處理是一門融語言學、計算機科學、
# 數學於一體的科學',
# u'自然語言處理是計算機科學領域與<a href="https://www..com/s?wd=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&tn=44039180_cpr&fenlei=-w9Uz4Bmy-bIi4WUvYETgN-" target="_blank" class="-highlight">人工智慧</a>
# 領域中的一個重要方向']
s.sentences

s = SnowNLP([[u'這篇', u'文章'],
[u'那篇', u'論文'],
[u'這個']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]

G. python論文參考文獻有哪些

關於python外文參考文獻舉例如下:

1、A Python script for adaptive layout optimization of trusses.

翻譯:用於桁架的自適應布局優化的Python腳本。

H. python能在畢設中做什麼

可以的,畢業設計可以用Python語言,重點是論文的項目和文字內容排版。論文的內容不能過於重復。

閱讀全文

與python論文摘要相關的資料

熱點內容
51單片機指令用背嗎 瀏覽:934
unityai演算法 瀏覽:832
我的世界ice伺服器如何打開pvp 瀏覽:973
c語言編程如何做標記 瀏覽:884
python數據分析實戰pdf 瀏覽:983
u盤插入文件夾 瀏覽:916
華為amd雲伺服器 瀏覽:495
漢化編程卡是什麼意思 瀏覽:126
python學習pdf 瀏覽:313
祝緒丹程序員那麼可愛拍吻戲 瀏覽:198
asp源碼會員消費系統 瀏覽:113
java反射設置 瀏覽:152
python一行文 瀏覽:439
排序演算法優缺點 瀏覽:563
惡搞加密文件pdf 瀏覽:674
gif怎麼壓縮圖片大小 瀏覽:217
命令選擇當前不可用 瀏覽:158
歐幾里得演算法如何求逆元 瀏覽:506
男中學生上課解壓神器 瀏覽:373
加密狗拔掉之後怎麼辦 瀏覽:27