7

我目前尝试在 Keras 中为时间序列分类构建顺序模型时遇到了问题。我想使用channels_first数据,因为从 perprocessing 的角度来看它更方便(不过我只使用一个通道)。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 文档说存在关键字data_formatfor MaxPooling2D,但没有这样的关键字 for MaxPooling1D

我用channels_last数据格式测试了整个设置,它按我的预期工作。但由于从channels_firstto的转换channels_last对我来说需要相当长的时间,我真的更愿意使用channels_first. 我有一种感觉,我只是错过了一些东西。

如果您需要更多信息,请告诉我。

4

1 回答 1

4

更新正如@HSK 在评论中所提到的,由于这个 PR,这个data_format参数现在在MaxPooling层中得到支持。


好吧,另一种选择是使用该Permute层(并删除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
_________________________________________________________________
于 2018-08-22T08:55:55.073 回答