1. 程式人生 > >【theano-windows】學習筆記十一——theano中與神經網路相關函式

【theano-windows】學習筆記十一——theano中與神經網路相關函式

前言

經過softmaxMLP的學習, 我們發現thenao.tensor中除了之前的部落格【theano-windows】學習筆記五——theano中張量部分函式提到的張量的定義和基本運算外, 還有一個方法稱為nnet, 如果自己實現過前面兩篇部落格中的程式碼就會發現用到了theano.tensor.nnet.sigmoidthenao.tensor.nnet.tanh這兩個神經網路的啟用函式, 那麼就應該想了, 這個nnet是否對於在theano中實現神經網路很重要呢?所以我就跑去看了一下官網的介紹了, 感覺有必要摘抄一波.

【注】本次學習只是摘抄點感覺常用的函式, 見到陌生的操作可以再去查官方文件

進入官方對nnet的介紹的介面時, 可以發現有五種操作

  • conv:卷積神經網路相關操作
  • nnet:神經網路相關操作
  • neighbours:卷積網路中圖片的處理操作
  • bn: 批歸一化batch normalization
  • blocksparse: 塊稀疏乘法操作(有gemvouter)

國際慣例, 參考部落格

卷積相關操作

2D卷積函式

theano.tensor.nnet.conv2d(input, filters, input_shape=None, filter_shape=None, border_mode='valid', subsample=(1
, 1), filter_flip=True, image_shape=None, **kwargs)#預設翻轉卷積核

引數解釋:

  • input: 四維張量符號變數, 維度依次代表(批大小, 輸入通道, 輸入行, 輸入列)
  • filters: 四維張量符號變數. 維度依次代表(輸出通道, 輸入通道, 濾波器行, 濾波器列)
  • input_shape: 可選變數, 可以是None, 也可以是四個整數或者常量組成的元組或者列表, 代表輸入的大小
  • filter_shape: 可選變數, 可以是None, 也可以是四個整數或者常量組成的元組或者列表, 用於選擇優化實現, 可以指定列表中某個元素為None
    , 表示這個元素在編譯的時候是未知的
  • border_mode: 字串, 整型, 或者兩個整型組成的元組-以下任意一種
    valid: 輸出大小inputshapeflitershape+1
    full: 輸出大小inputshape+filtershape1
    half: 使用filterrows//2行和filter//colums列對稱填充輸入邊界,然後執行valid
    int: 使用指定的全零寬度向量填充輸入的對稱邊界, 然後使用valid
    (int1,int2): 使用int1行和int2列填充輸入的對稱邊界, 然後執行valid
  • subsample: 長度為2的元組, 對輸出進行下采樣, 也稱為步長strides
  • fliter_flip: 如果為True, 就在滑動卷積視窗前翻轉filter, 翻轉filter的操作經常稱為卷積(convolution),而且這個值經常預設為True. 如果設定為False, 那麼就不翻轉filter, 這個操作一般叫做互相關(cross-correlation)
  • *image_shape*: 為None或者四個整型或者常變數組成的元組或者列表, input_shape的別名, 已棄用
  • filter_dilation:長度為2的元組, 對輸入進行下采樣, 經常稱為空洞卷積(dilation),詳細看知乎的解釋如何理解空洞卷積(dilated convolution)?
  • *kwargs*: 相容性, 常被忽略

返回值: 一系列的特徵圖, 大小是(批大小, 輸出通道, 輸出行, 輸出列)

theano.sandbox.cuda.fftconv.conv2d_fft(input, filters, image_shape=None, filter_shape=None, border_mode='valid', pad_last_dim=False)

簡介: 是僅支援GPUnnet.conv2d是實現, 使用了傅立葉變換來實現這個操作, 也會翻轉卷積核. 但是conv2d_fft不能被直接使用, 因為沒有提供梯度. 僅僅支援輸入的最後一個維度是偶數, 其它的維度任意, 濾波器可以具有偶數或者技術的寬度. 如果你的輸入一定具有奇數寬度, 那麼可以使用填充的方法來解決, 如果你不確定你的輸入倒是是偶數還是技術, 千萬不要隨便使用填充引數pad_last_dim, 因為這個引數是無條件的加接一個維度, 可能會讓偶數輸入變技術, 導致一些問題的發生……..balabalabala後面一堆, 反正意思就是使用它挺麻煩的, 不如直接用nnet.conv2d

引數(在valid模式中輸入必須大於濾波器)與上面的conv2d相同, 就是多了一個不一樣的:

  • pad_last_dim: 無條件地對最後一個維度進行填充.返回結果時會刪除這個填充的部分

3D卷積

theano.tensor.nnet.conv3d(input, filters, input_shape=None, filter_shape=None, border_mode='valid', subsample=(1, 1, 1), filter_flip=True, filter_dilation=(1, 1, 1))

引數:

  • input: 五維的符號張量. 每個維度分別代表(批大小, 輸入通道, 輸入深度, 輸入行, 輸入列)
  • filters: 五維的符號張量. 每個維度分別代表(輸出通道, 輸入通道, 濾波器深度, 濾波器行, 濾波器列)
  • input_shape: 輸入引數大小
  • filter_shape: 濾波器引數大小
  • border_mode: 字串, 整型, 或者兩個整型組成的元組-以下任意一種
    valid: 輸出大小inputshapeflitershape+1
    full: 輸出大小inputshape+filtershape1
    half: 使用filterrows//2行和filter//colums列對稱填充輸入邊界,然後執行valid
    int: 使用指定的全零寬度向量填充輸入的對稱邊界, 然後使用valid
    (int1,int2,int3): 使用int1int2和’int3’行填充輸入的對稱邊界, 然後執行valid
  • subsample: 長度為3的元組, 對輸出進行下采樣, 也稱為步長strides
  • fliter_flip: 如果為True, 就在滑動卷積視窗前翻轉filter的’x,y,z’維度, 翻轉filter的操作經常稱為卷積(convolution),而且這個值經常預設為True. 如果設定為False, 那麼就不翻轉filter, 這個操作一般叫做互相關(cross-correlation)
  • filter_dilation:長度為3的元組, 對輸入進行下采樣, 經常稱為空洞卷積(dilation)

返回值:卷積得到的特徵圖, 維度分別代表(批大小, 輸出通道, 輸出深度, 輸出行, 輸出列)

theano.sandbox.cuda.fftconv.conv3d_fft(input, filters, image_shape=None, filter_shape=None, border_mode='valid', pad_last_dim=False)

通過快速傅立葉變換fft執行卷積, 僅僅支援輸入的最後一維是偶數. 其它的維度可以任意, 濾波器的最後一維可以是偶數或者奇數.

最後三個維度的語義並不重要, 只要他們在輸入和濾波器之間的順序是一樣的就行.比如卷積如果是在影象裡面執行的, 那麼可以是(duration,height,width)也可以是(height,width,duration)…….剩下的和conv2d_fft的描述一樣, 就是如果你非要輸入奇數維度, 請使用填充引數balabalabala………

theano.tensor.nnet.conv3d2d.conv3d(signals, filters, signals_shape=None, filters_shape=None, border_mode='valid')

簡介: conv3d2d是使用conv2加上資料reshape實現的三維卷積操作, 某些情況下比conv3d快, 它在GPU上工作, 並且翻轉卷積核. 包含視訊的時空卷積

引數:

  • signals: 畫素具有顏色通道的影象的時間序列, 形狀是[Ns,Ts,C,Hs,Ws]
  • filters: 時空濾波器,維度[Nf, Tf, C, Hf, Wf]
  • signals_shape: 訊號的維度
  • filter_shape: 濾波器的維度
  • border_mode: 這個與卷積相同, 有valid,full,half

注: 另一種定義signals的方法是(批, 時間, 輸入通道, 行, 列) ; 另一種定義濾波器的方法(輸出通道, 時間, 輸入通道, 行, 列)

還有一堆其它的函式懶得貼了, 以後遇到了再說

神經網路相關操作

其實就是各種啟用函式之類的:

sigmoid

sigmoid(x)=11+ex
theano.tensor.nnet.nnet.sigmoid(x)
theano.tensor.nnet.nnet.ultra_fast_sigmoid(x)
theano.tensor.nnet.nnet.hard_sigmoid(x)
'''
hard_sigmoid: 1.0s
ultra_fast_sigmoid: 1.3s
sigmoid (with amdlibm): 2.3s
sigmoid (without amdlibm): 3.7s
'''

這裡寫圖片描述

softplus

softplus(x)=loge(1+ex)
theano.tensor.nnet.nnet.softplus(x)
#神經網路中的用法經常如下
x,y,b = T.dvectors('x','y','b')
W = T.dmatrix('W')
y = T.nnet.softplus(T.dot(W,x) + b)

softsign

softsign=x1+abs(x)
theano.tensor.nnet.nnet.softsign(x)

softmax

softmaxij(x)=exijkexik

有一個小技巧就是這個softmax的計算是穩定的, 因為它採用瞭如下計算過程:

e_x = exp(x - x.max(axis=1, keepdims=True))
out = e_x / e_x.sum(axis=1, keepdims=True)

也就是說先減去了一個最大值, 隨後才採用softmax的標準式子計算屬於每個類別的概率(突然想到, 如果之前層用sigmoid啟用, 是不是softmax就不需要減去最大值了麼?因為sigmoid使得x{0,1},而使用Relu的話, 最好還是減一下, 但是總而言之, 無論是caffe還是theano都進行了減最大值操作). 為什麼要減?因為如果上一層輸出x很大, 那麼編譯器就會發生上溢位(e1000)或者下溢位(e1000), 那麼減去最大值以後肯定不會上溢位了, 即使發生下溢位, 也會由於取對數而解決此問題. 詳細原因請戳這裡1,這裡2

x,y,b = T.dvectors('x','y','b')
W = T.dmatrix('W')
y = T.nnet.softmax(T.dot(W,x) + b)

Relu

theano.tensor.nnet.relu(x, alpha=0)

alpha是負值輸入的斜率,屬於0-1之間, 預設為0(標準的Relu), 如果是1的話, 啟用函式就成線性激活了, 而其它的數就是傳說中的Leaky Relu

  • Relu

    forwardactivation:f(x)=max(0,x)backwardgradient:Ex={0,ifx0Ey,ifx>0
  • Leaky Relu

    forwardactivation:f(x)=max(0,x)+negativeslop

    相關推薦

    theano-windows學習筆記——theano神經網路相關函式

    前言 經過softmax和MLP的學習, 我們發現thenao.tensor中除了之前的部落格【theano-windows】學習筆記五——theano中張量部分函式提到的張量的定義和基本運算外, 還有一個方法稱為nnet, 如果自己實現過前面兩篇部落格中的程

    theano-windows學習筆記六——深度信念網路DBN

    前言 前面學習了受限玻爾茲曼機(RBM)的理論和搭建方法, 如果稍微瞭解過的人, 肯定知道利用RBM可以堆疊構成深度信念網路(deep belief network, DBN)和深度玻爾茲曼機(deep Boltzmann machine), 這裡就先學習一下

    TensorFlow-windows學習筆記六——變分自編碼器

    前言 對理論沒興趣的直接看程式碼吧,理論一堆,而且還有點複雜,我自己的描述也不一定準確,但是程式碼就兩三句話搞定了。 國際慣例,參考博文 理論 基礎知識 似然函式(引自百度百科) 似然函式是關於統計模型中的引數的函式,

    TensorFlow-windows學習筆記七——生成對抗網路

    前言 既然學習了變分自編碼(VAE),那也必須來一波生成對抗網路(GAN)。 國際慣例,參考網址: 理論 粗略點的講法就說:一個生成器GG,一個判別器DD,前者用來將噪聲輸入轉換成圖片,後者判別當前輸入圖片是真實的還是生成的。 為了

    Unity 3D學習筆記:GUI Skin(圖形使用者介面面板)

    Unity 學習筆記十 學習資料:《Unity 3D遊戲開發》 宣雨鬆 在這之前的學習的大部分控制元件用來開發遊戲還是太簡陋,為了讓遊戲更具娛樂性和美觀,所以我們就需要學習GUI Skin空間來為遊戲新增色彩。 首先在Project檢視中點選create---->

    機器學習深度學習系列連載: 第二部分 深度學習)卷積神經網路 2 Why CNN for Image?

    卷積神經網路 2 Why CNN 為什麼處理圖片要用CNN? 原因是: 一個神經元無法看到整張圖片 能夠聯絡到小的區域,並且引數更少 圖片壓縮畫素不改變圖片內容 1. CNN 的特點 卷積: 一些卷積核遠遠小於圖片大小; 同樣的pat

    Unity 3D學習筆記:遊戲元素——遊戲地形

    nbsp 3d遊戲 strong 直觀 分辨率 == 摩擦力 fill 世界 遊戲地形 在遊戲的世界中,必然會有非常多豐富多彩的遊戲元素融合當中。它們種類繁多。作用也不大同樣。一般對於遊戲元素可分為兩種:經經常使用。不經經常使用。經常使用的元素是遊戲中比較重要的元素。一

    Unity 3D學習筆記二:粒子特效

    空間 獲得 material package 一個 log 創建 spa mpi 粒子特效 粒子特效的原理是將若幹粒子無規則的組合在一起。來模擬火焰,爆炸。水滴,霧氣等效果。要使用粒子特效首先要創建,在hierarchy視圖中點擊create——particle s

    大話存儲學習筆記),磁盤

    關註 安裝程序 參數 使用 tle 外部 相互 瓶頸 代碼 第一章 計算機的IO世界 1.1 總線 1.1.1 總線的概念 計算機中所有的IO都通過共享總線的方式來實現。 總線實際上就是一條或多條的物理導線。密密麻麻的印到電路板上,而且為了避免高頻振蕩的幹擾,一般都會分組

    JavaScript動畫基礎學習筆記)-- 旋轉箭頭

    -- turn 我們 math class pla document new lose 隨著鼠標的移動旋轉箭頭。 requestAnimationFrame 在requestAnimationFrame之前我們可以用setInterval來實現動畫的循環:

    Unity 3D學習筆記四:遊戲元素——常用編輯器元件

    常用編輯器元件 unity的特色之一就是編輯器視覺化,很多常用的功能都可以在編輯器中完成。常用的編輯器可分為兩種:原有元件和拓展元件。原有元件是編輯器原生的一些功能,拓展元件是編輯器智商通過指令碼拓展的新功能。 攝像機 攝像機是unity最為核心元件之一,遊戲介面中顯示的

    Unity 3D學習筆記四:路徑渲染

    路徑渲染 路徑渲染屬於特效渲染元件,用於跟隨運動中的遊戲物件。首先在hierarchy檢視中,建立一個球體。然後在選單導航欄中選擇component——effects——trial renderer即可將路徑渲染元件新增至該球體物件中。 cast shadows:顯示陰

    D3D11遊戲程式設計學習筆記五:混合(Blending)

            (注:【D3D11遊戲程式設計】學習筆記系列由CSDN作者BonChoix所寫,轉載請註明出處:http://blog.csdn.net/BonChoix,謝謝~)        在D3D11中,“混合”發生在畫素著色器階段的下一階段,即Output Me

    Unity Shaders學習筆記之Shader簡介()

    一、Shader簡介  Shader(著色器)實際上就是一小段程式,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組合作用,然後輸出。繪圖單元可以依據這個輸出將影象繪製到螢幕上。輸

    吳恩達深度學習工程師學習筆記

    吳恩達【深度學習工程師】專項課程包含以下五門課程: 1、神經網路和深度學習; 2、改善深層神經網路:超引數除錯、正則化以及優化; 3、結構化機器學習專案; 4、卷積神經網路; 5、序列模型。 今天介紹《神經網路與深度學習》系列第一講:深度學習概述。 主要內容:

    Unity 3D學習筆記六:輸入控制——鍵盤事件

    在遊戲中,玩家控制主角移動,按鍵攻擊,選擇行走。都需要在程式中監聽玩家的輸入。unity為開發者提供了input庫,來支援鍵盤事件,滑鼠事件以及觸控事件。本文主要回顧鍵盤事件,以後會逐文複習滑鼠以及觸控事件。 鍵盤事件 一般的PC鍵盤有104個不同的按鍵,在程式中通過監

    odoo10學習筆記:視圖綜述

    當前 存在 ren name屬性 簡寫 ann idg 重寫 ogre 原文地址:http://www.cnblogs.com/ygj0930/p/7150983.html 一:視圖標簽等公共結構 name (必選) 用於通過名字查找標簽 model: 與view相關聯的

    Go語言學習筆記: 切片(slice)

    操作 容量 方括號 一個 組類型 學習 中學 slice 修改 Go語言學習筆記十一: 切片(slice) 切片這個概念我是從python語言中學到的,當時感覺這個東西真的比較好用。不像java語言寫起來就比較繁瑣。不過我覺得未來java語法也會支持的。 定義切片 切片可以

    C語言學習筆記3——字符串

    store 寫代碼 inf 變量類型 density scanf() 想要 限定符 tor 1. 字符串(charcacter string)是一個或多個字符的序列 2. C語言沒有專門用於存儲字符串的變量類型。字符串都被存儲在char類型的數組種。 3. 數組由連續的

    leetcode 簡單第四題 階乘後的零

    時間 時間復雜度 ron elf 說明 輸入 數量 n) 復雜度 給定一個整數 n,返回 n! 結果尾數中零的數量。 示例 1: 輸入: 3 輸出: 0 解釋: 3! = 6, 尾數中沒有零。 示例 2: 輸入: 5 輸出: 1 解釋: 5! = 120, 尾數中有 1