Понимание формы вывода слоя conv2d в кератах - PullRequest
0 голосов
/ 31 марта 2019

Я не понимаю, почему измерение канала не включено в выходное измерение слоя conv2D в Keras.

У меня есть следующая модель

def create_model():
    image = Input(shape=(128,128,3))

    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_1')(image)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_2')(x)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_3')(x)
    flatten = Flatten(name='flatten')(x)

    output = Dense(1, activation='relu', name='output')(flatten)
    model = Model(input=image, output=output)
    return model

model = create_model()
model.summary()

Краткое описание модели приведено в конце моего вопроса. Входной слой принимает изображения RGB с шириной = 128 и высотой = 128. Первый слой conv2D сообщает мне, что выходной размер равен (Нет, 61, 61, 24). Я использовал размер ядра (8, 8), шаг (2, 2) без заполнения. Значения 61 = floor ((128 - 8 + 2 * 0) / 2 + 1) и 24 (количество ядер / фильтров) имеют смысл. Но почему измерение для разных каналов не включено в измерение? Насколько я вижу, параметры для 24 фильтров на каждом из каналов включены в число параметров. Таким образом, я ожидаю, что выходное измерение будет (Нет, 61, 61, 24, 3) или (Нет, 61, 61, 24 * 3). Это просто странная запись в Керасе или я запутался в другом?

enter image description here

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Формула, которую вы используете, верна. Это может немного сбивать с толку, потому что многие популярные учебники используют количество фильтров, равное количеству каналов в изображении. Реализация TensorFlow / Keras производит выходные данные, вычисляя num_input_channels * num_output_channels карты промежуточных объектов размером (kernel_size[0], kernel_size[1]). Таким образом, для каждого входного канала он создает num_output_channels карты объектов, которые затем умножаются и объединяются для создания выходной формы (kernel_size[0], kernel_size[1], num_output_channels) Надеюсь, это проясняет подробный ответ Влада

0 голосов
/ 31 марта 2019

Каждый из сверточных фильтров (8 x 8) подключен к (8 x 8) рецептивному полю для всех каналов изображения .Вот почему мы имеем (61, 61, 24) в качестве выхода второго слоя.Различные каналы неявно закодированы в весах 24 фильтров.Это означает, что каждый фильтр не имеет 8 x 8 = 64 весов, но вместо этого 8 x 8 x Количество каналов = 8 x 8 x 3 = 192 весов.

См. Эту цитату из CS231 enter image description here

Слева: пример входного объема красным цветом (например, изображение CIFAR-10 размером 32x32x3) и пример объема нейронов в первом сверточном слое. Каждый нейрон в сверточном слое пространственно связан только с локальной областью входного объема, но на полную глубину (т. Е. Все цветовые каналы) .Обратите внимание, что на глубине есть несколько нейронов (5 в этом примере), все они смотрят на одну и ту же область на входе - см. Обсуждение столбцов глубины в тексте ниже.Справа: нейроны из главы «Нейронные сети» остаются неизменными: они все еще вычисляют точечное произведение их весов на вход, за которым следует нелинейность, но теперь их связность ограничена, чтобы быть локально пространственной.

0 голосов
/ 31 марта 2019

Полагаю, вы не понимаете, как определены сверточные слои.

Моя запись формы сверточного слоя: (out_channels, in_channels, k, k), где k - размер ядра. out_channels - это количество фильтров (то есть сверточных нейронов). Рассмотрим следующее изображение:

Convolution illustration

Веса трехмерного сверточного ядра на рисунке скользят по разным окнам данных A_{i-1} (т. Е. Входное изображение). Патчи трехмерных данных этого изображения формы (in_channels, k, k) соединены с отдельными трехмерными сверточными ядрами соответствующей размерности. Сколько существует таких 3d-ядер? По количеству выходных каналов out_channels. Измерение глубины, которое принимает ядро, составляет in_channels из A_{i-1}. Поэтому размер in_channels из A_{i-1} сокращается точечным произведением по глубине, которое создает выходной тензор с out_channels каналами. Точный способ построения скользящих окон определяется набором выборок (kernel_size, stride, padding)), в результате чего получается тензор вывода с пространственными размерами, определяемыми по формуле, которую вы правильно применили.

Если вы хотите понять больше, включая обратное распространение и реализацию, взгляните на эту бумагу.

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