Свертка по каналам в Keras CNN: Conv1D, Conv1D, CCP? - PullRequest
6 голосов
/ 30 апреля 2019

Я разрабатываю CNN в кератах, чтобы классифицировать спутниковые снимки, которые имеют 10 спектральных полос. Я получаю приличную точность с сетью ниже (точность ~ 60% для 15 классов), но я хочу лучше включить взаимосвязи между спектральными полосами в одном пикселе, что может дать много информации о классе пикселя. Я вижу, что многие газеты делают это, но это часто называют разными вещами. Например:

  • Каскадный межканальный параметрический пул
  • Conv1D
  • Глубинно отделимая свертка
  • Conv2D (num_filters, (1, 1))

И я не уверен в различиях между этими подходами (если они есть) и в том, как я должен реализовать это в моем простом CNN ниже. Мне также не ясно, должен ли я сделать это в самом начале или ближе к концу. Я склонен делать это в самом начале, когда каналы все еще являются необработанными спектральными данными, а не картами объектов.

input_shape = (32,32,10)
num_classes = 15

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape))
model.add(Activation('relu'))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

1 Ответ

2 голосов
/ 29 мая 2019

Позвольте мне объяснить операции, которые вы упомянули, более подробно, чтобы вы понимали различия между их интуицией и использованием:

Каскадный межканальный параметрический пул:

Это введено в Network-in-Network бумага и реализована в Keras как GlobalAveragePooling2D().Эта операция усредняется по выходным данным каждой карты объектов в предыдущих слоях.

Это структурный регуляризатор, который обеспечивает соответствие между картами объектов и категориями, поэтому карты объектов можно интерпретировать как достоверность категорий.Он уменьшает количество параметров и суммирует пространственную информацию, и, следовательно, он более устойчив к пространственным преобразованиям входных данных.

GlobalAveragePooling2D() обычно используется без слоев Dense() в модели до него.

Conv1D:

Conv1D() - операция свертки, точно такая же, как Conv2D(), но она применяется только к одному измерению.Conv1D() обычно используется для последовательностей или других данных 1D, а не для изображений.

Глубинно отделимая свертка:

Цитирование из документации Keras

Отделимые свертки состоят в том, что сначала выполняют пространственную свертку по глубине (которая действует на каждый входной канал отдельно), а затем точечную свертку, которая смешивает результирующие выходные каналы.Аргумент deep_multiplier контролирует, сколько выходных каналов генерируется для каждого входного канала на шаге глубины.

Этот блог довольно хорошо объясняет разделяемую по глубине свертку.

Conv2D(num_filters, (1, 1)):

Это обычно называется сверткой 1x1, представленной в статье Network-in-Network .

Сверточные фильтры 1x1 используются для уменьшения / увеличения размерности в измерении фильтра, не влияя на пространственные размеры.Это также используется в архитектуре Google Inception для уменьшения размерности пространства фильтра.

В вашем конкретном случае я не совсем уверен, какой из этих методов вы можете использовать.Я не думаю, что Conv1D будет полезным.Вы можете определенно использовать GlobalMaxPooling или GlobalAveragePooling, если вы не используете Dense перед ними.Это полезно для получения пространственной информации.Depthwise Separable Convolution также может использоваться вместо ваших Conv2D слоев.Conv2D(num_filters, (1, 1)) очень полезен для уменьшения размерности пространства фильтра, в основном к концу архитектуры вашей модели.

Возможно, если вы будете следовать ресурсам, вы лучше поймете операции и посмотрите, как они применяются к вашемупроблема.

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