sourcecode

텐서플로우의 tf.nn.max_pool의 'SAME' 패딩과 'VALID' 패딩의 차이점은 무엇입니까?

copyscript 2022. 10. 27. 22:24
반응형

텐서플로우의 tf.nn.max_pool의 'SAME' 패딩과 'VALID' 패딩의 차이점은 무엇입니까?

SAME'과 '의 차이점은 입니까?tf.nn.max_pooltensorflow

내 생각에 'VALID'는 최대 풀장을 할 때 가장자리 외부에 0 패딩이 없다는 것을 의미합니다.

러닝을 위한 컨볼루션 산술 가이드에 따르면, 풀 연산자에 패딩이 없을 것이라고 합니다. 즉, 'VALID'를 사용합니다.tensorflow 'SAME'의의 'tensorflow

아스키 아트를 좋아하는 경우:

  • "VALID"= 미포함 : = 패딩 :

       inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
                      |________________|                dropped
                                     |_________________|
    
  • "SAME"= 제로 = 패딩:

                   pad|                                      |pad
       inputs:      0 |1  2  3  4  5  6  7  8  9  10 11 12 13|0  0
                   |________________|
                                  |_________________|
                                                 |________________|
    

이 예에서는 다음과 같습니다.

  • 입력 폭 = 13
  • 필터 폭 = 6
  • 스트라이드 = 5

주의:

  • "VALID"오른쪽 끝 열(또는 맨 아래 행)만 드롭합니다.
  • "SAME"는 좌우로 균등하게 패딩을 시도하지만 추가되는 열의 양이 홀수인 경우 이 예시와 같이 오른쪽에 추가 열을 추가합니다(같은 논리가 수직으로 적용되므로 하단에 0 행이 추가될 수 있습니다).

편집:

이름 정보:

  • ★★★★★★★★★★★★★★★★ "SAME"패딩, 스트라이드 1을 사용하면 레이어의 출력은 입력과 동일한 공간 치수를 가집니다.
  • ★★★★★★★★★★★★★★★★ "VALID"패딩, "메이크업" 패딩 입력이 없습니다.계층은 유효한 입력 데이터만 사용합니다.

stride이 더 이다)은 할 수 있습니다.을 사용하다

  • "SAME": 출력 사이즈는 입력 사이즈와 동일합니다.이를 위해서는 필터 창이 입력 맵 밖으로 미끄러져 나와야 하므로 패드를 채워야 합니다.
  • "VALID": 필터 창은 입력 맵 내에서 유효한 위치에 유지되므로 출력 크기가 작아집니다.filter_size - 1하지 않습니다. 패딩은 발생하지 않습니다.

예를 들어 설명하겠습니다.

  • x [ : 【2, 3】, 【1】
  • valid_pad: 2및 패딩이 포함된 2x2 「」, stread 2 「VALID」.
  • same_pad: 2x2 커널, stread 2 및 SAME 패딩이 포함된 최대 풀(이것이 일반적인 방법)

출력 모양은 다음과 같습니다.

  • valid_pad이 없기 이 [1, 출력 모양은 [1, 1]입니다.
  • same_pad2, 4 : 기]는 : [ 2, 4 ) 。-inf[1, 2 pool [1, pool, [1, 2]max pool이

x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.]])

x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool

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.]
same_pad.get_shape() == [1, 1, 2, 1]   # same_pad is  [5., 6.]

TensorFlow Convolution의 예는 다음 두 가지 차이점에 대한 개요를 제공합니다.SAME ★★★★★★★★★★★★★★★★★」VALID:

  • 님의 SAME은 다음과 같이됩니다.

     out_height = ceil(float(in_height) / float(strides[1]))
     out_width  = ceil(float(in_width) / float(strides[2]))
    

그리고.

  • 님의 VALID은 다음과 같이됩니다.

     out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
     out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))
    

Yvesgere 보완Y의 훌륭한 답변입니다. 저는 이 시각화가 매우 유용하다는 것을 알았습니다.

패딩 시각화

패딩 'valid'가 첫 번째 숫자입니다.필터 창은 이미지 내부에 유지됩니다.

패딩 'same'은 세 번째 그림입니다.출력은 같은 사이즈입니다.


기사에서 찾았습니다.

시각화 크레딧: vdumoulin@GitHub

패딩은 입력 데이터의 크기를 늘리기 위한 작업입니다.1차원 데이터의 경우 배열을 상수로 추가/예비하기만 하면 되고, 2차원에서는 행렬을 상수로 둘러쌉니다.n차원에서는 n차원 하이퍼큐브를 상수로 둘러쌉니다.대부분의 경우 이 상수는 0이며 제로 패딩이라고 합니다.

다음으로 제로 패딩의 예를 제시하겠습니다.p=12-d 텐서에 적용:


커널에 임의의 패딩을 사용할 수 있지만 일부 패딩 값은 다른 값보다 더 자주 사용됩니다.

  • 유효한 패딩가장 쉬운 경우는 패딩이 전혀 없다는 것을 의미합니다.데이터를 그대로 두기만 하면 됩니다.
  • 같은 패딩은 하프 패딩이라고도 합니다.스트라이드=1인 컨볼루션(또는 풀링)의 경우 입력과 동일한 크기의 출력을 생성해야 하므로 SAME이라고 합니다.크기가 큰 커널의 경우 HALF라고 합니다.k 여기에 이미지 설명 입력
  • FULL 패딩은 최대 패딩으로 패딩된 요소에만 컨볼루션되지 않습니다.알맹이 크기k은 이 패딩과 k - 1.

TF에서 임의 패딩을 사용하려면

간단한 설명

VALID: 패딩을 적용하지 마십시오.즉, 입력 이미지가 필터와 스트레이드로 완전히 가려지도록 모든 차원이 유효하다고 가정합니다.

SAME: 입력(필요한 경우)에 패딩을 적용하여 입력 이미지가 필터로 완전히 가려지도록 하고 지정한 스트라이드를 만듭니다.스트라이드 1의 경우 출력 이미지 크기가 입력과 동일한지 확인합니다.

메모들

  • 이는 conv 레이어 및 최대 풀 레이어에 동일하게 적용됩니다.
  • 이미지의 일부를 떨어뜨려도 "무효" 상태가 되지 않기 때문에 "유효"라는 용어는 다소 잘못된 명칭입니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★은 아마 것은은 this this this this this this this this this this this라고 할 입니다.NO_PADDING★★★★★★ 。
  • 출력 치수가 입력 치수와 동일한 경우에만 스트라이드 1에 대해 의미가 있기 때문에 "동일"이라는 용어는 잘못된 명칭입니다.예를 들어 스트라이드가 2인 경우 출력 치수는 절반이 됩니다.은 아마 것은은 this this this this this this this this this this this라고 할 입니다.AUTO_PADDING★★★★★★ 。
  • - 아, 아, 아! - 아, 아, 아!SAME 자동 모드
  • - 아, 아, 아! - 아, 아, 아!VALID(즉, 패딩 모드 없음), Tensorflow는 필터와 스트라이드가 입력 이미지를 완전히 덮지 않으면 오른쪽 및/또는 아래쪽 셀을 드롭합니다.

공식 tensorflow docs https://www.tensorflow.org/api_guides/python/nn#Convolution에서 이 답변을 인용합니다. 'SAME' 패딩의 경우 출력 높이와 폭은 다음과 같이 계산됩니다.

out_height = ceil(float(in_height) / float(strides[1]))
out_width  = ceil(float(in_width) / float(strides[2]))

상단 및 왼쪽 패딩은 다음과 같이 계산됩니다.

pad_along_height = max((out_height - 1) * strides[1] +
                    filter_height - in_height, 0)
pad_along_width = max((out_width - 1) * strides[2] +
                   filter_width - in_width, 0)
pad_top = pad_along_height // 2
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width // 2
pad_right = pad_along_width - pad_left

'VALID' 패딩의 경우 출력 높이와 폭은 다음과 같이 계산됩니다.

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))

패딩 값은 항상 제로입니다.

패딩에는 valid(패딩 없음), same(또는 half), full의 3가지 선택지가 있습니다.(테아노에서) 설명은 http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html 에서 보실 수 있습니다.

  • 유효하거나 패딩 없음:

유효한 패딩에는 제로 패딩이 포함되어 있지 않기 때문에 인위적으로 생성된0 은 포함하지 않고 유효한 입력만을 커버합니다.출력 길이는 스트라이드 s=1인 경우 커널 크기 k에 대해 (입력 길이) - (k-1)이다.

  • 동일 또는 절반 패딩:

동일한 패딩은 s=1일 때 출력의 크기를 입력의 크기와 동일하게 만듭니다.s=1이면 패딩된 0의 수는 (k-1)입니다.

  • 풀 패딩:

풀 패딩은 커널이 입력 전체에 걸쳐 실행된다는 것을 의미하기 때문에 마지막에 커널은 입력 하나와 다른 입력 하나만을 충족시킬 수 있습니다.s=1이면 패딩된 0의 수는 2(k-1)입니다.s=1인 경우 출력 길이는 (입력 길이) + (k-1)입니다.

따라서 패딩 수: (유효) <= (동일) <= (풀)

유효한 패딩: 제로 패딩입니다.혼란이 없기를 바랍니다.

x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
print (valid_pad.get_shape()) # output-->(1, 2, 1, 1)

같은 패딩:공식 문서에서 언급한 바와 같이 두 가지 조건을 별도로 고려해야 하기 때문에 애당초 이해하기 어렵습니다.

해 볼까요?로됩니다. as , 「」걷다를 「」로 합니다. (단일 차원)

01: 이 01: 01::

02: 케 02 02 02:

패딩에 사용할 수 있는 최소값이 되도록 계산됩니다.「」의 이후 값. 알려진입니다. 으로 알 수

다음 예를 보겠습니다.

x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
print (same_pad.get_shape()) # --> output (1, 2, 2, 1)

여기서 x의 치수는 (3,4)이다.그런 다음 수평 방향을 취할 경우 (3):

수직 방향이 취해진 경우(4):

이것이 TF에서 SAME 패딩이 실제로 어떻게 기능하는지 이해하는 데 도움이 되기를 바랍니다.

요약하자면, '유효한' 패딩은 패딩이 없음을 의미합니다.컨볼루션레이어의 출력 사이즈는 입력 사이즈와 커널 사이즈에 따라 작아집니다.

반대로, '같은' 패딩은 패딩을 사용하는 것을 의미합니다.스트라이드가 1로 설정되어 있는 경우, 컨볼루션 레이어의 출력 사이즈는 컨볼루션 계산 시 입력 데이터 주위에 일정한 수의 '0 경계'를 부가함으로써 입력 사이즈로 유지됩니다.

이 직관적인 설명이 도움이 되었으면 합니다.

여기의 설명과 Tristan의 답변에 따라, 저는 보통 건전성 체크에 이러한 빠른 기능을 사용합니다.

# a function to help us stay clean
def getPaddings(pad_along_height,pad_along_width):
    # if even.. easy..
    if pad_along_height%2 == 0:
        pad_top = pad_along_height / 2
        pad_bottom = pad_top
    # if odd
    else:
        pad_top = np.floor( pad_along_height / 2 )
        pad_bottom = np.floor( pad_along_height / 2 ) +1
    # check if width padding is odd or even
    # if even.. easy..
    if pad_along_width%2 == 0:
        pad_left = pad_along_width / 2
        pad_right= pad_left
    # if odd
    else:
        pad_left = np.floor( pad_along_width / 2 )
        pad_right = np.floor( pad_along_width / 2 ) +1
        #
    return pad_top,pad_bottom,pad_left,pad_right

# strides [image index, y, x, depth]
# padding 'SAME' or 'VALID'
# bottom and right sides always get the one additional padded pixel (if padding is odd)
def getOutputDim (inputWidth,inputHeight,filterWidth,filterHeight,strides,padding):
    if padding == 'SAME':
        out_height = np.ceil(float(inputHeight) / float(strides[1]))
        out_width  = np.ceil(float(inputWidth) / float(strides[2]))
        #
        pad_along_height = ((out_height - 1) * strides[1] + filterHeight - inputHeight)
        pad_along_width = ((out_width - 1) * strides[2] + filterWidth - inputWidth)
        #
        # now get padding
        pad_top,pad_bottom,pad_left,pad_right = getPaddings(pad_along_height,pad_along_width)
        #
        print 'output height', out_height
        print 'output width' , out_width
        print 'total pad along height' , pad_along_height
        print 'total pad along width' , pad_along_width
        print 'pad at top' , pad_top
        print 'pad at bottom' ,pad_bottom
        print 'pad at left' , pad_left
        print 'pad at right' ,pad_right

    elif padding == 'VALID':
        out_height = np.ceil(float(inputHeight - filterHeight + 1) / float(strides[1]))
        out_width  = np.ceil(float(inputWidth - filterWidth + 1) / float(strides[2]))
        #
        print 'output height', out_height
        print 'output width' , out_width
        print 'no padding'


# use like so
getOutputDim (80,80,4,4,[1,1,1,1],'SAME')

패딩 온/오프입력의 유효 크기를 결정합니다.

VALID: 텐서의 됩니다.컨볼루션 등 ops는 텐서의 경계에 너무 가깝지 않은 "유효한" 위치에서만 수행됩니다.
커널이 3x3이고 이미지가 10x10일 경우 테두리 안쪽의 8x8 영역에서 컨볼루션(convolution)을 수행합니다.

SAME:패딩이 제공됩니다.연산이 인접을 참조할 때마다(크기에 관계없이) 해당 인접이 원래 텐서 밖으로 확장되면 해당 연산이 경계 값에서도 작동할 수 있도록 0 값이 제공됩니다.
'3x3' '10x10' '10x10' '10x10' '10x10'

일반식

여기서 W와 H는 입력의 폭과 높이, F는 필터 치수, P는 패딩 크기(즉, 패딩할 행 또는 열의 수)이다.

같은 패딩의 경우:

같은 패딩

유효한 패딩의 경우:

유효 패딩

Tensorflow 2.0 호환 답변: "유효" 및 "동일한" 패딩에 대한 자세한 설명이 위에 제공되었습니다.

단, 커뮤니티의 이익을 위해 에서 다른 풀링 기능과 각각의 명령어를 지정합니다.

1.x의 기능:

tf.nn.max_pool

tf.keras.layers.MaxPool2D

Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D

2.x의 기능:

tf.nn.max_pool 2.x 및 또는 에서 사용되는 경우 1.x에서 2.x로 이행되는 경우.

tf.keras.layers.MaxPool2D 2.x 및 에서 사용하는 경우

tf.compat.v1.keras.layers.MaxPool2D 또는.x에서 2.x로 이행하는 경우.

Average Pooling => tf.nn.avg_pool2d 또는 TF 2.x에서 사용하는 경우

tf.compat.v1.nn.avg_pool_v2 1.x에서 2.x로 이행하는 경우, 또는 또는 또는.

Tensorflow 1.x에서 2.x로의 이행에 대한 자세한 내용은 이 이행가이드를 참조해 주십시오.

유효한 패딩은 패딩이 아닙니다. 같은 패딩은 입력과 같은 크기의 출력을 가진 패딩입니다.

언급URL : https://stackoverflow.com/questions/37674306/what-is-the-difference-between-same-and-valid-padding-in-tf-nn-max-pool-of-t

반응형