'TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)'

人工智能 自然語言處理 技術 體育 CNN 軟件架構 2019-08-02
"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

那pooling 層的作用呢?pooling層也就是下采樣,通常採用的是最大值pooling和平均值pooling,因為參數太多,所以通過pooling來稀疏參數,使我們的網絡不至於太複雜。

"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

那pooling 層的作用呢?pooling層也就是下采樣,通常採用的是最大值pooling和平均值pooling,因為參數太多,所以通過pooling來稀疏參數,使我們的網絡不至於太複雜。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

池化pooling 操作不僅降低了特徵的維度,同時還會改善結果(不容易過擬合)。

流行的CNN結構

"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

那pooling 層的作用呢?pooling層也就是下采樣,通常採用的是最大值pooling和平均值pooling,因為參數太多,所以通過pooling來稀疏參數,使我們的網絡不至於太複雜。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

池化pooling 操作不僅降低了特徵的維度,同時還會改善結果(不容易過擬合)。

流行的CNN結構

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

比較流行的一種搭建結構是這樣,從下到上的順序,首先是輸入的圖片(image),經過一層卷積層 (convolution),然後在用池化(pooling)方式處理卷積的信息,這裡使用的是 max pooling 的方式。然後在經過一次同樣的處理,把得到的第二次處理的信息傳入兩層全連接的神經層 (fully connected),這也是一般的兩層神經網絡層,最後在接上一個分類器(classifier)進行分類預測。

定義卷積層的 weight和bias

首先我們導入:

import tensorflow as tf

import numpy as np

接著呢,我們定義Weight變量,輸入shape,返回變量的參數。

def weight_init(shape, name):

'''

獲取某個shape大小的參數

'''

return tf.get_variable(name, shape, initializer=tf.random_normal_initializer(mean=0.0, stddev=0.1))

其中 shape 是一個四維矩陣,前面2個維度代表了Filter 的尺寸,第3個維度表示當前層的深度(也就是輸入層的通道數),第4個維度表示Filter 的深度(也就是輸出層的通道數)。

同樣的定義bias變量,輸入shape,返回變量的一些參數。其中我們使用tf.constant_initializer()常量函數來進行初始化:

def bias_init(shape, name):

# 得到shape 大小的bias 參數

return tf.get_variable(name, shape, initializer=tf.constant_initializer(0.0))

其中shape 大小和Filter的深度有關,也就是輸出層的通道數。

定義卷積層(Convolutional Layer)

tf.nn.conv2d函數是tensoflow裡面的二維的卷積函數,x是圖片的所有參數,conv_w是此卷積層的權重,然後定義步長strides=[1,1,1,1]值,strides[0]和strides[3]的兩個1是默認值,中間兩個1代表padding時在x方向運動一步,y方向運動一步,padding採用的方式是VALID。

def conv2d(x,conv_w):

return tf.nn.conv2d(x, conv_w, strides=[1, 1, 1, 1], padding='VALID')

定義池化層(Pooling Layer)

接著定義池化pooling,為了得到更多的圖片信息,padding時我們選的是一次一步,也就是strides[1]=strides[2]=1,而我們希望壓縮一下圖片也就是參數能少一些從而減小系統的複雜度,因此我們採用pooling來稀疏化參數,也就是卷積神經網絡中所謂的下采樣層。pooling 有兩種,一種是最大值池化,一種是平均值池化,本例採用的是最大值池化tf.nn.max_pool()。池化的核函數大小為size x size,因此ksize=[1,size,size,1],步長為size,因此strides=[1,size,size,1]:

def max_pool(x, size):

return tf.nn.max_pool(x, ksize=[1,size,size,1], strides = [1,size,size,1], padding='VALID')

其中:x 輸入圖片數據;size:池化區域大小;

池化層不能減少節點矩陣的深度或者輸入樣例的個數。

演示計算矩陣通過卷積層過濾器和池化層過濾器計算後的結果

首先,定義輸入矩陣M(input),模擬圖片數據輸入。

其實,基於前面定義的函數,初始化filter_weight、biases 等等張量。

"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

那pooling 層的作用呢?pooling層也就是下采樣,通常採用的是最大值pooling和平均值pooling,因為參數太多,所以通過pooling來稀疏參數,使我們的網絡不至於太複雜。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

池化pooling 操作不僅降低了特徵的維度,同時還會改善結果(不容易過擬合)。

流行的CNN結構

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

比較流行的一種搭建結構是這樣,從下到上的順序,首先是輸入的圖片(image),經過一層卷積層 (convolution),然後在用池化(pooling)方式處理卷積的信息,這裡使用的是 max pooling 的方式。然後在經過一次同樣的處理,把得到的第二次處理的信息傳入兩層全連接的神經層 (fully connected),這也是一般的兩層神經網絡層,最後在接上一個分類器(classifier)進行分類預測。

定義卷積層的 weight和bias

首先我們導入:

import tensorflow as tf

import numpy as np

接著呢,我們定義Weight變量,輸入shape,返回變量的參數。

def weight_init(shape, name):

'''

獲取某個shape大小的參數

'''

return tf.get_variable(name, shape, initializer=tf.random_normal_initializer(mean=0.0, stddev=0.1))

其中 shape 是一個四維矩陣,前面2個維度代表了Filter 的尺寸,第3個維度表示當前層的深度(也就是輸入層的通道數),第4個維度表示Filter 的深度(也就是輸出層的通道數)。

同樣的定義bias變量,輸入shape,返回變量的一些參數。其中我們使用tf.constant_initializer()常量函數來進行初始化:

def bias_init(shape, name):

# 得到shape 大小的bias 參數

return tf.get_variable(name, shape, initializer=tf.constant_initializer(0.0))

其中shape 大小和Filter的深度有關,也就是輸出層的通道數。

定義卷積層(Convolutional Layer)

tf.nn.conv2d函數是tensoflow裡面的二維的卷積函數,x是圖片的所有參數,conv_w是此卷積層的權重,然後定義步長strides=[1,1,1,1]值,strides[0]和strides[3]的兩個1是默認值,中間兩個1代表padding時在x方向運動一步,y方向運動一步,padding採用的方式是VALID。

def conv2d(x,conv_w):

return tf.nn.conv2d(x, conv_w, strides=[1, 1, 1, 1], padding='VALID')

定義池化層(Pooling Layer)

接著定義池化pooling,為了得到更多的圖片信息,padding時我們選的是一次一步,也就是strides[1]=strides[2]=1,而我們希望壓縮一下圖片也就是參數能少一些從而減小系統的複雜度,因此我們採用pooling來稀疏化參數,也就是卷積神經網絡中所謂的下采樣層。pooling 有兩種,一種是最大值池化,一種是平均值池化,本例採用的是最大值池化tf.nn.max_pool()。池化的核函數大小為size x size,因此ksize=[1,size,size,1],步長為size,因此strides=[1,size,size,1]:

def max_pool(x, size):

return tf.nn.max_pool(x, ksize=[1,size,size,1], strides = [1,size,size,1], padding='VALID')

其中:x 輸入圖片數據;size:池化區域大小;

池化層不能減少節點矩陣的深度或者輸入樣例的個數。

演示計算矩陣通過卷積層過濾器和池化層過濾器計算後的結果

首先,定義輸入矩陣M(input),模擬圖片數據輸入。

其實,基於前面定義的函數,初始化filter_weight、biases 等等張量。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

最後,進行實際的卷積計算,和池化計算,並輸出結果。

詳細代碼如下所示。

# 第一個維度表示 batch 中樣例的個數;

# 第二個和第三個維度,表示圖片的尺寸;

# 第四個維度表示圖片的深度;

x = tf.placeholder('float32', [1, None, None, 1])

conv = conv2d(x, filter_weight)

# 將偏置項 bias 添加到value 上面

value = tf.nn.bias_add(conv, biases)

pool = max_pool(value, 2)

with tf.Session() as sess:

tf.global_variables_initializer().run()

convoluted_M = sess.run(value,feed_dict={x:M})

pooled_M = sess.run(pool,feed_dict={x:M})

print("卷積結果: \\n", convoluted_M)

print("池化結果: \\n", pooled_M)

輸出結果如下。

"

卷積神經網絡是近些年逐步興起的一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一種技術也被廣泛的傳播。卷積神經網絡最常被應用的方面是計算機的圖像識別,不過因為不斷地創新,它也被應用在視頻分析、自然語言處理、藥物發現等等。

關於卷積神經網絡的核心概念,可以參考如下鏈接:

卷積神經網絡(Convolutional Neural Networks,CNN)快速入門

卷積層(Convolution)和池化層(pooling)

卷積神經網絡包含輸入層、隱藏層和輸出層,隱藏層又包含卷積層(Convolution)和池化層(pooling),圖像輸入到卷積神經網絡後通過卷積來不斷的提取特徵,每提取一個特徵就會增加一個feature map,所以會看到下圖中的立方體不斷的增加厚度。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

那pooling 層的作用呢?pooling層也就是下采樣,通常採用的是最大值pooling和平均值pooling,因為參數太多,所以通過pooling來稀疏參數,使我們的網絡不至於太複雜。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

池化pooling 操作不僅降低了特徵的維度,同時還會改善結果(不容易過擬合)。

流行的CNN結構

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

比較流行的一種搭建結構是這樣,從下到上的順序,首先是輸入的圖片(image),經過一層卷積層 (convolution),然後在用池化(pooling)方式處理卷積的信息,這裡使用的是 max pooling 的方式。然後在經過一次同樣的處理,把得到的第二次處理的信息傳入兩層全連接的神經層 (fully connected),這也是一般的兩層神經網絡層,最後在接上一個分類器(classifier)進行分類預測。

定義卷積層的 weight和bias

首先我們導入:

import tensorflow as tf

import numpy as np

接著呢,我們定義Weight變量,輸入shape,返回變量的參數。

def weight_init(shape, name):

'''

獲取某個shape大小的參數

'''

return tf.get_variable(name, shape, initializer=tf.random_normal_initializer(mean=0.0, stddev=0.1))

其中 shape 是一個四維矩陣,前面2個維度代表了Filter 的尺寸,第3個維度表示當前層的深度(也就是輸入層的通道數),第4個維度表示Filter 的深度(也就是輸出層的通道數)。

同樣的定義bias變量,輸入shape,返回變量的一些參數。其中我們使用tf.constant_initializer()常量函數來進行初始化:

def bias_init(shape, name):

# 得到shape 大小的bias 參數

return tf.get_variable(name, shape, initializer=tf.constant_initializer(0.0))

其中shape 大小和Filter的深度有關,也就是輸出層的通道數。

定義卷積層(Convolutional Layer)

tf.nn.conv2d函數是tensoflow裡面的二維的卷積函數,x是圖片的所有參數,conv_w是此卷積層的權重,然後定義步長strides=[1,1,1,1]值,strides[0]和strides[3]的兩個1是默認值,中間兩個1代表padding時在x方向運動一步,y方向運動一步,padding採用的方式是VALID。

def conv2d(x,conv_w):

return tf.nn.conv2d(x, conv_w, strides=[1, 1, 1, 1], padding='VALID')

定義池化層(Pooling Layer)

接著定義池化pooling,為了得到更多的圖片信息,padding時我們選的是一次一步,也就是strides[1]=strides[2]=1,而我們希望壓縮一下圖片也就是參數能少一些從而減小系統的複雜度,因此我們採用pooling來稀疏化參數,也就是卷積神經網絡中所謂的下采樣層。pooling 有兩種,一種是最大值池化,一種是平均值池化,本例採用的是最大值池化tf.nn.max_pool()。池化的核函數大小為size x size,因此ksize=[1,size,size,1],步長為size,因此strides=[1,size,size,1]:

def max_pool(x, size):

return tf.nn.max_pool(x, ksize=[1,size,size,1], strides = [1,size,size,1], padding='VALID')

其中:x 輸入圖片數據;size:池化區域大小;

池化層不能減少節點矩陣的深度或者輸入樣例的個數。

演示計算矩陣通過卷積層過濾器和池化層過濾器計算後的結果

首先,定義輸入矩陣M(input),模擬圖片數據輸入。

其實,基於前面定義的函數,初始化filter_weight、biases 等等張量。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

最後,進行實際的卷積計算,和池化計算,並輸出結果。

詳細代碼如下所示。

# 第一個維度表示 batch 中樣例的個數;

# 第二個和第三個維度,表示圖片的尺寸;

# 第四個維度表示圖片的深度;

x = tf.placeholder('float32', [1, None, None, 1])

conv = conv2d(x, filter_weight)

# 將偏置項 bias 添加到value 上面

value = tf.nn.bias_add(conv, biases)

pool = max_pool(value, 2)

with tf.Session() as sess:

tf.global_variables_initializer().run()

convoluted_M = sess.run(value,feed_dict={x:M})

pooled_M = sess.run(pool,feed_dict={x:M})

print("卷積結果: \\n", convoluted_M)

print("池化結果: \\n", pooled_M)

輸出結果如下。

TensorFlow中的卷積神經網絡CNN-完整編碼示例(快速入門)

歡迎關注,歡迎交流 :)

"

相關推薦

推薦中...