[python] Tensorflow Strides 인수

tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d 의 strides 인수 를 이해하려고합니다 .

문서는 반복적으로 말한다

strides : 길이가 4보다 큰 정수 목록입니다. 입력 텐서의 각 차원에 대한 슬라이딩 창의 보폭입니다.

내 질문은 다음과 같습니다.

  1. 4 개 이상의 정수는 각각 무엇을 나타 냅니까?
  2. convnet에 대해 strides [0] = strides [3] = 1이 필요한 이유는 무엇입니까?
  3. 에서 이 예를 우리는 볼 tf.reshape(_X,shape=[-1, 28, 28, 1]). 왜 -1?

슬프게도 -1을 사용하여 모양을 변경하는 문서의 예제는이 시나리오에 너무 잘 적용되지 않습니다.



답변

풀링 및 컨벌루션 연산은 입력 텐서에서 “창”을 슬라이드합니다. tf.nn.conv2d예제로 사용 : 입력 텐서에 4 개의 차원이있는 경우 : [batch, height, width, channels], 컨볼 루션은 차원의 2D 창에서 작동 height, width합니다.

strides각 차원에서 창이 이동하는 정도를 결정합니다. 일반적인 사용은 첫 번째 (배치) 및 마지막 (깊이) 보폭을 1로 설정합니다.

매우 구체적인 예를 들어 보겠습니다. 32×32 그레이 스케일 입력 이미지에 대해 2 차원 컨볼 루션을 실행합니다. 그레이 스케일이라고 말한 이유는 입력 이미지가 깊이 = 1이기 때문에 간단하게 유지하는 데 도움이됩니다. 그 이미지를 다음과 같이 보자 :

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

단일 예제 (배치 크기 = 1)에 대해 2×2 컨볼 루션 창을 실행 해 보겠습니다. 컨볼 루션에 출력 채널 깊이를 8로 지정합니다.

컨볼 루션에 대한 입력에는 shape=[1, 32, 32, 1].

지정한 경우 strides=[1,1,1,1]padding=SAME, 그 필터의 출력이 될 것이다 [1, 32, 32, 8].

필터는 먼저 다음에 대한 출력을 생성합니다.

F(00 01
  10 11)

그리고 다음을 위해 :

F(01 02
  11 12)

등등. 그런 다음 두 번째 행으로 이동하여 다음을 계산합니다.

F(10, 11
  20, 21)

그때

F(11, 12
  21, 22)

보폭을 [1, 2, 2, 1]로 지정하면 창을 겹치지 않습니다. 다음을 계산합니다.

F(00, 01
  10, 11)

그리고

F(02, 03
  12, 13)

보폭은 풀링 연산자와 유사하게 작동합니다.

질문 2 : 왜 convnets가 [1, x, y, 1] 증가 하는가

첫 번째는 배치입니다. 일반적으로 배치에서 예제를 건너 뛰고 싶지 않거나 처음부터 포함하지 않아야합니다. 🙂

마지막 1은 컨볼 루션의 깊이입니다. 같은 이유로 일반적으로 입력을 건너 뛰고 싶지 않습니다.

conv2d 연산자가 더 일반적이므로 다른 차원을 따라 창을 슬라이드하는 컨볼 루션을 만들 있지만 convnet에서는 일반적으로 사용되지 않습니다. 일반적인 용도는 공간적으로 사용하는 것입니다.

-1 -1로 모양을 변경하는 이유 는 “전체 텐서에 필요한 크기와 일치하도록 필요에 따라 조정”이라는 자리 표시 자입니다. 코드를 입력 배치 크기와 독립적으로 만드는 방법이므로 파이프 라인을 변경할 수 있고 코드의 모든 위치에서 배치 크기를 조정할 필요가 없습니다.


답변

입력은 4 차원이며 다음과 같은 형식입니다. [batch_size, image_rows, image_cols, number_of_colors]

일반적으로 보폭은 적용 작업 간의 겹침을 정의합니다. conv2d의 경우 연속적인 컨벌루션 필터 적용 사이의 거리를 지정합니다. 특정 차원에서 1의 값은 모든 행 / 열에 연산자를 적용 함을 의미하고, 2의 값은 매초를 의미하는 식입니다.

Re 1) convolutions에 중요한 값은 2nd와 3rd이며 행과 열을 따라 convolutional 필터를 적용 할 때 겹치는 부분을 나타냅니다. [1, 2, 2, 1] 값은 두 번째 행과 열마다 필터를 적용하려고 함을 나타냅니다.

Re 2) 기술적 한계 (CuDNN 요구 사항 일 수 있음)를 모르지만 일반적으로 사람들은 행 또는 열 차원을 따라 스트라이드를 사용합니다. 배치 크기를 초과하여 수행하는 것이 반드시 의미가있는 것은 아닙니다. 마지막 차원이 확실하지 않습니다.

다시 3) 차원 중 하나에 -1을 설정하는 것은 “텐서의 총 요소 수가 변경되지 않도록 첫 번째 차원의 값을 설정”하는 것을 의미합니다. 우리의 경우 -1은 batch_size와 같습니다.


답변

1 차원의 경우 stride가 수행하는 작업부터 시작하겠습니다.

하자 당신의 가정 input = [1, 0, 2, 3, 0, 1, 1]kernel = [2, 1, 3]회선의 결과는 [8, 11, 7, 9, 4], 입력을 통해 커널을 슬라이딩 요소 현명한 곱셈을 수행하고 모든 것을 합산하여 계산된다. 이렇게 :

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

여기서 우리는 한 요소로 미끄러지지 만 다른 숫자를 사용하여 멈추지 않습니다. 이 숫자가 당신의 걸음입니다. 모든 s- 번째 결과를 취함으로써 1- 줄무늬 컨볼 루션의 결과를 다운 샘플링하는 것으로 생각할 수 있습니다.

입력 크기 i , 커널 크기 k , 스트라이드 s 및 패딩 p 를 알면 컨볼 루션의 출력 크기를 다음과 같이 쉽게 계산할 수 있습니다.

여기에 이미지 설명 입력

여기 || 운영자는 천장 작동을 의미합니다. 풀링 레이어의 경우 s = 1입니다.


N-dim 케이스.

1 차원 경우의 수학을 알면 각 차원이 독립적이라는 것을 알면 n 차원 경우가 쉽습니다. 따라서 각 차원을 개별적으로 슬라이드하면됩니다. 다음은 2-d예입니다 . 모든 차원에서 동일한 보폭을 가질 필요는 없습니다. 따라서 N 차원 입력 / 커널의 경우 N 개의 스트라이드를 제공해야합니다.


이제 모든 질문에 쉽게 답할 수 있습니다.

  1. 4 개 이상의 정수는 각각 무엇을 나타 냅니까? . conv2d , pool 은이 목록이 각 차원 간의 보폭을 나타냄을 알려줍니다. strides 목록의 길이는 커널 텐서의 순위와 같습니다.
  2. convnet에 대해 strides [0] = strides 3 = 1이 필요한 이유는 무엇입니까? . 첫 번째 차원은 배치 크기이고 마지막 차원은 채널입니다. 배치도 채널도 건너 뛸 필요가 없습니다. 그래서 당신은 그것들을 1로 만듭니다. 너비 / 높이에 대해 당신은 무언가를 건너 뛸 수 있고 그것이 1이 아닐 수도있는 이유입니다.
  3. tf.reshape (_X, shape = [-1, 28, 28, 1]). 왜 -1? tf.reshape 에서 다음과 같이 처리합니다.

    모양의 한 구성 요소가 특수 값 -1이면 전체 크기가 일정하게 유지되도록 해당 차원의 크기가 계산됩니다. 특히 [-1]의 모양은 1 차원으로 평평 해집니다. 모양의 구성 요소는 최대 하나만 -1이 될 수 있습니다.


답변

@dga는 설명하는 훌륭한 일을 해냈고 그것이 얼마나 도움이되었는지 충분히 감사 할 수 없습니다. 같은 방식으로 stride3D 컨볼 루션 에서 어떻게 작동 하는지에 대한 연구 결과를 공유하고 싶습니다 .

conv3d 에 대한 TensorFlow 문서 에 따르면 입력의 모양은 다음 순서 여야합니다.

[batch, in_depth, in_height, in_width, in_channels]

예제를 사용하여 가장 오른쪽에서 왼쪽으로 변수를 설명해 봅시다. 입력 모양이 다음과 같다고 가정합니다.
input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

아래는 stride 사용 방법에 대한 요약 문서입니다.

strides : 길이가 5보다 큰 정수 목록입니다. 길이가 5 인 1 차원 텐서 5. 각 입력 차원에 대한 슬라이딩 창의 보폭. 있어야합니다strides[0] = strides[4] = 1

많은 작품에서 알 수 있듯이, 스트라이드는 데이터 프레임이나 픽셀과 같이 창이나 커널이 가장 가까운 요소에서 얼마나 멀리 떨어져 있는지를 의미합니다.

위의 문서에서 3D의 보폭은 다음과 같이 보일 것입니다. strides = (1, X , Y , Z , 1).

문서는 strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch
strides[4]=1 means that we do not want to skip in the channel 

strides [X]는 집중 프레임에서 얼마나 많은 스킵을해야 하는지를 의미합니다. 예를 들어 16 개의 프레임이있는 경우 X = 1은 모든 프레임을 사용함을 의미합니다. X = 2는 매 두 번째 프레임을 사용함을 의미하며 계속됩니다.

strides [y] 및 strides [z]는 @dga 의 설명을 따르 므로 해당 부분을 다시 실행하지 않겠습니다.

그러나 keras에서는 각 공간 차원을 따라 컨볼 루션의 스트라이드를 지정하여 3 개의 정수로 구성된 튜플 /리스트 만 지정하면됩니다. 여기서 공간 차원은 stride [x], strides [y] 및 strides [z]입니다. strides [0] 및 strides [4]는 이미 기본값이 1로 설정되어 있습니다.

누군가가 도움이 되었기를 바랍니다!


답변