在模型中使用reduce_mean时无法保存Keras模型吗?

时间:2019-04-04 07:51:03

标签: python tensorflow keras

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/tensorflow/python/util/serialization.py“,第69行,在   get_json_type       引发TypeError('Not JSON Serializable:',obj)TypeError:('Not JSON Serializable:',   b“ \ n \ x04Mean \ x12 \ x04Mean \ x1a'embedding_1 / embedding_lookup / Identity_2 \ x1a \ x16Mean / reduction_indices * \ x07 \ n \ x01T \ x12 \ x020 \ x01 * \ n \ n \ x04Tidx \ x12 \ x020 \ x03 * \ x0f \ n \ tkeep_dims \ x12 \ x02(\ x01“)

2 个答案:

答案 0 :(得分:0)

您需要使用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层中执行相同的操作时,将添加这些附加属性,因此一切将正常工作。

答案 1 :(得分:0)

以keras.layers模块内部的大写字母开头的对象(例如Dense,LSTM ....)是遵循Layer(...)(input)约定的图层,而小写字母直接应用于张量。 custom loss functions或自定义图层(例如Lambda或this example)的有用的内部