深度學習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
一樣,一維Tensor
叫Vector
,二維Tensor
叫Matrix
,三維及以上稱為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/cbce2dd601204.影象處理庫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類,這個類可以一塊一塊地對一張影象進行解碼(例如,網路聯接中接收一張影象)。這個類的介面與標準的sgmllib和xmllib模組的介面一樣。
7、 ImageFileIO模組用於從一個socket或者其他流裝置中讀取一張影象。不贊成使用這個模組。在新的code中將使用ImageFile模組的Parser類來代替它。
8、 ImageFilter模組包括各種濾波器的預定義集合,與Image類的filter方法一起使用。該模組包含這些影象增強的濾波器:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH,SMOOTH_MORE和SHARPEN。
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()的話就可以解決這個問題。這個命令是清除沒用的臨時變數的。