一、前述
本文講述池化層和經典神經網絡中的架構模型。
二、池化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,來提供復雜程度(層次越多不是壞事)
圖示: