【问题标题】:TypeError: 'Not JSON Serializable' while doing tf.keras.Model.save and using keras variable in loss_weights in tf.keras.Model.compileTypeError: 'Not JSON Serializable' while doing tf.keras.Model.save and using keras variable in loss_weights in tf.keras.Model.compile
【发布时间】:2019-10-04 18:49:26
【问题描述】:

系统信息 

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

TensorFlow 安装自(源代码或二进制文件):二进制文件

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

Python 版本:3.5.2  

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

GPU 型号和内存:Tesla K80,12 GB

描述当前行为  

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

我在model.compile 的loss_weights 中使用tf.keras.backend.variable()

优化器:tf.keras.optimizers.Adam  

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

重现问题的代码  

alpha = tf.keras.backend.variable(0.25)

使用 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()进行训练-

model.save()

其他信息/日志  

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>)

  

错误截图:

【问题讨论】:

  • 我在演员阵容中遇到了同样的问题。

标签: python-3.x tensorflow keras deep-learning tf.keras


【解决方案1】:

model.save 正在尝试保存不可 JSON 序列化的 tf.Variable

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

在这种情况下,一切都表明alpha 是您的问题。 model.compile 的文档还指出 loss_weights 应该是 Python 浮点数。

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

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

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 2022-10-13
    • 1970-01-01
    • 2018-11-30
    • 2022-12-01
    • 2022-12-27
    • 1970-01-01
    • 2017-04-07
    • 2021-09-19
    相关资源
    最近更新 更多