Как применить маскирующий слой к последовательной модели CNN в Керасе? - PullRequest
0 голосов
/ 30 декабря 2018

У меня проблема с применением маскирующего слоя к CNN в модели RNN / LSTM.

Мои данные не являются исходным изображением, но я преобразовал их в форму (16, 34, 4) (channel_first).Данные являются последовательными, и самая длинная длина шага равна 22. Поэтому для инвариантного способа я установил временной шаг равным 22. Поскольку он может быть короче 22 шагов, я заполняю другие np.zeros.Однако для данных заполнения 0 это примерно половина среди всего набора данных, поэтому при заполнении нулями обучение не может дать очень хороший результат с таким количеством бесполезных данных.Затем я хочу добавить маску для отмены этих данных заполнения 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.
Кто-нибудь может мне помочь?

Кстати, я использовал TimeDistributed для подключения RNN, и я знаю еще один, который называется ConvLSTM2D.Кто-нибудь знает разницу?ConvLSTM2D принимает гораздо больше параметров для модели и обучается намного медленнее, чем TimeDistributed ...

1 Ответ

0 голосов
/ 05 февраля 2019

К сожалению, маскирование пока не поддерживается слоями Keras Conv.На странице Keras Github было опубликовано несколько вопросов об этом, - вот это с самым содержательным разговором на эту тему.Похоже, что были некоторые детали реализации зависания, и проблема так и не была решена.

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

Вы также можете проверить разговор вокруг этот вопрос похож на ваш.

...