靜態(tài)和動(dòng)態(tài)維度
TensorFlow: Shapes and dynamic dimensions一文中译株,對(duì)張量的靜態(tài)和動(dòng)態(tài)維度做了描述猫牡。
- 使用tf.get_shape()獲取靜態(tài)維度
- 使用tf.shape獲取動(dòng)態(tài)維度
如果你的placeholder輸入的維度都是固定的情況下彻秆,使用get_shape()检诗。但是很多情況下,我們希望想訓(xùn)練得到的網(wǎng)絡(luò)可以用于任意大小的圖像,這時(shí)你的placeholder就的輸入維度都是[None,None,None,color_dim]這樣的涝登,在這種情況下霹娄,后續(xù)網(wǎng)絡(luò)中如果需要得到tensor的維度,則需要使用tf.shape拣宏。
tf.nn.conv2d和tf.layers.conv2d
tf.nn.conv2d
和tf.layers.conv2d
都可以用來(lái)定義一個(gè)卷積層沈贝,但是兩個(gè)函數(shù)又有所不同。我個(gè)人感覺(jué)
tf.layers.conv2d
應(yīng)該是在tf.nn.conv2d
的基礎(chǔ)上進(jìn)行封裝的勋乾,因?yàn)樗膮?shù)相對(duì)而言要簡(jiǎn)單很多宋下,最主要的參數(shù)有如下:
- 輸入tensor
input
- 濾波器的數(shù)量
filters
stride
padding
而濾波器的初始化,則完全可以自身完成辑莫。
對(duì)tf.nn.conv2d
函數(shù)而言学歧,主要的參數(shù)如下:
- 輸入tensor
input
- 濾波器tensor
filter
stride
padding
主要區(qū)別就在于,使用tf.nn.conv2d的時(shí)候各吨,用戶需要自己初始化濾波器tensor枝笨,而不是自動(dòng)初始化。除此之外,兩者還有一個(gè)十分重要的區(qū)別:
-
tf.layers.conv2d
在初始化濾波器的時(shí)候横浑,只需要給出濾波器個(gè)數(shù)剔桨,其實(shí)也就是輸出結(jié)果的featue map個(gè)數(shù),也就是缺省認(rèn)為輸入函數(shù)的tensor的feature map 數(shù)量是已知的徙融。 -
tf.nn.conv2d
在初始化濾波器的時(shí)候洒缀,filter參數(shù)的維度為:[filter_height, filter_width, in_channels, out_channels]
,相當(dāng)于顯式的(in_chann)告知了輸入tensor的feature map個(gè)數(shù)欺冀。
在定義u-net的時(shí)候树绩,需要使用tf.slice
函數(shù)取出一個(gè)tensor的一部分,雖然這個(gè)tensor的維度是(?, ?, ?, 512)維度隐轩,但是使用tf.slice以后饺饭,輸出的tensor則變成了(?, ?, ?, ?)維度,繼續(xù)將這樣的一個(gè)tensor輸入tf.layers.conv2d
則會(huì)下面的錯(cuò)誤:
The channel dimension of the inputs should be defined. Found `None`.
但是將這個(gè)tensor給tf.nn.conv2d
則不會(huì)產(chǎn)生相同的錯(cuò)誤职车,因?yàn)樵诙xfilter
的時(shí)候瘫俊,定義了in_channels
,相當(dāng)于糾正了tf.slice的錯(cuò)誤提鸟。
所以军援,在定義一些較為復(fù)雜網(wǎng)絡(luò)graph的時(shí)候,最好還是使用tf.nn.conv2d
称勋,而不是使用tf.layers.conv2d
胸哥。