풀링 및 컨벌루션 연산은 입력 텐서에서 "창"을 슬라이드합니다. tf.nn.conv2d
예제로 사용 : 입력 텐서에 4 개의 차원이있는 경우 : [batch, height, width, channels]
, 컨볼 루션은 차원의 2D 창에서 작동 height, width
합니다.
strides
각 차원에서 창이 이동하는 정도를 결정합니다. 일반적인 사용은 첫 번째 (배치) 및 마지막 (깊이) 보폭을 1로 설정합니다.
매우 구체적인 예를 들어 보겠습니다. 32x32 그레이 스케일 입력 이미지에 대해 2 차원 컨볼 루션을 실행합니다. 그레이 스케일이라고 말한 이유는 입력 이미지가 깊이 = 1이기 때문에 간단하게 유지하는 데 도움이됩니다. 그 이미지를 다음과 같이 보자 :
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
단일 예제 (배치 크기 = 1)에 대해 2x2 컨볼 루션 창을 실행 해 보겠습니다. 컨볼 루션에 출력 채널 깊이를 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로 모양을 변경하는 이유 는 "전체 텐서에 필요한 크기와 일치하도록 필요에 따라 조정"이라는 자리 표시 자입니다. 코드를 입력 배치 크기와 독립적으로 만드는 방법이므로 파이프 라인을 변경할 수 있고 코드의 모든 위치에서 배치 크기를 조정할 필요가 없습니다.