При сохранении модели с помощью пользовательского слоя MaskEatingLambda выдается ошибка "не JSON serializable"
Я реализую модель, которая усредняет выходную последовательность маскированного lstm по времени. Поскольку следующие плотные слои не поддерживают маску, я использую слой MaskEatingLambda, чтобы сделать среднее, как в # isssue2728.
код выглядит следующим образом:
utter=Input(batch_shape=(None,None,1,40,30), name='utter')
utter_processed=TimeDistributed(model)(utter)
mask_u=Masking(mask_value=0.)(utter_processed)
lstm_u=LSTM(256, return_sequences=True)(mask_u)
mean_u=MaskEatingLambda(lamda_mask_average, output_shape=(256,))(lstm_u)
dense1=Dense(128, activation='sigmoid')(mean_u)
classification=Dense(4, activation='softmax')(dense1)
crnn=Model(inputs=utter, outputs=classification)
при обучении модели и сохранении модели с помощью обратных вызовов она прекращает работу и выдает ошибку, подобную этой:
Traceback (most recent call last):
File "<ipython-input-29-d840d3dfe209>", line 1, in <module>
runfile('/home/ldq/CRNN ldq/0115.py', wdir='/home/ldq/CRNN ldq')
File "/home/ldq/anaconda2/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
builtins.execfile(filename, *where)
File "/home/ldq/CRNN ldq/0115.py", line 474, in <module>
ModelCheckpoint(checkpoint_pth+'{epoch:02d}-{val_acc:.2f}.hdf5',verbose=1, save_best_only=True)])
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1598, in fit
validation_steps=validation_steps)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1203, in _fit_loop
callbacks.on_epoch_end(epoch, epoch_logs)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/callbacks.py", line 77, in on_epoch_end
callback.on_epoch_end(epoch, logs)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/callbacks.py", line 417, in on_epoch_end
self.model.save(filepath, overwrite=True)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 2553, in save
save_model(self, filepath, overwrite, include_optimizer)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/models.py", line 108, in save_model
}, default=get_json_type).encode('utf8')
File "/home/ldq/anaconda2/lib/python2.7/json/__init__.py", line 251, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/home/ldq/anaconda2/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/home/ldq/anaconda2/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/home/ldq/anaconda2/lib/python2.7/site-packages/keras/models.py", line 92, in get_json_type
raise TypeError('Not JSON Serializable:', obj)
TypeError: ('Not JSON Serializable:', Any{2}.0)
когда я заменяю MaskEatingLambda обычным средним слоем, который не игнорирует маску, модель может быть сохранена.
Я не могу найти, где ошибка, потому что метод.get_config в MaskEatingLamda не выглядит неправильно. Кто-нибудь может помочь?