1. 程式人生 > >Tensorflow 入門學習12.卷積神經網路原理2.(池化)

Tensorflow 入門學習12.卷積神經網路原理2.(池化)

本文學習內容來自《TensorFlow深度學習應用實踐》《深度學習》

池化的概念

卷積網路中一個典型層包含三級。在第一級中,這一層並行地計算多個卷積產生一組線性啟用響應。在第二級中,每一個線性啟用響應將會通過一個非線性的啟用函式,例如整流線性啟用函式。這一級有時也被稱為探測級(detector stage)。在第三級中,我們使用池化函式(pooling function)來進一步調整這一層的輸出。

在通過卷積獲得了特徵(features)之後,下一步希望利用這些特徵去做分類。理論上講,人們可以用所有提取到的特徵去訓練分類器,如softmax分類器,但這樣做計算量過大,並容易出現過擬合(over-fitting)。
這個問題的產生是由於卷積後的特徵影象具有一種“靜態性”的屬性,這意味著在一個影象區域有用的特徵極有可能在另一個區域同樣適用。因此,為了描述大的影象,一個很自然的想法就是對不同位置的特徵進行聚合統計,例如,特徵提取可以計算影象一個區域上的某個特定的特徵的平均值(或最大值)。這些概要統計特徵不僅具有低得多的維度,同時還會改善結果(不容易過擬合)。這種聚合的操作就叫作池化(pooling),有時也稱為平均池化或最大池化(取決於計算池化的方法)。

不管採用什麼樣的池化函式,當輸入做出少量平移時,池化能夠幫助輸入的表示近似不變(invariant)。平移的不變性是指當我們對輸入進行少量平移時,經過池化函式後的大多數輸出並不會發生改變。區域性平移不變性是一個很有用的性質,尤其是當我們關心某個特徵是否出現而不關心它出現的具體位置時*。
使用池化可以看作增加了一個無限強的先驗:這一層學得的函式必須具有對少量平移的不變性。當這個假設成立時,池化可以極大地提高網路的統計效率。
對空間區域進行池化產生了平移不變性,但當我們對分離引數的卷積的輸出進行池化時,特徵能夠學得應該對於哪種變換具有不變性。

TensorFlow的max-pooling池化運算函式

tf.nn.max_pool(value,ksize,strides,padding,name=None)
  • value:需要池化的輸入,一般池化層接在卷積層後面,所以輸入通常是feature map,依然是[batch,height,width,channels]這樣的shape
  • ksize:池化容器的大小,取一個四維向量,一般是[1.height,width,1],因為我們不想在batch和channels上做池化,所以這兩個維度設為1.
  • strides:和卷積類似,視窗在每個維度上滑動的步長,一般也是[1,stride,stride,1]。
  • padding:和卷積類似,可以取“VALID”或者“SAME”,返回一個Tensor,型別不變,shape仍然是[batch,height,width,channels]這種形式。

max-pooling後的圖片:
在這裡插入圖片描述

相應的,對於多個feature map,操作如下,原本64張224X224的影象,經過Max Pooling後,變成了64張112X112的影象,從而實現了downsampling的目的。
在這裡插入圖片描述

這裡利用的就是:平移不變性(translation invariant)

除了Max Pooling,還有一些其它的池化操作,例如:SUM pooling、AVE pooling、MOP pooling、CROW pooling和RMAC pooling等

示例

import tensorflow as tf
data = tf.constant([
    [[3.0, 2.0, 3.0, 4.0],
     [2.0, 6.0, 2.0, 4.0],
     [1.0, 2.0, 1.0, 5.0],
     [4.0, 3.0, 2.0, 1.0]]
])

data = tf.reshape(data,[1, 4, 4, 1])
maxPooling = tf.nn.max_pool(data,[1, 2, 2, 1], [1, 2, 2, 1],padding="VALID")
with tf.Session() as sess:
    print(sess.run(maxPooling))

池化結果:

[[[[ 6.]
   [ 4.]]

  [[ 4.]
   [ 5.]]]]

使用池化運算加強卷積特徵提取

import tensorflow as tf
import cv2
import numpy as np

img = cv2.imread("1.png")
img = np.array(img, dtype=np.float32)
x_image = tf.reshape(img, [1, 512, 512, 3])

filter = tf.Variable(tf.ones([7, 7, 3, 1]))
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    res = tf.nn.conv2d(x_image, filter, strides=[1, 2, 2, 1], padding='SAME')
    res = tf.nn.max_pool(res,[1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')  # 池化
    res_image = sess.run(tf.reshape(res, [128, 128])) / 128+1

cv2.imshow('source', img.astype('uint8'))
cv2.imshow("lena", res_image.astype('uint8'))
cv2.waitKey()

結果:
在這裡插入圖片描述

均值池化

tf.layers.average_pooling2d

引數類似於max_pooling函式的引數。

相關推薦

Tensorflow 入門學習12.神經網路原理2.

本文學習內容來自《TensorFlow深度學習應用實踐》《深度學習》 池化的概念 卷積網路中一個典型層包含三級。在第一級中,這一層並行地計算多個卷積產生一組線性啟用響應。在第二級中,每一個線性啟用響應將會通過一個非線性的啟用函式,例如整流線性啟用函式。這一級有時

Tensorflow 入門學習13.神經網路原理3.網路結構詳解

本文學習內容來自《TensorFlow深度學習應用實踐》 從前面介紹的卷積運算的基本原理和概念,從本質上來說卷積神經網路就是將影象處理的二維離散卷積運算和神經網路相結合。這種卷積運算可以用於自動提取特徵,而卷積神經網路也主要應用於二維影象的識別。 卷積神經網路原

TensorFlow:實戰Google深度學習框架》——6.3 神經網路常用結構

池化層在兩個卷積層之間,可以有效的縮小矩陣的尺寸(也可以減小矩陣深度,但實踐中一般不會這樣使用),co。池從而減少最後全連線層中的引數。 池化層既可以加快計算速度也可以防止過度擬合問題的作用。 池化層也是通過一個類似過濾器結構完成的,計算方式有兩種: 最大池化層:採用最

深度學習 --- 深度神經網路詳解AlexNet 網路詳解

  本篇將解釋另外一個卷積神經網路,該網路是Hinton率領的谷歌團隊(Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton)在2010年的ImageNet大賽獲得冠軍的一個神經網路,因此本節主要參考的論文也是這次大賽的論文即“Imag

深度學習神經網路原理詳解

初探CNN卷積神經網路 1、概述 典型的深度學習模型就是很深層的神經網路,包含多個隱含層,多隱層的神經網路很難直接使用BP演算法進行直接訓練,因為反向傳播誤差時往往會發散,很難收斂 CNN節省訓練開銷的方式是權共享weight sharing,讓一組神經元

深度學習神經網路程式設計實現

void conv_bprop(Layer *layer, Layer *prev_layer, bool *pconnection) { int index = 0; int size = prev_layer->map_w * prev_layer->map_h; // delta

利用tensorflow實現簡單的神經網路-對程式碼中相關函式介紹——遷移學習小記

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

利用tensorflow實現簡單的神經網路——遷移學習小記

一、什麼是神經網路(CNN)     卷積神經網路(Convolutional Neural Network,簡稱CNN),是一種前饋神經網路,人工神經元可以影響周圍單元,可以進行大型影象處理。卷積神經網路包括卷積層和池化層。卷積神經網路是受到生物思考方式的啟發的MLPs(多

深度學習:Keras入門(二)之神經網路(CNN)

說明:這篇文章需要有一些相關的基礎知識,否則看起來可能比較吃力。 1.卷積與神經元          1.1 什麼是卷積?          簡單來說,卷積(或內積)就是一種先把對應位置相乘然後再把結果相加的運算。(具體含義或者數學公式可以查閱相關資料)      

深度學習神經網路CNN入門

該文是,並假設你理解前饋神經網路。 目錄 視覺感知 畫面識別是什麼識別結果取決於什麼 影象表達 畫面識別的輸入畫面不變形 前饋神經網路做畫面識別的不足卷積神經網路做畫面識別 區域性連線空間共享輸出空間表達Depth維的處理Zero padding形狀、概念抓取多filte

深度學習神經網路入門2

卷積神經網路入門學 作者:hjimce 卷積神經網路演算法是n年前就有的演算法,只是近年來因為深度學習相關演算法為多層網路的訓練提供了新方法,然後現在電腦的計算能力已非當年的那種計算水平,同時現在的訓練資料很多,於是神經網路的相關演算法又重新火了起來,因此卷積神經網路就又

深度學習神經網路CNN及tensorflow程式碼實現示例詳細介紹

一、CNN的引入 在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高時,這時全連線網路需要訓練的引數就會增大很多,計算速度就會變得很慢,例如一張黑白的 28×28 的手寫數字圖片,輸入層的神經元就有784個,如下圖所示:

基於Tensorflow的機器學習(6) -- 神經網路

本篇部落格將基於tensorflow的estimator以及MNIST實現LeNet。具體實現步驟如下: 匯入必要內容 from __future__ import division, print_function, absolute_import #

深度學習神經網路CNN及tensorflow程式碼實現示例

一、CNN的引入 在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高時,這時全連線網路需要訓練的引數就會增大很多,計算速度就會變得很慢,例如一張黑白的 28×28 的手寫數字圖片,輸入層的神經元就有784個,如下圖

深度學習神經網路,啟用函式,

卷積神經網路——輸入層、卷積層、啟用函式、池化層、全連線層 https://blog.csdn.net/yjl9122/article/details/70198357?utm_source=blogxgwz3 一、卷積層 特徵提取 輸入影象是32*32*3,3是它的深度(即R

深度學習筆記——神經網路

程式碼參考了零基礎入門深度學習(4) - 卷積神經網路這篇文章,我只對程式碼裡可能存在的一些小錯誤進行了更改。至於卷積神經網路的原理以及程式碼裡不清楚的地方可以結合該文章理解,十分淺顯易懂。 import numpy as np from functools import reduce fro

深度學習基礎--神經網路的不變性

卷積神經網路的不變性   不變性的實現主要靠兩點:大量資料(各種資料);網路結構(pooling) 不變性的型別   1)平移不變性   卷積神經網路最初引入區域性連線和空間共享,就是為了滿足平移不變性。   關於CNN中的平移不變性的來源有多種假設。   一個想法是平移不變性

機器學習神經網路

摘要:   卷積神經網路(Convolutional Neural Network,CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。 引言:   在傳統的機器學習中,通常是我們自己來尋找特徵,而深度學習中我們通過神經網路來自主的學習特診。在大量資

【深度學習神經網路

講卷積神經網路之前說說為什麼能夠進行分類識別?按照傳統的SIFT,HOG演算法都是先進行特徵的提取過程,那麼卷積神經網路怎麼進行特徵的提取呢?   下面,我們就開始吧! 先提一個小問題:“你是通過什麼瞭解這個世界的?” 當一輛汽車從你身邊疾馳而過,你是通過哪些資訊知道那是一

【深度學習神經網路層和層計算

一、簡介 \quad\quad 卷積神經網路(Convolutional neural network, CNN),