Аргумент Шенсових тенів


115

Я намагаюся зрозуміти аргумент кроків у tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.

Документація неодноразово говорить

кроки: Список вкладок, що має довжину> = 4. Хід ковзаючого вікна для кожного виміру вхідного тензора.

Мої запитання:

  1. Що представляють кожне з 4+ цілих чисел?
  2. Чому вони повинні мати кроки [0] = кроки [3] = 1 для конвентів?
  3. У цьому прикладі ми бачимо tf.reshape(_X,shape=[-1, 28, 28, 1]). Чому -1?

На жаль, приклади в документах для переробок з використанням -1 не дуже добре підходять до цього сценарію.

Відповіді:


224

Об'єднання об'єднаного та згорткового ковзання просувають "вікно" по вхідному тензору. Використовуючи 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 ...
...

Давайте запустимо вікно згортання 2х2 над одним прикладом (розмір партії = 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 - це партія. Зазвичай ви не хочете пропускати приклади у вашій партії, або ви не повинні включати їх у першу чергу. :)

Останнє 1 - це глибина згортання: зазвичай не потрібно пропускати входи з тієї ж причини.

Оператор conv2d є загальнішим, тому ви можете створити згортки, які розсувають вікно за іншими параметрами, але це не типове використання у конвєнці. Типовим є використання їх просторово.

Чому переформатуйте на -1 -1 - це заповнювач, який говорить: "регулюйте за необхідності відповідно до розміру, необхідного для повного тензора". Це спосіб зробити код незалежним від розміру вхідної партії, так що ви можете змінити конвеєр і не потрібно змінювати розмір партії скрізь у коді.


5
@derek, оскільки (з тексту) "Ми дамо згортці вихідний канал глибиною 8". Це те, що ви можете вибрати, встановлюючи згортку, і відповідач вибрав 8.
etarion

17

Входи чотиривимірні та мають форму: [batch_size, image_rows, image_cols, number_of_colors]

Штрихи, як правило, визначають перекриття між операціями застосування. У випадку conv2d він вказує, яка відстань між послідовними додатками згорткових фільтрів. Значення 1 у конкретному вимірі означає, що ми застосовуємо оператор у кожному рядку / стовпчику, значення 2 означає щосекунди тощо.

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

Re 2) Я не знаю технічних обмежень (можливо, це вимога CuDNN), але зазвичай люди використовують кроки по розмірах рядків або стовпців. Це не обов'язково має сенс робити це за розміром партії. Не впевнений в останньому вимірі.

Re 3) Встановлення -1 для одного з розмірних значень "встановіть значення для першого виміру таким чином, щоб загальна кількість елементів у тензорі залишалася незмінною". У нашому випадку -1 буде дорівнює batch_size.


11

Почнемо з того, що робить крок в 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-ї ступінчастої згортки, просто взявши кожен s-й результат.

Знаючи вхідний розмір i , розмір ядра k , крок s і прокладку p, ви можете легко обчислити вихідний розмір згортки як:

введіть тут опис зображення

Тут || оператор означає роботу стелі. Для шару об'єднання s = 1.


N-затемнений корпус.

Знаючи математику для 1-димного випадку, n-dim випадок легко, як тільки ви побачите, що кожний логік незалежний. Тому ви просто ковзаєте кожен вимір окремо. Ось приклад для 2-д . Зауважте, що вам не потрібно мати однаковий крок у всіх вимірах. Отже, для N-dim вводу / ядра вам слід надати N кроків.


Тож зараз легко відповісти на всі ваші запитання:

  1. Що представляють кожне з 4+ цілих чисел? . conv2d , pool повідомляє вам, що цей список відображає кроки серед кожного виміру. Зауважте, що довжина списку кроків збігається з рангом тензора ядра.
  2. Чому вони повинні мати кроки [0] = кроки 3 = 1 для конвентів? . Перший вимір - розмір партії, останній - канали. Немає сенсу пропускати ні партію, ні канал. Отже, ви робите їх 1. За шириною / висотою ви можете щось пропустити, і тому вони можуть бути не 1.
  3. tf.reshape (_X, shape = [- 1, 28, 28, 1]). Чому -1? tf.reshape охоплює це для вас:

    Якщо одним із компонентів форми є спеціальне значення -1, розмір цього розміру обчислюється так, щоб загальний розмір залишався постійним. Зокрема, форма [-1] вирівнюється в 1-D. Максимум один компонент форми може бути -1.


2

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

Нижче наведена зведена документація щодо того, як використовується крок.

кроки: Список вводів, що має довжину> = 5. 1-D тензор довжини 5. Хід ковзаючого вікна для кожного виміру вводу. Повинен мати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 

кроки [X] означають, скільки пропусків нам слід зробити в згущених кадрах. Наприклад, якщо у нас є 16 кадрів, X = 1 означає використовувати кожен кадр. X = 2 означає використовувати кожен другий кадр, і він продовжується і продовжується

strides [y] та strides [z] дотримуйтесь пояснення @dga, тому я не буду повторювати цю частину.

Однак у керах потрібно лише вказати кортеж / список з 3 цілих чисел, вказавши кроки згортки вздовж кожного просторового виміру, де просторовий вимір є кроком [x], кроками [y] та strides [z]. кроки [0] та кроки [4] вже встановлені за замовчуванням до 1.

Я сподіваюся, що хтось вважає це корисним!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.