Tensorflow TypeError:(';不可JSON序列化:';,<;tf.Tensor:shape=(),dtype=float32,numpy=123.0>;)

Tensorflow TypeError:(';不可JSON序列化:';,<;tf.Tensor:shape=(),dtype=float32,numpy=123.0>;),tensorflow,keras,tensorflow2.0,Tensorflow,Keras,Tensorflow2.0,我有一个可以通过ModelConfig配置的生产模型,我自己编写了一个类配置(dict)。在该ModelConfig中,我正在设置hidden\u size=123。以下是我的生产型号代码的简化: 类配置(dict): # .. def作为命令(自身)->命令: 返回self.\u serialize() 类ModelConfig(Config): 隐藏大小:int=123 现在,我有一个自定义的keras模型,它的实现方式如下: 类MyModel(keras.Model): def uuu

我有一个可以通过
ModelConfig
配置的生产模型,我自己编写了一个
类配置(dict)
。在该
ModelConfig
中,我正在设置
hidden\u size=123
。以下是我的生产型号代码的简化:

类配置(dict):
# ..
def作为命令(自身)->命令:
返回self.\u serialize()
类ModelConfig(Config):
隐藏大小:int=123
现在,我有一个自定义的keras模型,它的实现方式如下:

类MyModel(keras.Model):
def uuu init uuuu(self,config:ModelConfig):
self.config=config
self.dense=layers.dense(配置隐藏大小)
# ...
def get_config():
返回self.config.as_dict()
除了调用
MyModel#save
,一切正常:

model.save(model\u path,save\u format='tf')
我收到一个
类型错误
说:

TypeError:('Not JSON Serializable:',)
我知道正是
ModelConfig#hidden_size
这个属性在这里变成了张量/张量

奇怪的是,在我的一个测试脚本中,一切都按预期进行。我创建它是为了查看
Config
是否会导致
save()
出现问题,但情况似乎并非如此:

因此,此处的正按预期工作:

将numpy导入为np
导入tensorflow作为tf
从tensorflow进口keras
从tensorflow.keras导入图层
从配置导入配置
类ModelConfig(Config):
隐藏大小:int=123
类别MyLayer(layers.Layer):
定义初始化(self,config,other=None,**kwargs):
超级()
self.config=config
self.other=如果other不是None-other-None,则为other
self.densed=layers.densed(config.hidden_size+1)
def呼叫(自我,输入,**kwargs):
如果self.other不是None-other输入,则x=self.other(输入,**kwargs)
返回自密实(x,**kwargs)
类别MyModel(keras.Model):
定义初始化(self,配置:ModelConfig,*args,**kwargs):
super()
self.config=config
self.other=MyLayer(配置,other=MyLayer(配置))
self.dense=layers.dense(配置隐藏大小)
def呼叫(自我,输入,**kwargs):
x=自密实(输入,**kwargs)
返回自我。其他(x,**kwargs)
def get_配置(自身):
将self.config.to_dict()返回
@功能(
输入_签名=[tf.TensorSpec(shape=(None,100))]
)
def推断(自身,输入):
返回自调用(输入)
def main():
fp='/tmp/mymodel'
config=ModelConfig()
model=MyModel(配置)
模型(np.random.rand(1100))
model.save(fp,save_format='tf')
model=tf.saved\u model.load(fp)
打印(model.infere(np.random.rand(1100)))
打印('全部完成')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
这意味着问题不在于
Config
对象,而是由于某种原因,在我的生产模型中,它的一个属性导致调用
save()
失败

这可能是个大问题,但有人知道在哪里可以找到这个问题吗

在一种情况下,属性变为无法序列化的张量/张量(这是有意义的),在测试脚本情况下,它保持为
int
,按预期工作


我还尝试了
tf.saved\u model.save
,得到了相同的结果。

我猜是tf.Tensor不可JSON序列化。 您可以尝试将tf.Tensor的对象转换为numpy数组,然后您应该能够保存配置以供以后重新加载