Keras 中的自定义条件损失函数

数据挖掘 喀拉斯 损失函数 半监督学习
2021-09-18 07:22:07

我正在寻找一种方法来创建一个看起来像这样的条件损失函数:有一个标签向量,比如 l(l 与输入 x 的长度相同),然后对于给定的输入(y_true,y_pred,l ) 损失应该是:

def conditional_loss_function(y_true, y_pred, l):
    loss = if l is 0: loss_funtion1
           if l is 1: loss_funtion2
    return loss

它就像一种半监督损失函数。

1个回答

你应该可以用柯里化来解决这个问题。创建一个将标签作为输入的函数,并返回一个将y_trueandy_pred作为输入的函数。请注意,标签必须是常数或张量才能起作用。

def conditional_loss_function(l):
    def loss(y_true, y_pred):
        if l == 0: 
            return loss_funtion1(y_true, y_pred)
        else: 
            return loss_funtion2(y_true, y_pred)
    return loss

model.compile(loss=conditional_loss_function(l), optimizer=...)

根据标签具有不同损失函数的小型工作示例:

# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
data = dataset[:,0:8]
label = dataset[:,8]

X = Input(shape=(8,))
Y = Input(shape=(1,))
x = Dense(12, input_dim=8, activation='relu')(X)
x = Dense(8, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x)

def custom_loss(l):
    def loss(y_true, y_pred):
        if l == 0:
            return binary_crossentropy(y_true, y_pred)
        else: 
            return mean_squared_error(y_true, y_pred)
    return loss    

# Compile model
model = Model(inputs=[X, Y], outputs=predictions)
model.compile(loss=custom_loss(Y), optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(x=[data, label], y=label, epochs=150)

# evaluate the model
scores = model.evaluate([data, label], label)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))