1. assignments2
# test the affine_forward function
num_inputs = 2
input_shape = (4, 5, 6)
output_dim = 3
input_size = num_inputs * np.prod(input_shape)
weight_size = output_dim * np.prod(input_shape)
x = np.linspace(-0.1, 0.5, num=input_size).reshape(num_inputs, *input_shape)
w = np.linspace(-0.2, 0.3, num=weight_size).reshape(np.prod(input_shape), output_dim)
b = np.linspace(-0.3, 0.1, num=output_dim)
out, _ = affine_forward(x, w, b)
correct_out = np.array([[ 1.49834967, 1.70660132, 1.91485297],
[ 3.25553199, 3.5141327, 3.77273342]])
# compare your output with ours. the error should be around 1e-9.
print 'testing affine_forward function:'
print 'difference: ', rel_error(out, correct_out)
此處用np.prod和 np.linspace等一系列函式初始化權重w和x,與之前直接用np.random等函式想比略顯複雜,如此初始化的好處是什麼?
**a: **在這個**模組裡,最主要是為了測試前向傳播函式是否實現正確,所以需要固定的權重和資料來得出結果,以和函式的輸出進行對比。而之前隨機生成的資料輸出結果也是隨機的,無法用於判定實現的前向傳播函式是否正確。
1. im2col操作
用矩陣乘法實現:卷積運算本質上就是在濾波器和輸入資料的區域性區域間做點積。卷積層的常用實現方式就是利用這一點,將卷積層的前向傳播變成乙個巨大的矩陣乘法:
輸入影象的區域性區域被im2col操作拉伸為列。比如,如果輸入是[227x227x3],要與尺寸為11x11x3的濾波器以步長為4進行卷積,就取輸入中的[11x11x3]資料塊,然後將其拉伸為長度為11x11x3=363的列向量。重複進行這一過程,因為步長為4,所以輸出的寬高為(227-11)/4+1=55,所以得到im2col操作的輸出矩陣x_col的尺寸是[363x3025],其中每列是拉伸的感受野,共有55x55=3,025個。注意因為感受野之間有重疊,所以輸入資料體中的數字在不同的列中可能有重複。
卷積層的權重也同樣被拉伸成行。舉例,如果有96個尺寸為[11x11x3]的濾波器,就生成乙個矩陣w_row,尺寸為[96x363]。
現在卷積的結果和進行乙個大矩陣乘np.dot(w_row, x_col)是等價的了,能得到每個濾波器和每個感受野間的點積。在我們的例子中,這個操作的輸出是[96x3025],給出了每個濾波器在每個位置的點積輸出。
結果最後必須被重新變為合理的輸出尺寸[55x55x96]。
這個方法的缺點就是占用記憶體太多,因為在輸入資料體中的某些值在x_col中被複製了多次。但是,其優點是矩陣乘法有非常多的高效實現方式,我們都可以使用(比如常用的blas api)。還有,同樣的im2col思路可以用在匯聚操作中。
**q: **在神經網路訓練開始前,都要對輸入資料做乙個歸一化處理,那為什麼需要歸一化呢?1. 定義**a: **神經網路學習過程本質就是為了學習資料分布,一旦訓練資料與測試資料的分布不同,那麼網路的泛化能力也大大降低;另外一方面,一旦每批訓練資料的分布各不相同(batch 梯度下降),那麼網路就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網路的訓練速度,這也正是為什麼我們需要對資料都要做乙個歸一化預處理的原因。
批量歸一化。讓啟用資料在訓練開始前通過乙個網路,網路處理資料使其服從標準高斯分布。使用了批量歸一化的網路對於不好的初始值有更強的魯棒性。
2. 優點
3. 前向傳播過程公式
4. 反向傳播求導公式
sample_mean = k.mean(x, axis=-1, keepdims=true)#計算均值
sample_var = k.std(x, axis=-1, keepdims=true)#計算標準差
x_normed = (x - sample_mean) / (sample_var + self.epsilon)#歸一化
out = self.gamma * x_normed + self.beta#重構變換
running_mean = momentum * running_mean + (1 - momentum) * sample_mean
running_var = momentum * running_var + (1 - momentum) * sample_var
out = self.gamma * x_normed + self.beta 這個操作為「scale and shift」操作。為了讓因訓練所需而「刻意」加入的bn能夠有可能還原最初的輸入(即當),從而保證整個network的capacity。(實際上bn可以看作是在原模型上加入的「新操作」,這個新操作很大可能會改變某層原來的輸入。當然也可能不改變,不改變的時候就是「還原原來輸入」。如此一來,既可以改變同時也可以保持原輸入,那麼模型的容納能力(capacity)就提公升了。) 當引入bn層,原始的資料分布可能會因此遭到破壞,從而導致網路的loss變大,則在反向傳播中,可以使用梯度更新規則對引數gamma和beta進行更新,從而接用「scale and shift」操作,以求可能保持原輸入的部分特徵。
我們訓練時使用乙個minibatch的資料,因此可以計算均值和方差,但是**時一次只有乙個資料,所以均值方差都是0,那麼bn層什麼也不幹,原封不動的輸出。這肯定會用問題,因為模型訓練時是進過處理的,但是測試時又沒有,那麼結果肯定不對。 解決的方法是使用訓練的所有資料,也就是所謂的population上的統計。不過這需要訓練完成之後在多出乙個步驟。一種常見的辦法就是基於momentum的指數衰減,這和低通濾波器類似。每次更新時把之前的值衰減一點點(乘以乙個momentum,一般很大,如0.9,0.99),然後把當前的值加一點點進去(1-momentum)。
《1。卷積神經網路》
1.簡述卷積的基本操作,並分析其與全連線層的區別 答 具有區域性連線和權值共享的特點。卷積操作能夠在輸出資料中大致保持輸入資料的結構資訊 2.在卷積神經網路中,如何計算各層的感受野大小?答 3.卷積層的輸出尺寸 參數量和計算量 答 輸出尺寸 1.簡述分組卷積及其應用場景 答 分組卷積就是將輸入通道和...
卷積神經網路 1 1 卷積核
卷積神經網路中卷積核的作用是提取影象更高維的特徵,乙個卷積核代表一種特徵提取方式,對應產生乙個特徵圖,卷積核的尺寸對應感受野的大小。經典的卷積示意圖如下 5 5的影象使用3 3的卷積核進行卷積,結果產生3 3 5 3 1 的特徵影象。卷積核的大小一般是 2n 1 2n 1 的奇數乘奇數大小 n 1 ...
卷積神經網路 1 1 卷積核
卷積神經網路中卷積核的作用是提取影象更高維的特徵,乙個卷積核代表一種特徵提取方式,對應產生乙個特徵圖,卷積核的尺寸對應感受野的大小。經典的卷積示意圖如下 5 5的影象使用3 3的卷積核進行卷積,結果產生3 3 5 3 1 的特徵影象。卷積核的大小一般是 2n 1 2n 1 的奇數乘奇數大小 n 1 ...