max_pool()中padding引數有兩種模式valid和same模式。
tensorflow的padding和卷積層一樣也有padding操作,兩種不同的操作輸出的結果有區別。
函式原型max_pool(value, ksize, strides, padding, data_format="nhwc", name=none)
這一解釋除了tf.nn.max_pool,還適用於tf.nn.conv2d和tf.layer.*下的相關函式
if padding = "same":
output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])
if padding = "valid":
output_spatial_shape[i] = ceil((input_spatial_shape[i] - (window_shape[i] - 1) * dilation_rate[i]) / strides[i])
也就是說:
「valid」 模式,在剩餘行列數小於池化視窗大小時,將最右邊和最下面的列或行拋棄,只保留有效值;
「same」 模式則是在剩餘行列數不足時補充0來滿足池化視窗的大小,保持視窗被池化區域相同;
所以輸出尺寸不是池化視窗的整數倍時,same模式的輸出要比valid的大。
#我們來看看函式的定義
#source code: line:2116
@tf_export("nn.max_pool")
def max_pool(value, ksize, strides, padding, data_format="nhwc", name=none):
"""performs the max pooling on the input.
args:
value: a 4-d `tensor` of the format specified by `data_format`.
ksize: a list or tuple of 4 ints. the size of the window for each dimension
of the input tensor.
strides: a list or tuple of 4 ints. the stride of the sliding window for
each dimension of the input tensor.
padding: a string, either `'valid'` or `'same'`. the padding algorithm.
see the "returns" section of `tf.nn.convolution` for details.
data_format: a string. 'nhwc', 'nchw' and 'nchw_vect_c' are supported.
name: optional name for the operation.
returns:
a `tensor` of format specified by `data_format`.
the max pooled output tensor.
"""with ops.name_scope(name, "maxpool", [value]) as name:
value = ops.convert_to_tensor(value, name="input")
return gen_nn_ops.max_pool(
value,
ksize=ksize,
strides=strides,
padding=padding,
data_format=data_format,
name=name)
#其中pool()函式 padding的**如下所示
#dilation_rate 預設為1的序列defaults to [1]*n
#nn_ops.py line876
if padding = "same":
output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])
#'same'方法輸出尺寸直接為 input_size/strides_size
if padding = "valid":
output_spatial_shape[i] =
ceil((input_spatial_shape[i] - (window_shape[i] - 1) * dilation_rate[i])
/ strides[i]).
#'valid'方法輸出尺寸為 [input_size-(pooling_win_size-1)*1]/stride_size
用例子解釋一下:
1.
#"valid" = without padding:
inputs: 1 2 3 4 5 6 7 8 9 10 11 (12 13)
|________________| dropped
|_________________|
#"same" = with zero padding:
pad| |pad
inputs: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
|________________|
|_________________|
|________________|
2.
x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1]) #先轉為張量輸入
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='valid')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='same')
valid_pad.get_shape() == [1, 1, 1, 1] # valid_pad is [5.] #3,6那一列被丟掉了
same_pad.get_shape() == [1, 1, 2, 1] # same_pad is [5., 6.] #加上了第四列,第二個視窗的max是6
gen_nn_ops.max_pool如何得到:
build:
gen_nn.ops:
------------------------------------------
原文:
AsyncTask兩種執行緒池
asynctask兩種執行緒池 api 3.0以後 1 thread pool executor,非同步執行緒池 使用 首先建立乙個繼承自asynctask的myasynctask類,然後呼叫 1 myasynctask asynct newmyasynctask task 2 asynct.exe...
兩種記憶體池技術(C 實現)
c 相較於其他高階語言來講,能夠方便的進行記憶體管理和操作,是其優勢也是其劣勢,運用得當將使得你編寫的程式效能大大提公升,使用不當也可能給你帶來無盡的麻煩。記憶體池就是其中的重要技術手段之一,下面重點看看常見的兩種記憶體池技術。此種記憶體池使用廣泛,實現相對簡單,基本能夠滿足大部分時候的需求,使用模...
網路層 網路層提供的兩種服務
1 虛擬電路服務 雖然網際網路是乙個利用資料報服務傳輸資訊的,但是很多其他網路體系結構 例如atm 使用的是虛擬電路網路。我們先通過電信網來了解虛擬電路,電信網進行的是面向連線的通訊方式,使用昂貴的程式控制交換機 為了保證傳輸的可靠性 從而向使用者提供可靠傳輸的服務。電信網把使用者 機產生的語音頻號...