**
slim模組的conv2d函式,是二維卷積介面,順著源**可以看到最終調的tensorflow介面是convolution,這個地方就進入c++層面了,暫時不涉及。先來看看這個convolution函式,官方定義是這樣的:
tf.nn.convolution(
input,
filter,
padding,
strides=none,
dilation_rate=none,
name=none,
data_format=none
)
一般情況下,也就是data_format=none的時候,input的要求格式是[batch_size] + input_spatial_shape + [in_channels], 也就是要求第一維是batch,最後一維是channel,中間是真正的卷積維度。所以這個介面不僅只支援2維卷積,猜測2維卷積tf.nn.conv2d是對此介面的封裝。[batch, height, weight, channel]就是conv2d的input引數格式,batch就是樣本數,或者更狹隘一點,數量,height是高,weight是的寬,slim的分類網路都是height=weight的,以實現方陣運算,所有slim模組中的原始都需要經過預處理過程,這裡不展開。
filter引數是卷積核的定義,spatial_filter_shape + [in_channels, out_channels],對於2維卷積同樣是4維引數[weight, height, channel, out_channel]
例子1:單通道單卷積核
import tensorflow as tf
input = tf.constant(
[ [
[[100.],
[70.],
[40.]],[
[90.],
[60.],
[30.]],[
[80.],
[50.],
[20.]
]]])
#定義乙個2x2x1x1的卷積核
filter = tf.constant(
[ [
[[0.5]],[
[0.2]]],
[[[0.1]],[
[0.3]
]]])
#即卷積核為: [0.5,0.1]
# [0.2,0.3]
result = tf.nn.convolution(input, filter, padding='valid');
with tf.session() as sess:
print sess.run(result)
即輸入為:
[100,90,80]
[70,60,50]
[40,30,20]
卷積結果
[91,80]
[58,47]
例子2:三通道單卷積核
import tensorflow as tf
input = tf.constant(
[ [
[[100., 100., 20.],
[100., 100., 100.],
[100., 100., 100.]],[
[60., 100., 100.],
[100., 100., 100.],
[100., 100., 100.]],[
[20., 100., 100.],
[100., 100., 100.],
[100., 100., 100.],
]]])
#定義2x2x3x1的卷積核(3為通道數,1為輸出特徵圖數)
filter = tf.constant(
[ [
[[0.5],
[0.5],
[0.5]],[
[0.1],
[0.5],
[0.5]]],
[[[0.2],
[0.5],
[0.5]],[
[0.3],
[0.5],
[0.5]
]],]);
result = tf.nn.convolution(input, filter, padding='valid');
with tf.session() as sess:
print sess.run(result)
」』 即三通道為:
[100,60,20] 。。 [100,100,100] 。 [20,100,100]
[100,100,100] 。 [100,100,100] 。 [100,100,100]
[100,100,100] 。 [100,100,100] 。 [100,100,100]
」』 對應通道的卷積核為:
[0.5,0.2] ….[0.5,0.5] ….[0.5,0.5]
[0.1,0.3] ….[0.5,0.5] ….[0.5,0.5]
結果:
[462.474]
[510.510]
例子3:三通道2個卷積核
#定義乙個1x3x3x3的
input = tf.constant(
[ [
[[100., 100., 20.],
[100., 100., 100.],
[100., 100., 100.]],[
[60., 100., 100.],
[100., 100., 100.],
[100., 100., 100.]],[
[20., 100., 100.],
[100., 100., 100.],
[100., 100., 100.],
]]])
#定義2x2x3x2的卷積核
filter2 = tf.constant(
[ [
[[0.5, 0.2],
[0.5, 0.1],
[0.5, 0.1]],[
[0.4, 0.4],
[0.5, 0.2],
[0.5, 0.1]]],
[[[0.3, 0.3],
[0.5, 0.1],
[0.5, 0.1]],[
[0.2, 0.1],
[0.5, 0.1],
[0.5, 0.1]]],
])
卷積核為:
[0.5,0.2] ….[0.5,0.5] ….[0.5,0.5]
[0.1,0.3] ….[0.5,0.5] ….[0.5,0.5]
[0.2,0.3] ….[0.1,0.1] ….[0.10.1]
[0.4,0.1 ….[0.2,0.1] ….[0.1,0.1]
結果:
[462,474]
[510,510]
[170,158]
[190,190]
tf基礎操作
在tf中,圖表示計算任務。圖中節點被稱為operation 簡稱op op接受tensor,執行計算,產生tensor。tensor是多維陣列。為了進行計算,圖必須在會話裡被啟動。會話將圖的op分發到cpu之類的裝置上,同時提供執行op的方法,執行後,返回tensor結果。tf程式通常被組織成乙個構...
tf基礎知識
1 基本概念 圖 graph 圖描述了計算的過程,tensorflow使用圖來表示計算任務。張量 tensor tensorflow使用tensor表示資料。每個tensor是乙個型別化的多維陣列。操作 op 圖中的節點被稱為op opearation的縮寫 乙個op獲得0個或多個tensor,執行...
tf 矩陣行和列交換 tf矩陣基礎
一 placeholder tensorflow的設計理念稱之為計算流圖,在編寫程式時,首先構築整個系統的graph,並不會直接生效,這一點和python的其他數值計算庫 如numpy等 不同,graph為靜態的,類似於docker中的映象。然後,在實際的執行時,啟動乙個session,程式才會真正...