【2021最新】Keras自定义Loss函数+接受输入+KerasTensor天坑解决方法

文章目录

    • 自定义函数+输入方法
    • 第一个错误
    • 第二个错误

自定义函数+输入方法

环境配置:Tensorflow2.4,keras2.4.3

Keras自定义Loss函数,增加输入的方法,网上到处都有。
主要就是来源stackoverflow上一个仁兄的回答。
具体是这个链接:中国搬运翻译版本
具体实现方法自己去看,暂不赘述。

stackoverflow的方案有个很大问题。

自定义输入的input_tensor是KerasTensor,但是默认的loss函数输出的是Tensor。实操就会报错。

KerasTensor和Tensor是完全不同的格式。
KerasTensor是Keras中封装的特殊的张量,不具备Tensor很多性质。
可以这么理解,Tensor向下兼容KerasTensor,但是KerasTensor不能向上兼容Tensor。
两种向量相加等各种操作之后,得到的会是KerasTensor,而非Tensor
Tensor+KerasTensor = KerasTensor

第一个错误

原本的loss函数返回的Tensor最后是会转成numpy array完成一次迭代的。
Tensor可以转成numpy array,但是KerasTensor不行。
实操之后会报错:'Cannot convert a symbolic Keras input/output to a numpy array. '

解决方案:stackoverflow解决方案

1.增加disable_eager_execution()
from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()
2.处理compile
在model.compile(...)中增加‘experimental_run_tf_function=False’

按照这个解决方案解决之后,就会出现新的问题。
如果你把model定义和train写在一个文件里,大概率不会有第二个错误,那这篇文章就结束了。

第二个错误

解决了第一个问题,就会出现:
Tensor(“Placeholder:0”, shape=(), dtype=float64) must be from the same graph as Tensor(“total:0”, sh
简单来讲,就是tensorflow默认会把所有操作和输入输出画进一张图,默认是有一张默认图的。
但是如果我们使用了多个文件互相引用,不同文件自己默认创建一张图,可能就会不同的操作在不同的图上,导致这个错误。
比如说我的loss函数、模型定义、训练函数都在不同的文件互相引用,因此就会报这个错。
更详细的解释可以看别人的博客:tensorflow的Graph机制解释

解决方案:算是差不多的问题
我的解决方案:

#在所有相关的py文件要操作之前,都加上一句话
with tf.compat.v1.get_default_graph().as_default():
	#然后再加上之前的正常操作
	model.babababab(Input,Class_Num)
	model.compile(balabala...)
	model.fit(balabalab)

OK!到这里,我的问题就解决了。
Keras封装的太死板了,建议新手期过了就别用了,不好用。

你可能感兴趣的:(算法小白进阶之路,深度学习,机器学习)