1. 程式人生 > >深度學習pytorch程式碼各種常見標頭檔案

深度學習pytorch程式碼各種常見標頭檔案

1. from __future__ import print_function

  在開頭加上from __future__ import print_function這句之後,即使在python2.X,使用print就得像python3.X那樣加括號使用。python2.X中print不需要括號,而在python3.X中則需要。

# python2.7
print "Hello world"

# python3
print("Hello world")

  如果某個版本中出現了某個新的功能特性,而且這個特性和當前版本中使用的不相容,也就是它在該版本中不是語言標準,那麼我如果想要使用的話就需要從future

模組匯入。

  其他例子: 
    from __future__ import division , 
    from __future__ import absolute_import , 
    from __future__ import with_statement 。等等 
  加上這些,如果你的python版本是python2.X,你也得按照python3.X那樣使用這些函式。

https://blog.csdn.net/xiaotao_1/article/details/79460365

2.python中os和os.path模組


其它函式:

os.path.isabs() 指定路徑是否為絕對路徑
os.path.isdir() 指定路徑是否存在且為一個目錄
os.path.isfile() 指定路徑是否存在且為一個檔案
os.path.islink() 指定路徑是否存在且為一個符號連結
os.path.samefile() 兩個路徑名是否指向同一個檔案
os.path.exists() 檢驗路徑是否真實存在

檔案處理:
os.listdir() 列出目錄下的所有檔案和資料夾,返回一個列表
os.mkdir(‘test’) 建立單個目錄(如果目錄已存在,會產生OSError錯誤)
os.makedirs(r’c:\python\test’) 建立多級目錄
os.remove() 刪除檔案,如果檔案不存在,或者沒有許可權,則會產生錯誤
os.rmdir() 刪除目錄(如果目錄中有檔案會產生OSError錯誤,刪除非空目錄使用shutil.rmtree(”))
os.removedirs() 刪除多個目錄
os.rename(old, new) 重新命名
os.name 指示你正在使用的平臺,Windows,它是’nt’,而對於Linux/Unix使用者,它是’posix’
os.chdir() 改變工作目錄
os.getenv() 與os.putenv() 設定和讀取環境變數
os.exit() 退出當前程序

檔案資訊:
import os
import time
os.path.basename() #獲取檔名
os.path.dirname() #獲取路徑名
os.path.getsize(file) #獲取檔案大小(位元組為單位)
os.path.getatime(file) #獲取最近訪問時間1318921018.0 ( 浮點型秒數)
os.path.getctime(file) #獲取檔案建立時間
os.path.getmtime(file) #獲取最近修改時間
time.gmtime(os.path.getmtime(file)) #以struct_time形式輸出最近修改時間
os.path.abspath(file) #獲取絕對路徑’/Volumes/Leopard/Users/Caroline/Desktop/1.mp4′
os.path.normpath(file) #獲取’/Volumes/Leopard/Users/Caroline/Desktop/1.mp4′

https://www.zhukun.net/archives/6096

3.Variable

pytorch中有兩種變數型別,一個是Tensor,一個是Variable(0.4.0版本已經將 Variable 和 Tensor合併,統稱為 Tensor)

  • Tensor: 就像ndarray一樣,一維TensorVector,二維TensorMatrix,三維及以上稱為Tensor
  • Variable:是Tensor的一個wrapper,不僅儲存了值,而且儲存了這個值的creator,需要BP的網路都是Variable參與運算

pytorch自動求導工具包在torch.autograd中,autograd是專門為了BP演算法設計的,所以這autograd只對輸出值為標量的有用,因為損失函式的輸出是一個標量。如果y是一個向量,那麼backward()函式就會失效。

from torch.autograd import Variable
x = torch.rand(5)
x = Variable(x,requires_grad = True)
y = x * 2
grads = torch.FloatTensor([1,2,3,4,5])
y.backward(grads)#如果y是scalar的話,那麼直接y.backward(),然後通過x.grad方式,就可以得到var的梯度
x.grad           #如果y不是scalar,那麼只能通過傳參的方式給x指定梯度
Variable containing:
  2
  4
  6
  8
 10
[torch.FloatTensor of size 5]

我們之所以可以實現autograd多虧了Variable和Function這兩種資料型別的功勞。要進行autograd必需先將tensor資料包成Variable。Varibale和tensor基本一致,所區別在於多了下面幾個屬性。

variable是tensor的外包裝,variable型別變數的data屬性儲存著tensor資料,grad屬性儲存關於該變數的導數,creator是代表該變數的創造者。

variable和function它們是彼此不分開的,先上圖:

資料向前傳輸和向後傳輸生成導數的過程示意圖

如圖,假設我們有一個輸入變數input(資料型別為Variable)input是使用者輸入的,所以其創造者creator為null值,input經過第一個資料操作operation1(比如加減乘除運算)得到output1變數(資料型別仍為Variable),這個過程中會自動生成一個function1的變數(資料型別為Function的一個例項),而output1的創造者就是這個function1。隨後,output1再經過一個數據操作生成output2,這個過程也會生成另外一個例項function2,output2的創造者creator為function2。

在這個向前傳播的過程中,function1和function2記錄了資料input的所有操作歷史,當output2執行其backward函式時,會使得function2和function1自動反向計算input的導數值並存儲在grad屬性中。

creator為null的變數才能被返回導數,比如input,若把整個操作流看成是一張圖(Graph),那麼像input這種creator為null的被稱之為圖的葉子(graph leaf)。而creator非null的變數比如output1和output2,是不能被返回導數的,它們的grad均為0。所以只有葉子節點才能被autograd。

https://www.jianshu.com/p/cbce2dd60120

4.影象處理庫PIL的基本模組

PIL有如下幾個模組:image模組、ImageChops模組、ImageCrackCode模組、ImageDraw模組、ImageEnhance模組、ImageFile模組、ImageFileIO模組、ImageFilter模組、ImageFont模組、ImageGrab模組、ImageOps模組、ImagePath模組、ImageSequence模組、ImageStat模組、ImageTk模組、ImageWin模組、PSDraw模組。

1、  Image模組

Image模組提供了一個相同名稱的類,即image類,用於表示PIL影象。這個模組還提供了一些函式,包括從檔案中載入影象和建立新的影象。

Image模組是PIL中最重要的模組,它提供了諸多影象操作的功能,比如建立、開啟、顯示、儲存影象等功能,合成、裁剪、濾波等功能,獲取影象屬性功能,如影象直方圖、通道數等。

Image模組的使用如下:

>>>from PIL import Image

>>> im =Image.open('D:\\Code\\Python\\test\\img\\1.jpg')

>>>im.getbands()

('R', 'G', 'B')

>>>im.mode

'RGB'

>>> im.show()

2、  ImageChops模組包含一些算術圖形操作,叫做channel operations(“chops”)。這些操作可用於諸多目的,比如影象特效,影象組合,演算法繪圖等等。通道操作只用於8點陣圖像(比如“L”模式和“RGB”模式)。

4、  ImageDraw模組為image物件提供了基本的圖形處理功能。例如,它可以建立新影象,註釋或潤飾已存在影象,為web應用實時產生各種圖形。

5、ImageEnhance模組包括一些用於影象增強的類。它們分別為Color類、Brightness類、Contrast類和Sharpness類。

6. ImageFile模組為影象開啟和儲存功能提供了相關支援功能。另外,它提供了一個Parser類,這個類可以一塊一塊地對一張影象進行解碼(例如,網路聯接中接收一張影象)。這個類的介面與標準的sgmllibxmllib模組的介面一樣。

7、  ImageFileIO模組用於從一個socket或者其他流裝置中讀取一張影象。不贊成使用這個模組。在新的code中將使用ImageFile模組的Parser類來代替它。

8、  ImageFilter模組包括各種濾波器的預定義集合,與Image類的filter方法一起使用。該模組包含這些影象增強的濾波器:BLURCONTOURDETAILEDGE_ENHANCEEDGE_ENHANCE_MOREEMBOSSFIND_EDGESSMOOTHSMOOTH_MORESHARPEN

https://blog.csdn.net/icamera0/article/details/50651926

5.Argparse 

在python 2.7 後,不推薦使用 optparse, 而推薦使用 argparse.

Argparse的作用就是為py檔案封裝好可以選擇的引數,使他們更加靈活,豐富。

詳細解釋參考:https://www.cnblogs.com/lovemyspring/p/3214598.html

例項理解參考:https://blog.csdn.net/It_way/article/details/44815141

6.PyTorch中文文件

PyTorch是使用GPU和CPU優化的深度學習張量庫。總連結:http://pytorch-cn.readthedocs.io/zh/latest/

關於張量:


torch.cuda

該包增加了對CUDA張量型別的支援,實現了與CPU張量相同的功能,但使用GPU進行計算。它是懶惰的初始化,所以你可以隨時匯入它,並使用is_available()來確定系統是否支援CUDA。https://blog.csdn.net/HowardWood/article/details/79508648

torchvision包 包含了目前流行的資料集,模型結構和常用的圖片轉換工具。

7.隨機種子:

在訓練開始時,引數的初始化是隨機的,為了讓每次的結果一致,我們需要設定隨機種子。在main函式中加入如下語句:

opt.seed = random.randint(1, 10000)
print("Random Seed: ", opt.seed)
torch.manual_seed(args.seed)#為CPU設定隨機種子
if cuda:
    torch.cuda.manual_seed(seed)#為當前GPU設定隨機種子
    torch.cuda.manual_seed_all(seed)#為所有GPU設定隨機種子

8. torch裡面的小技巧:

① torch.backends.cudnn.benchmark = True  在程式剛開始加這條語句可以提升一點訓練速度,沒什麼額外開銷。

② 有時候可能是因為每次迭代都會引入點臨時變數,會導致訓練速度越來越慢,基本呈線性增長。開發人員還不清楚原因,但如果週期性的使用torch.cuda.empty_cache()的話就可以解決這個問題。這個命令是清除沒用的臨時變數的。