Модель Keras с Maxpooling1D и каналом первым

у меня проблема с моей текущей попыткой построить последовательную модель для классификации временных рядов в Керасе. Я хочу работать с channels_first data, потому что это более удобно с точки зрения перпроцессинга (я работаю только с одним каналом). Это отлично работает для Convolution1D слои, которые я использую, как я могу указать data_sample='channels_first', но почему-то это не будет работать для Maxpooling1D, который не имеет этой опции, как кажется.

модель я хочу построить структуру следует:

model = Sequential()
model.add(Convolution1D(filters=16, kernel_size=35, activation='relu', input_shape=(1, window_length), data_format='channels_first'))
model.add(MaxPooling1D(pool_size=5)
model.add(Convolution1D(filters=16, kernel_size=10, activation='relu', data_format='channels_first'))
[...] #several other layers here

С window_length = 5000 Я получаю следующее резюме после добавления всех трех слоев:

_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
conv1d_1 (Conv1D)           (None, 32, 4966)          1152     
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 4, 4966)           0        
_________________________________________________________________
conv1d_2 (Conv1D)           (None, 16, 4957)          656      
=================================================================
Total params: 1,808
Trainable params: 1,808
Non-trainable params: 0

теперь мне интересно, правильно ли это, так как я ожидал бы, что третье измерение (т. е. количество нейронов на карте объектов), а не второе (т. е. количество фильтров) будет уменьшено слоем объединения? Как я вижу,MaxPooling1D не признает channels_first заказ и в то время как Keras documentation говорит, что существует ключевое слово data_format для MaxPooling2D, нет такого сайта на MaxPooling1D.

я протестировал всю установку с помощью channels_last формат данных, и он работал так, как я ожидал. Но с момента обращения из channels_first to channels_last занимает довольно много времени для меня, я бы предпочел эту работу с channels_first. И у меня такое чувство, что я что-то упускаю.

Если вам нужна дополнительная информация, дайте мне знать.

1 ответов


обновление: как упоминалось @HSK в комментариях, the data_format аргумент теперь поддерживается в MaxPooling слои в результате этот PR.


Ну, одна из альтернатив-использовать Permute layer (и удалите channels_first для второго слоя conv):

model = Sequential()
model.add(Convolution1D(filters=16, kernel_size=35, activation='relu', input_shape=(1, 100), data_format='channels_first'))
model.add(Permute((2, 1)))
model.add(MaxPooling1D(pool_size=5))
model.add(Convolution1D(filters=16, kernel_size=10, activation='relu'))

model.summary()

модель резюме:

Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_7 (Conv1D)            (None, 16, 66)            576       
_________________________________________________________________
permute_1 (Permute)          (None, 66, 16)            0         
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 13, 16)            0         
_________________________________________________________________
conv1d_8 (Conv1D)            (None, 4, 16)              2096      
=================================================================
Total params: 2,672
Trainable params: 2,672
Non-trainable params: 0
_________________________________________________________________