摘要:是怎么處理形狀信息在構建圖的時候,不可能嚴格執行變量的形狀。形狀推斷問題在圖中,將會傳播形狀的信息。以下情形是目前我們可以做到的當調用時,你可以直接把形狀信息傳遞給。例如你可以在圖的任何位置使用添加位置信息。
Theano是怎么處理形狀信息(Shape Information)
在構建圖的時候,不可能嚴格執行Theano變量的形狀。因為在運行的時候,傳遞給Theano函數的某一參數的值可能影響Thenao變量的形狀。目前,關于形狀信息的使用在Theano中有以下兩種方式:
在輸出形狀已知的情況下,生成在CPU和GPU上進行2d卷積的更高效的C代碼
當我們只關心變量的形狀,而不是實際值的時候,將移除圖的計算。這通過Op.infer_shape完成。
例子:
import theano import theano.tensor as T x = T.matrix("x") f = theano.function([x], (x ** 2).shape) theano.printing.debugprint(f) # MakeVector{dtype="int64"} [id A] "" 2 # |Shape_i{0} [id B] "" 1 # | |x [id C] # |Shape_i{1} [id D] "" 0 # |x [id C]
輸出結果不包含任何乘法以及冪運算。Theano已經移除了它們直接去計算輸出的形狀。
形狀推斷問題(Shape Inference Problem)在圖中,Theano將會傳播形狀的信息。有時,這將會導致一些錯誤。考慮下面的例子:
import numpy import theano x = theano.tensor.matrix("x") y = theano.tensor.matrix("y") z = theano.tensor.join(0, x, y) # 將x,y按行拼接起來,要求x,y的列數一致 xv = numpy.random.rand(5, 4) yv = numpy.random.rand(3, 3) f = theano.function([x, y], z.shape) theano.printing.debugprint(f) # MakeVector{dtype="int64"} [id A] "" 4 # |Elemwise{Add}[(0, 0)] [id B] "" 3 # | |Shape_i{0} [id C] "" 1 # | | |x [id D] # | |Shape_i{0} [id E] "" 2 # | |y [id F] # |Shape_i{1} [id G] "" 0 # |x [id D] f(xv, yv) # 并沒有報錯 # array([8, 4]) f = theano.function([x,y], z) # 直接返回z theano.printing.debugprint(f) # Join [id A] "" 0 # |TensorConstant{0} [id B] # |x [id C] # |y [id D] f(xv, yv) # 報錯 # Traceback (most recent call last): # ... # ValueError: ...
正如你看到的,當僅僅訪問計算結果的形狀信息(z.shape)時,將會直接推斷結果的形狀,并不會執行計算過程(即z的具體數值)。
這使得形狀的計算速度很快,但是它可能會隱藏一些錯誤。在這個例子中,輸出結果形狀的計算僅僅基于輸入的第一個Theano變量,這導致返回形狀信息的錯誤。
這種現象也可能出現在其他運算上,比如elemwise和dot。事實上,為了執行一些優化(例如,速度和穩定性),Theano從一開始就假定計算是正確的,并且是一致的。就像上述例子中一樣。
你可以通過使用Theano標志optimizer_excluding=local_shape_to_shape_i運行代碼(將不會執行上述提及的優化)來檢測這種錯誤。你也可以通過在FAST_COMPILE或者DebugMode模式下執行代碼,得到同樣的效果。
FAST_COMPILE模式將不會執行這種優化,以及大部分其它的優化。
DebugMode模式將會在優化前以及優化后進行測試,導致運行速率更慢。
指定確切的形狀目前,指定一個形狀并不像我們計劃一些更新和期望的那么容易和靈活。以下情形是目前我們可以做到的:
當調用conv2d時,你可以直接把形狀信息傳遞給ConvOp。你只需要在調用時簡單地設置一下image_shape和filter_shape參數就可以了。他們必須是包含4個元素的元組。例如:
theano.tensor.nnet.conv2d(..., image_shape=(7,3,5,5), filter_shape=(2,3,4,4))
你可以在圖的任何位置使用SpecifyShape添加位置信息。這允許執行一些優化。在接下來的例子中,這使得預先計算Theano函數為常數成為可能。
import theano x = theano.tensor.matrix() x_specify_shape = theano.tensor.specify_shape(x, (2,2)) f = theano.function([x], (x_specify_shape ** 2).shape) theano.printing.debugprint(f)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38659.html
摘要:廣播廣播是這樣的一個機制它允許不同維度的張量進行加法或者乘法運算。如上圖,廣播一個行矩陣。和分別表示和指明沿著哪個維度可以進行廣播。如果第二個參數是向量,它的形狀為,以及它的廣播模式為。當可用的時候,廣播信息將會以變量的類型給出。 廣播(Broadcasting) 廣播是這樣的一個機制:它允許不同維度的張量進行加法或者乘法運算。在運算時,他將會沿著維度缺失的方向復制較小的那個張量。 通...
摘要:我認為對機器學習開發者來說,是一個了不起的工具集。這個帖子發出后得到了很多機器學習研究者和開發者的關注,他們紛紛跟貼談論自己的想法和經驗不只是關于和,討論中還涉及到更多工具。 Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學習框架之間的比較一直以來都是非常受人關注的熱點話題。機器之心也曾發表過多篇相關的介紹和對比文章,如《主流深度學...
摘要:本篇博文主要是根據的那篇文章簡單介紹下,然后通過個簡單的實驗來說明實際編程中該怎樣應用。當然作者也從數學上給出了一定的解釋。自頂向下的生成模型觀點的解釋。信息論觀點的解釋。 前言: 當采用無監督的方法分層預訓練深度網絡的權值時,為了學習到較魯棒的特征,可以在網絡的可視層(即數據的輸入層)引入隨機噪聲,這種方法稱為Denoise Autoencoder(簡稱dAE),由Bengio在08年...
摘要:機器學習中的矩陣公約水平方向為矩陣的行,豎直方向為矩陣的列,每一行為一個樣例記錄。因此輸入表示由個樣例記錄,每個樣例具有個維度屬性組成的矩陣。如果為一個神經網絡的輸入,那么權重矩陣的表示形式為的矩陣。 機器學習中的矩陣公約 水平方向為矩陣的行,豎直方向為矩陣的列,每一行為一個樣例(記錄)。 因此輸入[10, 5]表示:由10個樣例(記錄),每個樣例具有5個維度(屬性)組成的矩陣。如果[...
摘要:深度學習通過組合低層特征形成更加抽象的高層表示屬性類別或特征,以發現數據的分布式特征表示。深度學習的概念由等人于年提出。但是自年以來,機器學習領域,取得了突破性的進展。 深度學習是機器學習研究中的一個新的領域,其動機在于建立、模擬人腦進行分析學習的神經網絡,它模仿人腦的機制來解釋數據,例如圖像,聲音和文本。深度學習是無監督學習的一種。 深度學習的概念源于人工神經網絡的研究。含多隱層的多層感知...
閱讀 2368·2021-11-18 10:07
閱讀 2318·2021-09-22 15:59
閱讀 3077·2021-08-23 09:42
閱讀 2276·2019-08-30 15:44
閱讀 1191·2019-08-29 15:06
閱讀 2303·2019-08-29 13:27
閱讀 1210·2019-08-29 13:21
閱讀 1412·2019-08-29 13:13