Python 3.x 类型错误:';不可序列化的JSON';执行tf.keras.Model.save并在tf.keras.Model.compile的loss_weights中使用keras变量时

Python 3.x 类型错误:';不可序列化的JSON';执行tf.keras.Model.save并在tf.keras.Model.compile的loss_weights中使用keras变量时,python-3.x,tensorflow,keras,deep-learning,tf.keras,Python 3.x,Tensorflow,Keras,Deep Learning,Tf.keras,系统信息 操作系统平台和发行版:Ubuntu 16.04 LTS TensorFlow安装自(源或二进制):二进制 TensorFlow版本(使用下面的命令):1.12.0 Python版本:3.5.2 CUDA/cuDNN版本:9.0版,V9.0.176 GPU型号和内存:特斯拉K80,12 GB 描述当前行为 alpha = tf.keras.backend.variable(0.25) Traceback (most recent call last):   File "main_la

系统信息

操作系统平台和发行版:Ubuntu 16.04 LTS

TensorFlow安装自(源或二进制):二进制

TensorFlow版本(使用下面的命令):1.12.0

Python版本:3.5.2

CUDA/cuDNN版本:9.0版,V9.0.176

GPU型号和内存:特斯拉K80,12 GB

描述当前行为

alpha = tf.keras.backend.variable(0.25)
Traceback (most recent call last):  

File "main_latest.py", line 45, in 

max_queue_size=10)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 2177, in fit_generator

initial_epoch=initial_epoch)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_generator.py", line 216, in fit_generator  

callbacks.on_epoch_end(epoch, epoch_logs)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 214, in on_epoch_end

callback.on_epoch_end(epoch, logs)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 601, in on_epoch_end

self.model.save(filepath, overwrite=True)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/network.py", line 1363, in save

save_model(self, filepath, overwrite, include_optimizer)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/saving.py", line 134, in save_model

default=serialization.get_json_type).encode('utf8')  

File "/usr/lib/python3.5/json/init.py", line 237, in dumps

**kw).encode(obj)  

File "/usr/lib/python3.5/json/encoder.py", line 198, in encode

chunks = self.iterencode(o, _one_shot=True)  

File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode

return _iterencode(o, 0)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/util/serialization.py", line 64, in get_json_type  

raise TypeError('Not JSON Serializable:', obj)  

TypeError: ('Not JSON Serializable:', <tf.Variable 'Variable:0' shape=() dtype=float32>)
当我尝试使用
model.save()
保存模型时,其中模型是
tf.keras.model
实例,它抛出
TypeError:('Not JSON Serializable:',)

我在
model.compile中的loss\u weights中使用了
tf.keras.backend.variable()

优化器:
tf.keras.optimizers.Adam

有趣的是,当我尝试仅使用
model.save_weights
保存模型权重时,如果模型是
tf.keras.model
实例,它工作正常,没有错误

重现问题的代码

alpha = tf.keras.backend.variable(0.25)
Traceback (most recent call last):  

File "main_latest.py", line 45, in 

max_queue_size=10)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 2177, in fit_generator

initial_epoch=initial_epoch)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_generator.py", line 216, in fit_generator  

callbacks.on_epoch_end(epoch, epoch_logs)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 214, in on_epoch_end

callback.on_epoch_end(epoch, logs)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 601, in on_epoch_end

self.model.save(filepath, overwrite=True)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/network.py", line 1363, in save

save_model(self, filepath, overwrite, include_optimizer)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/saving.py", line 134, in save_model

default=serialization.get_json_type).encode('utf8')  

File "/usr/lib/python3.5/json/init.py", line 237, in dumps

**kw).encode(obj)  

File "/usr/lib/python3.5/json/encoder.py", line 198, in encode

chunks = self.iterencode(o, _one_shot=True)  

File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode

return _iterencode(o, 0)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/util/serialization.py", line 64, in get_json_type  

raise TypeError('Not JSON Serializable:', obj)  

TypeError: ('Not JSON Serializable:', <tf.Variable 'Variable:0' shape=() dtype=float32>)
使用tf.keras对任何模型进行编码

model= get_model() 

model.compile(optimizer=optimizer,loss={"softmax1":generalized_dice_loss,"softmax2":generalized_dice_loss}, loss_weights=[1.0,alpha]) 
使用
model.fit()进行培训-

其他信息/日志

alpha = tf.keras.backend.variable(0.25)
Traceback (most recent call last):  

File "main_latest.py", line 45, in 

max_queue_size=10)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 2177, in fit_generator

initial_epoch=initial_epoch)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_generator.py", line 216, in fit_generator  

callbacks.on_epoch_end(epoch, epoch_logs)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 214, in on_epoch_end

callback.on_epoch_end(epoch, logs)    

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py", line 601, in on_epoch_end

self.model.save(filepath, overwrite=True)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/network.py", line 1363, in save

save_model(self, filepath, overwrite, include_optimizer)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/engine/saving.py", line 134, in save_model

default=serialization.get_json_type).encode('utf8')  

File "/usr/lib/python3.5/json/init.py", line 237, in dumps

**kw).encode(obj)  

File "/usr/lib/python3.5/json/encoder.py", line 198, in encode

chunks = self.iterencode(o, _one_shot=True)  

File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode

return _iterencode(o, 0)  

File "/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/util/serialization.py", line 64, in get_json_type  

raise TypeError('Not JSON Serializable:', obj)  

TypeError: ('Not JSON Serializable:', <tf.Variable 'Variable:0' shape=() dtype=float32>)
回溯(最近一次呼叫最后一次):
文件“main_latest.py”,第45行,在
最大队列大小=10)
文件“/home/tejal/.local/lib/python3.5/site packages/tensorflow/python/keras/engine/training.py”,第2177行,在fit_generator中
初始_历元=初始_历元)
文件“/home/tejal/.local/lib/python3.5/site packages/tensorflow/python/keras/engine/training_generator.py”,第216行,在fit_generator中
回调。在epoch\u结束时(epoch,epoch\u日志)
文件“/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py”,第214行,在末尾
回调。在\u epoch\u结束时(epoch,日志)
文件“/home/tejal/.local/lib/python3.5/site-packages/tensorflow/python/keras/callbacks.py”,第601行,在末尾
self.model.save(filepath,overwrite=True)
保存中的文件“/home/tejal/.local/lib/python3.5/site packages/tensorflow/python/keras/engine/network.py”,第1363行
保存模型(self、filepath、overwrite、include\u优化器)
文件“/home/tejal/.local/lib/python3.5/site packages/tensorflow/python/keras/engine/saving.py”,第134行,在save_模型中
默认值=序列化.get\u json\u type).encode('utf8')
文件“/usr/lib/python3.5/json/init.py”,第237行,转储
**千瓦)。编码(obj)
文件“/usr/lib/python3.5/json/encoder.py”,第198行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
iterencode中的文件“/usr/lib/python3.5/json/encoder.py”,第256行
返回_iterencode(o,0)
文件“/home/tejal/.local/lib/python3.5/site packages/tensorflow/python/util/serialization.py”,第64行,get_json_类型
raise TypeError('非JSON可序列化:',obj)
TypeError:('Not JSON Serializable:',)

错误截图:
model.save
正在尝试保存一个不可JSON序列化的
tf.Variable

model.fit
保存所有内容,而不仅仅是模型权重。当我的优化器有一个无法序列化的
tf.Tensor
时,我就看到了这个问题

在这种情况下,
alpha
是您的问题。另外,
model.compile
的文档说明
loss\u weights
应该是Python浮点值

因此,使用
alpha.numpy()
应该可以解决您的问题:

model.compile(optimizer=optimizer,loss={"softmax1":generalized_dice_loss,"softmax2":generalized_dice_loss}, loss_weights=[1.0,alpha.numpy()])

我的石膏手术也有同样的问题。