我正在尝试对具有两个损失函数的神经网络进行编码:标准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。