1

В соответствии с этим paper, форма выход N + H - 1, N вводится высота или ширина, высота H является ядром или ширина. Это очевидный обратный процесс свертки. В этом tutorial приведена формула для расчета выходной формы свертки, которая равна (W−F+2P)/S+1, W - размер ввода, F - размер фильтра, P - размер прокладки, S - шаг. Но в Tensorflow, есть тестовые примеры, как:Получение выходной формы деконволюции слоя с использованием tf.nn.conv2d_transpose в tensorflow

strides = [1, 2, 2, 1] 

    # Input, output: [batch, height, width, depth] 
    x_shape = [2, 6, 4, 3] 
    y_shape = [2, 12, 8, 2] 

    # Filter: [kernel_height, kernel_width, output_depth, input_depth] 
    f_shape = [3, 3, 2, 3] 

Поэтому мы используем y_shape, f_shape и x_shape, согласно формуле (W−F+2P)/S+1 для расчета размера обивки P. От (12 - 3 + 2P)/2 + 1 = 6 мы получаем P = 0.5, который не является целым числом. Как работает деконволюция в Tensorflow?

ответ

2

Формула для выходного размера из учебника предполагает, что заполнение P то же самое до и после изображения (слева & справа или сверху & нижнего). Затем количество мест, в которые вы положили ядро: W (size of the image) - F (size of the kernel) + P (additional padding before) + P (additional padding after).

Но тензорный поток также обрабатывает ситуацию, когда вам нужно накладывать больше пикселей на одну из сторон, чем на другую, чтобы ядра соответствовали правильно. Вы можете узнать больше о стратегиях выбора прокладки ("SAME" и "VALID") в docs. Тест, о котором вы говорите, использует метод "VALID".

1

Это обсуждение действительно полезно. Просто добавьте дополнительную информацию. padding='SAME' также позволяет нижней и правой стороне получить дополнительный дополнительный пиксель. Согласно TensorFlow document и случае тест ниже

strides = [1, 2, 2, 1] 
# Input, output: [batch, height, width, depth] 
x_shape = [2, 6, 4, 3] 
y_shape = [2, 12, 8, 2] 

# Filter: [kernel_height, kernel_width, output_depth, input_depth] 
f_shape = [3, 3, 2, 3] 

использует отступы = «ЖЕ». Мы можем интерпретировать отступы = 'ЖЕ' как:

(W−F+pad_along_height)/S+1 = out_height, 
(W−F+pad_along_width)/S+1 = out_width. 

Так (12 - 3 + pad_along_height)/2 + 1 = 6, и мы получаем pad_along_height=1. И pad_top=pad_along_height/2 = 1/2 = 0 (целочисленное деление), pad_bottom=pad_along_height-pad_top=1.

Что касается padding = 'VALID', как следует из названия, мы используем отступы, когда наступит подходящее время для его использования. Сначала мы предполагаем, что заполненный пиксель = 0, если это не работает, то добавим 0 дополнений, где любое значение вне области исходного входного изображения. Например, тест ниже,

strides = [1, 2, 2, 1] 

# Input, output: [batch, height, width, depth] 
x_shape = [2, 6, 4, 3] 
y_shape = [2, 13, 9, 2] 

# Filter: [kernel_height, kernel_width, output_depth, input_depth] 
f_shape = [3, 3, 2, 3] 

Выходная форма conv2d является

out_height = ceil(float(in_height - filter_height + 1)/float(strides[1])) 
      = ceil(float(13 - 3 + 1)/float(3)) = ceil(11/3) = 6 
      = (W−F)/S + 1. 

Причина (W−F)/S+1 = (13-3)/2+1 = 6, результат является целым числом, нам не нужно, чтобы добавить 0 пикселей вокруг границы изображение и pad_top=1/2, pad_left=1/2 в разделе TensorFlow document отступа = «дЕЙСТВИТЕЛЬНО» равны 0.

+0

ответ о 'tf.nn.conv2d', как работает режим работы набивка для' tf.nn.conv2d_transpose'? 'tf.nn.conv2d_transpose' сделает выходной тензор большим, чем вход. – gaussclb

Смежные вопросы