Python 3.x 类型错误:';不可序列化的JSON';执行tf.keras.Model.save并在tf.keras.Model.compile的loss_weights中使用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 描述当前行为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
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()])
我的石膏手术也有同样的问题。