池化層max pool中兩種paddding操作

2021-09-24 09:10:53 字數 3838 閱讀 1971

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 使用的是虛擬電路網路。我們先通過電信網來了解虛擬電路,電信網進行的是面向連線的通訊方式,使用昂貴的程式控制交換機 為了保證傳輸的可靠性 從而向使用者提供可靠傳輸的服務。電信網把使用者 機產生的語音頻號...