Как реализовать одномерную сверточную нейронную сеть с остаточными соединениями и пакетной нормализацией в Керасе?

1

Я пытаюсь разработать 1D сверточную нейронную сеть с остаточными связями и нормализацией партии на основе определения уровня аритмии на уровне кардиолога с сверточными нейронными сетями с использованием keras. Это код до сих пор:

# define model
x = Input(shape=(time_steps, n_features))

# First Conv / BN / ReLU layer
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(x) 
y = BatchNormalization()(y)
y = ReLU()(y)

shortcut = MaxPooling1D(pool_size = n_pool)(y)

# First Residual block
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
y = BatchNormalization()(y)
y = ReLU()(y)
y = Dropout(rate=drop_rate)(y)
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
# Add Residual (shortcut)
y = add([shortcut, y])

# Repeated Residual blocks   
for k in range (2,3): # smaller network for testing

    shortcut = MaxPooling1D(pool_size = n_pool)(y)
    y = BatchNormalization()(y)
    y = ReLU()(y)
    y = Dropout(rate=drop_rate)(y)
    y = Conv1D(filters=n_filters * k, kernel_size=n_kernel, strides=n_strides, padding='same')(y)    
    y = BatchNormalization()(y)
    y = ReLU()(y)
    y = Dropout(rate=drop_rate)(y)
    y = Conv1D(filters=n_filters * k, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
    y = add([shortcut, y])

z = BatchNormalization()(y)
z = ReLU()(z)    
z = Flatten()(z)
z = Dense(64, activation='relu')(z)
predictions = Dense(classes, activation='softmax')(z)

model = Model(inputs=x, outputs=predictions)

# Compiling 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])

# Fitting 
model.fit(train_x, train_y, epochs=n_epochs, batch_size=n_batch)

И это график упрощенной модели того, что я пытаюсь построить.

Модель, описанная в документе, использует увеличивающееся количество фильтров:

Сеть состоит из 16 остаточных блоков с 2 сверточными слоями на блок. Все сверточные слои имеют длину фильтра 16 и имеют 64k-фильтры, где k начинается с 1 и увеличивается каждый 4-й остаточный блок. Каждый альтернативный остаточный блок подбирает свои входы в 2 раза, поэтому исходный вход в конечном итоге подвыбор в 2 раза. Когда остаточный блок подвыражает ввод, соответствующие соединения быстрого доступа также подвыражают их ввод, используя операцию Max Pooling с тем же коэффициентом подвыборки.

Но я могу заставить его работать, если я использую одинаковое количество фильтров в каждом слое Conv1D, с k = 1, strides = 1 и padding = same, без применения MaxPooling1D. Любые изменения этих параметров приводят к несоответствию размера тензора и невозможности компиляции со следующей ошибкой:

ValueError: Operands could not be broadcast together with shapes (70, 64) (70, 128)

Кто-нибудь знает, как устранить несоответствие этого размера и заставить его работать?

Кроме того, если вход имеет более одного канала (или функций), несоответствие даже хуже! Есть ли способ иметь дело с несколькими каналами?

  • 1
    Вы должны включить код и сообщения об ошибках, которые вы видите.
  • 0
    Спасибо за интерес, @Matias Valdenegro, я добавил код и сообщение об ошибке в соответствии с просьбой.
Теги:
tensorflow
keras
conv-neural-network
deep-residual-networks

1 ответ

0

Вопрос о несоответствии формы тензора должен происходить в слое add([y, shortcut]). Из-за того, что вы используете уровень MaxPooling1D, это по умолчанию уменьшает ваши временные шаги, которые вы можете изменить с помощью параметра pool_size. С другой стороны, ваша остаточная часть не уменьшает временные шаги на одну и ту же сумму. Вы должны применить stride=2 с padding='same' перед добавлением shortcut и y в любом из слоев Conv1D (желательно последний).

Для справки вы можете проверить код Resnet здесь Keras -applications-github

  • 0
    При stride=2 и padding='same' на последнем слое Conv1D несоответствие формы становится (70, 64) (35, 128). Первоначально проблема была не с временными шагами (70 против 70), а с количеством фильтров (64 против 128). Единственный способ заставить его работать - это использовать то же количество фильтров в последнем слое Conv1D (64) перед добавлением shortcut . Но в статье я пытаюсь следить, что они продолжают увеличивать количество фильтров ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню