python-3.x - TypeError : 'Not JSON Serializable' while doing tf. keras.Model.save 并在 tf.keras.Model.compile 的 loss_weights 中使用 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 型号和内存:Tesla K80,12 GB

描述当前行为

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

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

优化器: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>)

错误截图:
enter image description here

最佳答案

model.save正在尝试保存 tf.Variable这不是 JSON 可序列化的。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()])

关于python-3.x - TypeError : 'Not JSON Serializable' while doing tf. keras.Model.save 并在 tf.keras.Model.compile 的 loss_weights 中使用 keras 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56186384/

相关文章:

python - 如何将 iter() 应用于分页 api?

python - Pandas DataFrame 到 HTML : Formatting the values to display centered

python-3.x - 如何加载经过训练的自动编码器(Keras)、获取编码器部分并将其卡住?

python - 更改 Jupyter 笔记本内核所基于的虚拟环境后更新它

tensorflow - 我可以使用 conv2d 和张量操作等现有操作在 python 中的 tensorflow 中编写自定义层吗?

python - 在预定义的图形对象上使用 tf.train.Saver 对象

python - 获取属性错误: __exit__ when working with Tensorflow and MNIST data

keras - 从 flow_from_directory 提供数据时如何调整超参数

neural-network - 神经网络的显着图(使用 Keras)

python - Pandas - 根据 A 列中的值访问 B 列中的值