тензор потока: фильтры против ядер и шагов - PullRequest
0 голосов
/ 16 декабря 2018

Python 3.5 / Windows 10 / tenorflow-gpu 1.12 (GTX 1070)

Цель: создание сверточного автоэнкодера для 3-канальных изображений

Учебное пособие Источник: https://towardsdatascience.com/autoencoders-introduction-and-implementation-3f40483b0a85

В этом уроке используется набор данных MNIST, мои изображения больше и в 3 цветовых каналах, но я пытаюсь соответствующим образом их адаптировать.

Для меня здесь путаница:

inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')

conv1 = tf.layers.conv2d(inputs=inputs_, filters=32, kernel_size=(3,3), padding='same', activation=tf.nn.relu)
# Now 28x28x32

[28,28,1] - это ч / ч и серая шкала образа mnist

Я понимаю, что размер ядра равен размеру фильтра - это правильно? (https://blog.xrds.acm.org/2016/06/convolutional-neural-networks-cnns-illustrated-explanation/)

Используя то же понимание ядра / фильтра и шага, показанное здесь: kernel/stride

Мое понимание получения карты объектов:

Iне дополнил бы вышеприведенное изображение и пришел бы к следующему:

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[5,5,1], filterXY=[3,3], strideXY=[1,1])
print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))
# Filters: 9
New Shape: [3, 3, 1]
 Padding : [0, 0]

, учитывая, что оно дополняется:

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[5,5,1], filterXY=[3,3], strideXY=[1,1], paddingXY=[1,1])
print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))

5.0
# Filters: 25
New Shape: [5, 5, 1]
 Padding : [1, 1]

Я интерпретирую количество фильтровбыть функцией размера изображения, отступа, шага и размера ядра. ( Это правильно? ) ( Какинтерпретировать сверточный фильтр TensorFlow и параметры шага? )

Мой фиктивный расчет этого отношения выглядит следующим образом:

def calc_num_filters(shapeXY, filterXY, strideXY=[1,1], paddingXY = [0,0]):
    paddingX = paddingXY[0]
    while True:
        filtersX = 1 + ((shapeXY[0]+2*paddingX-filterXY[0])/strideXY[0])
        if filtersX == int(filtersX):# and filtersX%2 == 0:
            break
        paddingX += 1
        if paddingX >= shapeXY[0]:
            raise "incompatable filter shape X"

    paddingY = paddingXY[1]
    while True:
        filtersY = 1 + ((shapeXY[1]+2*paddingY-filterXY[1])/strideXY[1])
        if filtersY == int(filtersY):# and filtersY%2 == 0:
            break
        paddingY += 1
        if paddingY >= shapeXY[1]:
            raise "incompatable filter shape Y"

    return (int(filtersX*filtersY),[int(filtersX), int(filtersY), shapeXY[2]],  [paddingX, paddingY])

В учебном примере conv1 изменяет размер тензора с [28, 28, 1] - [28, 28,32].Я заметил, что tf.layers.conv2d, кажется, делает канал (или z-dim) совпадающим со значением filters, переданным во всех случаях.

Я не могу понять, как эти значения совместимы: a 28x28 image, с kernel_size=(3,3), в результате чего 32 filters?

Предполагается, что шаг = [1,1]

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[28,28,1], filterXY=[3,3], strideXY=[1,1])
print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))

# Filters: 676
New Shape: [26, 26, 1]
 Padding : [0, 0]

Использование strideXY=[3,3]:

filter_ct_a, out_shape_a, padding_a = calc_num_filters(shapeXY=[28,28,1], filterXY=[3,3], strideXY=[3,3])
print("# Filters: {}\nNew Shape: {}\n Padding : {}".format(filter_ct_a, out_shape_a, padding_a))
# Filters: 100
New Shape: [10, 10, 1]
 Padding : [1, 1]

Если фильтр (счетчик), размер ядра, шаг и размер изображения связаны так, как я понимаю, - почему тензор потока запрашивает количество фильтров, когда это может бытьполучен?

1 Ответ

0 голосов
/ 16 декабря 2018

Количество фильтров НЕ , связанных с размером ядра, шагом или размером изображения.Скорее, это указано вами с помощью аргумента filters.Например, когда вы устанавливаете filters=32, это означает, что этот слой будет иметь 32 независимых сверточных фильтров, в этом смысле каждый из них будет применен к данному изображению, которое в вашем примере имеет форму (28, 28, 1), ивернет карту объектов (т.е. карту активации) формы (28, 28) (при условии padding='same').Следовательно, при всех фильтрах выходной слой свертки будет иметь форму (28, 28, 32).Если бы вы установили filter=53, выходной слой свертки имел бы форму (28, 28, 53), то есть снова одна карта объектов на фильтр свертки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...