Tensorflow Шагает Аргумент


Я пытаюсь понять успехов аргумент в tf.НН.avg_pool, tf.НН.max_pool, tf.НН.conv2d.

на документация неоднократно говорит

шаги: список ints, который имеет длину >= 4. Шаг скользящего окна для каждого измерения входного тензора.

мои вопросы:

  1. что представляет собой каждое из 4 + целых чисел?
  2. почему они strides[0] = strides[3] = 1 для convnets?
  3. на мы видим tf.reshape(_X,shape=[-1, 28, 28, 1]). Почему -1?

к сожалению, примеры в документах для изменения формы с использованием -1 не слишком хорошо переводятся в этот сценарий.

4 103

4 ответа:

операции объединения и свертки перемещают "окно" по входному тензору. Используя tf.nn.conv2d в качестве примера: если входной тензор имеет 4 измерения:[batch, height, width, channels], то свертка работает на 2D окне на height, width габариты.

strides определяет, на сколько сдвигается окно в каждом из измерений. Типичное использование устанавливает первый (партия) и последний (глубина) шаг в 1.

давайте использовать очень конкретный пример: запуск a 2-d свертка по входному изображению в оттенках серого 32x32. Я говорю оттенки серого, потому что тогда входное изображение имеет глубину=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] для convnets

первый 1-это пакет: вы обычно не хотите пропускать примеры в своем пакете, или вы не должны были включать их в первую очередь. :)

последний 1-это глубина свертки: обычно вы не хотите пропускать входы по той же причине.

оператор conv2d является более общим, поэтому вы может создать извилин это скользит окно по другим измерениям, но это не типичное использование в convnets. Типичное применение состоит в использовании их в пространстве.

зачем менять форму на -1 -1-это заполнитель, который говорит: "отрегулируйте по мере необходимости, чтобы соответствовать размеру, необходимому для полного тензора."Это способ сделать код независимым от размера входного пакета, так что вы можете изменить свой конвейер и не нужно регулировать размер пакета везде в коде.

входы 4-мерные и имеют форму: [batch_size, image_rows, image_cols, number_of_colors]

шаги в общем случае определяют перекрытие между применяемыми операциями. В случае conv2d он указывает, какое расстояние между последовательными приложениями сверточных фильтров. Значение 1 в определенном измерении означает, что мы применяем оператор в каждой строке/col, значение 2 означает каждую секунду и так далее.

Re 1) значения, которые имеют значение для свертки 2-й и 3-й, и они представляют собой перекрытие в применении сверточных фильтров вдоль строк и столбцов. Значение [1, 2, 2, 1] говорит, что мы хотим применить фильтры на каждой второй строки и столбца.

Re 2) я не знаю технических ограничений (может быть требование CuDNN), но обычно люди используют шаги по измерениям строк или столбцов. Это не обязательно имеет смысл делать это по размеру партии. Не уверен последний измерение.

Re 3) Установка -1 для одного из измерений означает: "установите значение для первого измерения так, чтобы общее число элементов в Тензоре не менялось". В нашем случае -1 будет равен batch_size.

давайте начнем с того, что stride делает в 1-dim случае.

Предположим ваш 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

здесь мы скользим по одному элементу, но ничто не останавливает вас, используя любое другое число. Это число-ваш шаг. Вы можете думать об этом как о понижении дискретизации результата 1-шаговой свертки, просто принимая каждый s-й результат.

зная размер входного сигнала я ядра размере k, Страйд s и обивка p вы можете легко рассчитать размер выходного свертка как:

enter image description here

здесь || оператор-потолочные работы. Для слоя объединения с = 1.


N-тусклый случай.

зная математику для 1-тусклого случая, N-тусклый случай легко, как только вы видите, что каждый тусклый независим. Поэтому вы просто скользите по каждому измерению отдельно. Вот это пример для 2-d. Обратите внимание, что вам не нужно иметь одинаковый шаг во всех измерениях. Итак, для n-dim ввода / ядра вы должны обеспечить n шагов.


так что теперь легко ответить на все ваши вопросы:

  1. что представляет собой каждое из 4 + целых чисел?. conv2d,бассейн говорит вам, что этот список представляет шаги между каждым измерением. Обратите внимание, что длина списка шагов совпадает с рангом тензора ядра.
  2. почему у них должны быть шаги[0] = шаги3 = 1 для convnets?. Первое измерение-размер пакета, последнее-каналы. Нет смысла пропускать ни пакет, ни канал. Так что вы делаете их 1. Для ширины / высоты вы можете пропустить что-то, и именно поэтому они могут быть не 1.
  3. tf.изменить форму (_X, shape=[-1, 28, 28, 1]). Почему -1?tf.изменить форму он покрыл для вас:

    если один из компонентов фигуры имеет специальное значение -1, то размер этого измерения вычисляется таким образом, что сумма размер остается постоянным. В частности, форма [-1] уплощается в 1-D. Не более одного компонента формы может быть -1.

@dga проделал замечательную работу, объясняя, и я не могу быть достаточно благодарен, насколько это было полезно. Таким образом, я хотел бы поделиться своими выводами о том, как stride работает в 3D свертка.

по словам документация TensorFlow в conv3d форма входных данных должна быть в следующем порядке:

[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.

шаги: список ints, который имеет длину >= 5. 1-D тензор длины 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 

шаги[X] означает, сколько пропусков мы должны сделать в сосредоточенных кадрах. Так, например, если у нас есть 16 кадров, X=1 означает использовать каждый кадр. X=2 означает использовать каждый второй кадр, и он идет и дальше

шаги[y] и шаги[z] следуют объяснение от @dga поэтому я не буду переделывать эту часть.

Я надеюсь, что кто-то находит это полезным!