在滑動過程中提取特徵 卷積核的表示式:
這個和普通線性分類器看起來是一樣的。
這是乙個(5,5) 一共25個畫素點的。每個畫素點只有兩個取值0或1
我們設定的卷積核的w和b:
黃色部分是乙個(3,3)九個畫素的小方框。從左到右,從上到下的與w完成內積,
最後再與b相加。
前面是w和當前黃色視窗的9個值的內積。計算結果是6,左上角這個黃色小方框經過卷積核的作用變成了6.
這個小的(6,6)的儲存空間被我們稱為卷積層的feature map
九個點資訊被壓縮到乙個點,這肯定是一種有失真壓縮,而且無法還原回去。
這是乙個資訊抽象的過程,被我們從稱作特徵提取。
25個點的資訊就會被為我們壓縮成9個點。這就是特徵提取以及壓縮。
怎麼學習這個w和b就與我們之前的bp網路一樣了。初始化w和b經過一輪一輪的訓練,目的就是為了降低損失函式的損失值,從而w和b不斷的變化,最後學習到我們想要的w和b。
wx+b輸出一般還會帶乙個激勵函式。cnn中常用的relu函式。或者直接不用激勵函式,或者用其他激勵函式。理由:
通常是為了一些特殊場景有好的表現,會採用別的激勵函式,或者不採用激勵函式。
卷積核中的w和b是通過訓練得出來的,它是模型中非常重要的引數。
如果我們從物理意義上去理解就是我們輸入了乙個向量,可能是一張,我們用眼睛掃一眼,實際對於這張各個區域的關注度和採納程度是不同的。
而這個關注程度和採納程度就可以用w和b進行描述。
padding: 用多少個畫素單位來填充輸入(向量)的邊界
striding: 每次滑動的單位
藍色的這一圈被我們稱padding。通常使用0值填充。實際中padding不會那麼大。
800px paddding五個單位就很可以了。
保持的邊緣資訊: 如果不加padding的話,周圍的這一圈只被卷積核掃了一遍。
而影象中間的會被掃多遍。加上padding就可以解決。
用途2: 輸入尺寸有差異,我們可以採用padding補齊,使得輸入的尺寸,保持一致。
在卷積層工作的時候striding可以理解為每次滑動的單位,
每次移動乙個單位,striding設為1,保證細膩程度最好。
striding大可以獲得效能提公升,掃瞄的次數少了。
池層, 是在一些cnn網路中非常喜歡設計的乙個處理層。
實際是對feature map的處理資料進行了一次池化處理。
常見的池化層處理有兩種:
(2,2)濾波器將stride設成2, 乙個(2,2)的濾波器,這個濾波器你可以理解成卷積核類似。
4個畫素中取乙個最大值填充到右邊。
4個畫素中取均值。
從左到右,從上到下,掃瞄完矩陣。
又進行了一層特徵的提取,肯定可以減小下一層資料處理的量。
特徵的提取能夠更大可能性獲取更為抽象的資料。防止過擬合,提高泛化性。
由於這種抽象性,能對輸入的變化有更大的容忍。
一些新的cnn網路的設計,沒有池化層的設計。(不必要)
我們定義乙個類convpoollayer,這個類同時實現了卷積層和池層
importerror: cannot import name 'downsample'
解決方案;
from theano.tensor.signal import downsample
...pooled_out = downsample.max_pool_2d( ... )
tofrom theano.tensor.signal import pool
...pooled_out = pool.pool_2d( ... )
# 卷積池層
class convpoollayer(object):
def __init__(self, filter_shape, image_shape, poolsize=(2, 2),
activation_fn=sigmoid):
第乙個引數是過濾器的shape, 第二個引數是image的shape 第三個引數是池層的size大小,激勵函式。
filter_shape: 元組型別,有四個維度。
這個三乘三的黃色格仔就是我們定義的過濾器。shape(3,3)
我們圖中只有乙個過濾器,其實也可以有多個過濾器。feature map的個數,第一層是
image_shape=(mini-batch的大小,輸入的feature map個數, 高, 寬)filter_shape=(filter個數,輸入的feature map個數,filter高,filter寬)
你上一層有多少個過濾器,本層就有多少個feature map。
儲存四個變數。poolsize我們定義的是(2,2)的
輸出大小等於 filter的寬高除以池層的size = 過濾器的大小。總共有多少個過濾器,filter[0]
建立共享變數: 初始化本層的w和b。這裡的兩個初始化和之前介紹的一模一樣。
將w和b儲存進params列表中。這就是卷積和池層的建構函式所做的所有事情。
跟之前全連線層的set_inpu方法一模一樣,我們也要實現乙個卷積層的set_input
input的形狀,reshape一下,變成image_shape.接著我們使用theano裡面提供的卷積函式來做卷積運算。
這裡的引數和我們的建構函式中一模一樣
conv_out = conv.conv2d(
input=self.inpt, filters=self.w, filter_shape=self.filter_shape,
image_shape=self.image_shape)
官方文件中查到這個函式。
我們呼叫theano裡的池層函式來做池化。
pooled_out = pool.pool_2d(
input=conv_out, ds=self.poolsize, ignore_border=true)
池層接收卷積層的輸出,以及pool_size的大小。
self.output = self.activation_fn(
pooled_out + self.b.dimshuffle('x', 0, 'x', 'x'))
池層的輸出我們需要加上偏置。經過激勵函式。
卷積層池層我們不做dropout
深度學習之神經網路
神經網路由輸入層 隱藏層 輸出層組成 1 單層神經網路 感知機 類似邏輯回歸,線性分類,全連線 沒有啟用函式 2 兩層神經網路 多層感知機 帶乙個隱層,非線性分類,全連線 3 多層神經網路 深度學習 全連線 4 卷積神經網路 cnn 非全連線 5 迴圈神經網路 rnn 處理序列資料 作非線性變換 s...
6 深度學習之神經網路核心原理與演算法 學習率
學習率 一塔 就是每次挪動中的步長。一塔通常來說給乙個比較小的值會更好一些。步子太大會導致邁過谷底。而由於偏導數方向的改變。你再次挪動又會向著谷底的方向挪動。只是由於步子還是很大,還是會邁過谷底。這樣就會像上圖一樣來回折返。到底設定為多少,是要根據自己的專案進行判斷的。但是小一點的值總是要好一點的。...
機器學習之 神經網路演算法原理
神經網路 好了,前面花了不少篇幅來介紹啟用函式中那個暗藏玄機的e,下面可以正式介紹神經元的網路形式了。下圖是幾種比較常見的網路形式 前面講過,使用梯度下降的方法,要不斷的修改k b兩個引數值,使最終的誤差達到最小。神經網路可不只k b兩個引數,事實上,網路的每條連線線上都有乙個權重引數,如何有效的修...