Не удается сохранить модель Keras при использовании в ней модели limit_mean? - PullRequest
0 голосов
/ 04 апреля 2019

Фрагмент кода Keras гласит:

second_input = inputs_d['second_input']
selected = embedding_layer(second_input)
item_average = tf.reduce_mean(selected, axis=1, keepdims=True)
second_input_encoded = tf.keras.layers.Reshape((3,))(item_average)

Если я изменю second_input с shape (5,) на shape (1,) и избавлюсь от reduce_mean, код будет работать нормально.

Сообщение об ошибке гласит:

/ site-packages / tenorflow / python / util / serialization.py ", строка 69, в get_json_type поднять TypeError ('Not JSON Serializable:', obj) TypeError: ('Not JSON Serializable:', б "\ п \ x04Mean \ x12 \ x04Mean \ x1a'embedding_1 / embedding_lookup / Identity_2 \ x1a \ x16Mean / reduction_indices * \ X07 \ п \ x01T \ x12 \ X020 \ x01 * \ п \ п \ x04Tidx \ x12 \ X020 \ x03 * \ X0F \ п \ tkeep_dims \ x12 \ x02 (\ x01" )

1 Ответ

0 голосов
/ 04 апреля 2019

Вам необходимо использовать слой Lambda для выполнения пользовательских операций:

item_average = tf.keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis=1, keepdims=True))(selected)

Выходные данные слоев Keras представляют собой TF-тензоры, но дополнены некоторыми дополнительными специфичными для Keras атрибутами, которые необходимы для построениямодель.Когда вы напрямую используете tf.reduce_mean, его вывод будет Тензор без этих дополнительных атрибутов.Однако, когда вы делаете ту же операцию внутри слоя Lambda, эти дополнительные атрибуты будут добавлены, и, следовательно, все будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...