【问题标题】:How to apply masking layer to sequential CNN model in Keras?如何在 Keras 中将遮罩层应用于顺序 CNN 模型?
【发布时间】:2019-05-27 09:44:09
【问题描述】:

我在 RNN/LSTM 模型中将屏蔽层应用于 CNN 时遇到问题。

我的数据不是原图,而是转换成(16,34,4)(channels_first)的形状。数据是连续的,最长的步长是 22。所以对于不变的方式,我将时间步设置为 22。由于它可能比 22 步短,我用 np.zeros 填充其他的。但是,对于 0 padding 的数据,它大约是所有数据集的一半,所以在 0 padding 的情况下,在这么多无用数据的情况下,训练无法达到很好的效果。然后我想添加一个掩码来取消这0个填充数据。

这是我的代码。

mask = np.zeros((16,34,4), dtype = np.int8)  
input_shape = (22, 16, 34, 4)  
model = Sequential()  
model.add(TimeDistributed(Masking(mask_value=mask), input_shape=input_shape, name = 'mask'))  
model.add(TimeDistributed(Conv2D(100, (5, 2), data_format = 'channels_first', activation = relu), name = 'conv1'))  
model.add(TimeDistributed(BatchNormalization(), name = 'bn1'))  
model.add(Dropout(0.5, name = 'drop1'))  
model.add(TimeDistributed(Conv2D(100, (5, 2), data_format = 'channels_first', activation = relu), name ='conv2'))  
model.add(TimeDistributed(BatchNormalization(), name = 'bn2'))  
model.add(Dropout(0.5, name = 'drop2'))  
model.add(TimeDistributed(Conv2D(100, (5, 2), data_format = 'channels_first', activation = relu), name ='conv3'))  
model.add(TimeDistributed(BatchNormalization(), name = 'bn3'))  
model.add(Dropout(0.5, name = 'drop3'))  
model.add(TimeDistributed(Flatten(), name = 'flatten'))  
model.add(GRU(256, activation='tanh', return_sequences=True, name = 'gru'))  
model.add(Dropout(0.4, name = 'drop_gru'))  
model.add(Dense(35, activation = 'softmax', name = 'softmax'))  
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['acc'])

这是模型结构。
model.summary():

_________________________________________________________________  
Layer (type)                 Output Shape              Param #     
=================================================================  
mask (TimeDist (None, 22, 16, 34, 4)     0           
_________________________________________________________________  
conv1 (TimeDistributed)      (None, 22, 100, 30, 3)    16100       
_________________________________________________________________  
bn1 (TimeDistributed)        (None, 22, 100, 30, 3)    12          
_________________________________________________________________  
drop1 (Dropout)              (None, 22, 100, 30, 3)    0           
_________________________________________________________________  
conv2 (TimeDistributed)      (None, 22, 100, 26, 2)    100100      
_________________________________________________________________  
bn2 (TimeDistributed)        (None, 22, 100, 26, 2)    8           
_________________________________________________________________  
drop2 (Dropout)              (None, 22, 100, 26, 2)    0           
_________________________________________________________________  
conv3 (TimeDistributed)      (None, 22, 100, 22, 1)    100100      
_________________________________________________________________  
bn3 (TimeDistributed)        (None, 22, 100, 22, 1)    4           
_________________________________________________________________  
drop3 (Dropout)              (None, 22, 100, 22, 1)    0           
_________________________________________________________________  
flatten (TimeDistributed)    (None, 22, 2200)          0           
_________________________________________________________________  
gru (GRU)                    (None, 22, 256)           1886976     
_________________________________________________________________  
drop_gru (Dropout)           (None, 22, 256)           0           
_________________________________________________________________  
softmax (Dense)              (None, 22, 35)            8995        
=================================================================  
Total params: 2,112,295  
Trainable params: 2,112,283  
Non-trainable params: 12  
_________________________________________________________________

对于 mask_value,我尝试使用 0 或这个掩码结构,但两者都不起作用,它仍然训练所有数据,其中包含半个 0 填充。
谁能帮帮我?

B.T.W.,我这里用TimeDistributed连接RNN,我知道还有一个叫ConvLSTM2D。有谁知道区别? ConvLSTM2D 需要更多的模型参数,并且训练速度比 TimeDistributed 慢得多......

【问题讨论】:

    标签: keras conv-neural-network lstm mask masking


    【解决方案1】:

    不幸的是,Keras Conv 层尚不支持遮罩。在 Keras Github 页面here is the one 上发布了几个关于此问题的问题,其中有关于该主题的最实质性的对话。似乎有一些挂起的实现细节,问题从未解决。

    讨论中提出的解决方法是对序列中的填充字符进行显式嵌入并进行全局池化。 Here is another 我发现的解决方法(对我的用例没有帮助,但可能对您有帮助) - 保持掩码数组通过乘法合并。

    您也可以查看与您类似的this question 周围的对话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2012-12-14
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多