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

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

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

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

мои вопросы:

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

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

4 ответов


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

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

давайте используем очень конкретный пример: запуск 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.


давайте с шагом в 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

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

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

enter image description here

здесь / / оператор означает потолочную работу. Для слоя объединения с = 1.


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

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


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

  1. что представляет собой каждое из 4 + целых чисел?. conv2d, бассейн говорит вам, что этот список представляет шаги между каждым измерением. Обратите внимание, что длина списка шагов совпадает с рангом тензора ядра.
  2. почему у них должны быть шаги[0] = шаги3 = 1 для конвнеты?. Первое измерение-размер пакета, последнее-каналы. Нет смысла пропускать ни партию, ни канал. Поэтому вы делаете их 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.

strides: список 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 

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

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

в keras, однако, вам нужно только указать кортеж / список из 3 целых чисел, указав шаги свертки вдоль каждого пространственного измерения, где пространственное измерение-это шаг[x], шаги[y] и шаги[z]. strides[0] и strides[4] уже по умолчанию равны 1.

надеюсь, кто-то найдет это полезным!