一、前述
本文講述池化層和經典神經網路中的架構模型。
二、池化Pooling
1、目標
降取樣subsample,shrink(濃縮),減少計算負荷,減少記憶體使用,引數數量減少(也可防止過擬合)
減少輸入圖片大小(降低了圖片的質量)也使得神經網路可以經受一點圖片平移,不受位置的影響(池化後相當於把圖片上的點平移了)
正如卷積神經網路一樣,在池化層中的每個神經元被連線到上面一層輸出的神經元,只對應一小塊感受野的區域。我們必須定義大小,步長,padding型別
池化神經元沒有權重值,它只是聚合輸入根據取最大或者是求均值
2*2的池化核,步長為2,沒有填充,只有最大值往下傳遞,其他輸入被丟棄掉了
2、舉例
3、結論
長和寬兩倍小,面積4倍小,丟掉75%的輸入值
一般情況下,池化層工作於每一個獨立的輸入通道,所以輸出的深度和輸入的深度相同
4、程式碼
import numpy as np from sklearn.datasets import load_sample_images import tensorflow as tf import matplotlib.pyplot as plt # 載入資料集 # 輸入圖片通常是3D,[height, width, channels] # mini-batch通常是4D,[mini-batch size, height, width, channels] dataset = np.array(load_sample_images().images, dtype=np.float32) # 資料集裡面兩張圖片,一箇中國廟宇,一個花 batch_size, height, width, channels = dataset.shape print(batch_size, height, width, channels)# channels是3個 # 建立輸入和一個池化層 X = tf.placeholder(tf.float32, shape=(None, height, width, channels)) # TensorFlow不支援池化多個例項,所以ksize的第一個batch size是1 # TensorFlow不支援池化同時發生的長寬高,所以必須有一個是1,這裡channels就是depth維度為1 max_pool = tf.nn.max_pool(X, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')#沒有卷積直接做池化 # avg_pool() with tf.Session() as sess: output = sess.run(max_pool, feed_dict={X: dataset}) plt.imshow(output[0].astype(np.uint8)) # 畫輸入的第一個影象 plt.show()
總結:在一個卷積層裡面,不同的卷積核步長和維度都一樣的,每個卷積核的channel是基於上一層的channel來的
三、CNN架構
原理:
典型的CNN架構堆列一些卷積層
1、一般一個卷積層後跟ReLU層,然後是一個池化層,然後另一些個卷積層+ReLU層,然後另一個池化層,通過網路傳遞的圖片越來越小,但是也越來越深,例如更多的特徵圖!(隨著深度越深,寬度越寬,卷積核越多),這些層都是在提取特徵。
2、最後常規的前向反饋神經網路被新增,由一些全連線的層+ReLU層組成,最後是輸出層預測,例如一個softmax層輸出預測的類概率(真正分類是最後全連線層)。
3、一個常見的誤區是使用卷積核過大,你可以使用和9*9的核同樣效果的兩個3*3的核,好處是會有更少的引數需要被計算,還可以在中間多加一個非線性啟用函式ReLU,來提供複雜程度(層次越多不是壞事)
圖示: