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


一、前述

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

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

圖示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM