텐서플로 보폭 인수
tf.n.avg_pool, tf.nn.max_pool, tf.nn.conv2d의 strength 인수를 이해하려고 합니다.
문서는 반복적으로 다음과 같이 말합니다.
보폭:길이가 >= 4인 int 목록입니다.입력 텐서의 각 차원에 대한 슬라이딩 윈도우의 스트라이드.
제 질문은 다음과 같습니다.
- 4+ 정수 각각은 무엇을 나타냅니까?
- 왜 그들은 컨넷을 위해 보폭[0] = 보폭[3] = 1을 가져야 합니까?
- 이 예에서 볼 수 있는 것은
tf.reshape(_X,shape=[-1, 28, 28, 1])왜 -1?
슬프게도 -1을 사용한 모양 변경에 대한 문서의 예제는 이 시나리오로 너무 잘 번역되지 않습니다.
풀링 및 컨볼루션 작업은 "창"을 입력 텐서에 걸쳐 슬라이드합니다.예로 사용:입력 텐서가 4차원인 경우:[batch, height, width, channels]은 그면컨션은볼다 합니다.height, width 치수
strides창이 각 차원에서 이동하는 정도를 결정합니다.일반적으로 첫 번째(배치) 및 마지막(깊이) 스트라이프를 1로 설정합니다.
매우 구체적인 예를 사용해 보겠습니다. 32x32 그레이스케일 입력 이미지에서 2D 컨볼루션 실행.입력 이미지의 깊이=1이 단순하게 유지되도록 도와주기 때문에 회색 스케일이라고 합니다.이미지를 다음과 같이 표시합니다.
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
단일 예제에 대해 2x2 컨볼루션 창을 실행해 보겠습니다(슬롯 크기 = 1).콘볼루션의 출력 채널 깊이는 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: 왜 컨넷에 대한 발전 [1, x, y, 1]
첫 번째는 배치입니다. 일반적으로 배치에서 예제를 건너뛰거나, 처음부터 포함하지 말았어야 했습니다.:)
마지막 1은 컨볼루션의 깊이입니다.일반적으로 같은 이유로 입력을 건너뛸 수 없습니다.
conv2d 연산자는 더 일반적이기 때문에 창을 다른 차원을 따라 슬라이드하는 컨볼루션을 만들 수 있지만, 이는 convnet에서 일반적으로 사용되는 것은 아닙니다.일반적인 용도는 공간적으로 사용하는 것입니다.
-1-1로 모양을 바꾸는 이유는 "전체 텐서에 필요한 크기와 일치하도록 필요에 따라 조정"이라고 말하는 자리 표시자입니다.코드를 입력 배치 크기와 독립적으로 만들어 파이프라인을 변경하고 코드의 모든 위치에서 배치 크기를 조정할 필요가 없도록 하는 방법입니다.
는 다음과 .[batch_size, image_rows, image_cols, number_of_colors]
일반적으로, 단계는 적용 작업 간의 중복을 정의합니다.conv2d의 경우 연속적인 컨볼루션 필터 응용 프로그램 간의 거리를 지정합니다.특정 차원의 값이 1이면 모든 행/콜에 연산자를 적용하고, 2이면 매 초를 의미합니다.
Re 1) 컨볼루션에 중요한 값은 두 번째와 세 번째이며, 이 값은 행과 열을 따라 컨볼루션 필터를 적용할 때 중복되는 값을 나타냅니다.[1, 2, 2, 1]의 값은 모든 두 번째 행과 열에 필터를 적용하려는 것을 나타냅니다.
Re2) 기술적 한계(CuDNN 요구 사항일 수 있음)는 모르지만 일반적으로 사람들은 행 또는 열 치수를 따라 보폭을 사용합니다.배치 크기를 초과하는 것이 반드시 의미가 있는 것은 아닙니다.마지막 차원이 확실하지 않습니다.
Re 3) 치수 수단 중 하나에 대한 설정 -1 "텐서의 총 요소 수가 변경되지 않도록 첫 번째 치수 값을 설정합니다."이 경우 -1은 batch_size와 같습니다.
1차원 케이스에서 스트라이드가 하는 일부터 시작해 보겠습니다.
다음과 같이 들어보겠습니다.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, 스트라이드 및 패딩 p를 알면 컨볼루션의 출력 크기를 쉽게 계산할 수 있습니다.
여기서 || 연산자는 천장 연산을 의미합니다.풀링 레이어의 경우 = 1.
N-dim 대소문자.
1차원 케이스에 대한 수학을 알면, 각 디딤이 독립적이라는 것을 알면 n차원 케이스는 쉽습니다.따라서 각 차원을 개별적으로 슬라이드합니다.다음은 2-d의 예입니다.모든 차원에서 동일한 보폭을 가질 필요는 없습니다.따라서 N-dim 입력/커널의 경우 N 단계를 제공해야 합니다.
이제 모든 질문에 쉽게 대답할 수 있습니다.
- 4+ 정수 각각은 무엇을 나타냅니까?conv2d, 풀은 이 목록이 각 차원 간의 단계를 나타낸다고 말합니다.단계 목록의 길이는 커널 텐서의 순위와 같습니다.
- 왜 그들은 컨넷을 위해 보폭[0] = 보폭 3 = 1을 가져야 합니까?첫 번째 차원은 배치 크기이고 마지막 차원은 채널입니다.배치도 채널도 건너뛸 수 없습니다.그래서 당신은 그들을 1로 만듭니다.너비/높이의 경우 생략할 수 있으므로 1이 아닐 수 있습니다.
- tf.reshape(_X, shape=[-1, 28, 28, 1]). -1?tf.refshape에서 다룬 이유:
형상의 한 성분이 특수 값 -1이면 해당 차원의 크기가 계산되어 전체 크기가 일정하게 유지됩니다.특히 [-1]의 모양은 1-D로 납작해집니다.형상의 최대 한 성분은 -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.
다음은 스트라이드 사용 방법에 대한 요약 문서입니다.
보폭:길이 >= 길이 5의 5.1-D 텐서를 갖는 int 목록.각 입력 차원에 대한 슬라이딩 윈도우의 스트라이프입니다.가져야만 한다
strides[0] = strides[4] = 1
많은 연구에서 보여주듯이, 보폭은 단순히 창이나 커널이 가장 가까운 요소로부터 얼마나 멀리 떨어져 있는지를 의미합니다(이는 데이터 프레임 또는 픽셀).
위의 문서에서 3D의 스트라이드는 이와 같은 보폭 = (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
strades[X]는 뭉친 프레임에서 건너뛰기 횟수를 의미합니다.예를 들어, 16개의 프레임이 있는 경우 X=1은 모든 프레임을 사용하는 것을 의미합니다.X=2는 매 초당 프레임을 사용하고 계속 사용하는 것을 의미합니다.
strages[y]와 strages[z]는 @dga의 설명을 따르므로 그 부분은 다시 하지 않겠습니다.
그러나 케라스에서 공간 차원이 strade[x], strade[y] 및 strade[z]인 각 공간 차원을 따라 컨볼루션의 단계를 지정하여 3개의 정수로 이루어진 튜플/목록만 지정하면 됩니다.strages[0] 및 strages[4]는 이미 기본값으로 1입니다.
누군가 이것이 도움이 되길 바랍니다!
언급URL : https://stackoverflow.com/questions/34642595/tensorflow-strides-argument
'programing' 카테고리의 다른 글
| @RequestMapping 주석은 @FeignClient 인터페이스에서 허용되지 않습니다. (0) | 2023.07.26 |
|---|---|
| Java 스프링:'@Value' 주석을 사용하여 'Environment' 속성을 주입하는 방법은? (0) | 2023.07.26 |
| jquery를 사용하여 특정 클래스 이름을 가진 모든 확인란 가져오기 (0) | 2023.07.26 |
| SQL 시퀀스의 다음 N개 숫자 (0) | 2023.07.26 |
| SQL UPDATE에서 str_replace? (0) | 2023.07.26 |
