【深度學習篇】--神經網路中的池化層和CNN架構模型

LHBlog發表於2018-03-28

一、前述

本文講述池化層和經典神經網路中的架構模型。

二、池化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,來提供複雜程度(層次越多不是壞事

圖示:

 

相關文章