Понимание канала в форме ввода и вывода Convolution Neural Network (CNN) - PullRequest
0 голосов
/ 08 января 2019

Я пытался следовать этому уроку https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

В базовой модели он имеет model.add(Conv2D(32, (3, 3), input_shape=(3, 150, 150)))

Я не совсем слежу за формой вывода здесь. Если входная форма 3x150x150 с размером ядра 3x3, не будет ли выходная форма 3x148x148? (При условии, что нет отступов). Однако, согласно Керасу Доку:

Форма вывода: тензор 4D с формой: (партия, фильтры, new_rows, new_cols)

Мне кажется, что выходная форма будет 32x148x148. Мой вопрос, правильно ли это понимание? Если да, то откуда берутся дополнительные фильтры?

1 Ответ

0 голосов
/ 08 января 2019

Если входная форма равна (3, 150, 150), после применения слоя Conv2D выходной сигнал будет (?, 32, 148, 148). Проверьте это на следующем примере:

inps = Input(shape=(3, 150, 150))
conv = Conv2D(32, (3, 3), data_format='channels_first')(inps)
print(conv)
>> Tensor("conv2d/BiasAdd:0", shape=(?, 32, 148, 148), dtype=float32)
  • Первое измерение, которое указано символом ?, - это размер партии.
  • Вторым измерением является размер фильтра (32).
  • Последние два - ширина и высота изображения (148).

Как каналы меняются с 3 на 32? Предположим, у нас есть изображение RGB (3 канала) и размер выходного канала равен 1. Происходят следующие вещи:

enter image description here

Когда вы используете filters=32 и kernel_size=(3,3), вы создаете 32 разных фильтра, каждый из которых имеет форму (3,3,3). Результат принесет 32 разных извилины. Обратите внимание, что, согласно Keras , все ядра инициализируются в начале glorot_uniform.

Изображение из этого сообщения в блоге .

...