使用TensorFlow搭建CNN卷積層和池化層

下面代碼中,輸入圖像色彩通道爲3;卷積層的過濾器大小設置爲5*5,深度爲16,步長爲1;池化層的過濾器大小設置爲3*3,步長爲2。卷積層全0填充:使輸入得圖像的輸出時大小相同。池化層全0填充:使圖像大小與池化過濾器能完全重合。

import tensorflow as tf

# 構建卷積層

# 通過tf.get_variable的方式創建過濾器的權重和偏置項
# 卷積層的參數個數之和過濾器的尺寸、深度以及當前層節點矩陣的深度有關
# 聲明四維矩陣,前兩維爲過濾器的尺寸,第三維爲當前層的深度,第四維爲過濾器深度
filter_weight = tf.get_variable('weight', [5, 5, 3, 16],
                                initializer=tf.truncated_normal_initializer(stddev=0.1))
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))

# tf.nn.conv2d非常方便實現卷積層前向傳播算法
# 第一個輸入爲當前層的節點矩陣,這個矩陣爲四維矩陣,第一維對應一個輸入batch,後三維爲節點矩陣
# 例如,input[0,:,:,:]表示第一張圖片,input[1,:,:,:]爲第二張圖片
# 第二個輸入爲卷積層的權重,第三個輸入爲不同維度上的步長
# 第三個輸入提供的是一個長度爲4的數組,但是數組第一位和第四位一定要是1,因爲卷積層的步長只對矩陣的長和寬有效
# 第四個輸入時填充的方法,TensorFlow只提供兩種選擇,SAME爲全0填充,VALID爲不添加
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

# tf.nn.bias_add添加偏置項,同一層同一個偏置
bias = tf.nn.bias_add(conv, biases)
#將計算結果通過ReLU激活函數完成去線性化
actived_conv = tf.nn.relu(bias)

# 構建池化層

# tf.nn.avg_pool函數實現了平均池化層,用法與max_pool相似
# tf.nn.max_pool實現了最大池化層的前向傳播過程,參數和conv2d類似
# ksize提供了過濾器的尺寸,數組第一位和第四位一定要是1,比較常用的是[1,2,2,1]和【1,3,3,1】
# strides提供了步長,數組第一位和第四位一定要是1
# padding提供了是否全0填充
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1],
                      strides=[1, 2, 2, 1], padding='SAME')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章