Keras中自定义损失函数的问题

时间:2020-03-17 19:36:45

标签: python tensorflow keras

我需要自定义Keras损失函数。 以下代码适用于损失函数 loss2 ,但不适用于损失函数 loss1 。我收到

错误

OperatorNotAllowedInGraphError:在图形执行中不允许将tf.Tensor用作Python bool。使用急切执行或使用@ tf.function装饰此功能。

我已经用@ tf.function装饰了该函数,但是它不起作用。

import numpy as np
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense, LeakyReLU

def individual_model(keys, labels):
    model = Sequential()
    size = 32
    model.add(Dense(32, input_dim=1))
    model.add(LeakyReLU())
    for i in range(2):
        model.add(Dense(size))
        model.add(LeakyReLU())
    model.add(Dense(1))
    model.compile(optimizer='adam', loss=my_loss, metrics=[
                my_loss])
    model.fit(keys, labels, epochs=256, batch_size=32, verbose=1)
    return model


def loss1(v):
    if v<0:
        return -100 * v
    else: 
        return v

def loss2(v):
    return v*v

def my_loss(y_true, y_pred):
    return K.map_fn(loss1,y_true-y_pred) #with loss2 this works


x=np.random.exponential(100,1000)
x.sort()
labels=np.arange(0,1000)
m=individual_model(x,labels)

2 个答案:

答案 0 :(得分:1)

tf.where 可以在损失v1定义中使用,例如link

import tensorflow as tf 
import numpy as np 
arr = np.array([1., -1])
sess = tf.Session()
print(sess.run(tf.where(arr<0., arr*100., arr*10.))

输出:

array([  10., -100.])

答案 1 :(得分:0)

基于@Engineero建议。

以下代码有效

def cond_switch(x):
    return K.relu(-x)*10 + K.relu(x)

def my_loss(y_true, y_pred):
    return cond_switch(y_true-y_pred)

我仍在试图找出原因。