在图形执行中不允许使用tf.Tensor作为Python bool的add_loss AND loss函数

时间:2020-06-11 15:33:24

标签: python-3.x keras neural-network tensorflow2.0 loss-function

我正在尝试对具有两个损失函数的神经网络进行编码:标准mse和自定义损失。第二个输入输入网络中间层的输出,并包含一个if语句。我通过 add_loss 添加到模型中的第二个损失函数如下:

from tensorflow.keras import backend as K
import tensorflow as tf

def intermediate_out(middle_layer):
        x_coord = K.reshape(middle_layer[:,1:72], shape=(-1,71))
        # Some operations on x_coord
        # print(x_coord)
        if K.any(K.less(x_coord[:,1:]-x_coord[:,:-1],0)):
            return K.constant(100)
        else:
            return K.constant(0)

由于此代码在标题中产生了错误,因此我尝试用以下几行替换return:

        return K.switch(K.any(K.less(x_coord[:,1:]-x_coord[:,:-1],0)),
                        K.constant(100),
                        K.constant(0))

        return tf.cond(K.any(K.less(x_coord[:,1:]-x_coord[:,:-1],0)),
                        lambda: 100, lambda: 0)

但是我得到的错误是常见的:OperatorNotAllowedInGraphError: using a tf.Tensor as a Python bool is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

但是,如果我尝试将装饰器@tf.function添加到损失函数intermediate_out,则会收到错误:_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'batpj_layer/Identity:0' shape=(None, 143) dtype=float32>]

这就是我打电话给add_loss的方式:

model.add_loss(intermediate_out(out)) # out is the intermediate layer
model.compile(optimizer=method, loss='mse') # method is 'Nadam'

您有什么建议/想法吗?先感谢您。 我正在使用Tensorflow 2.1.0。

0 个答案:

没有答案