更改自定义指标中的yTrue

时间:2019-07-15 05:00:19

标签: python tensorflow keras generative-adversarial-network

我正在尝试在Keras中实现GAN,并且我想使用One-sided label smoothing技巧,即将True image的标签改为0.9而不是1。但是,现在内置指标binary_crossentropy不能正确执行操作,对于True image,它始终为0。

然后,我尝试在Keras中实现自己的指标。我想将所有0.9标签都转换为1,但是我对Keras并不陌生,我也不知道该怎么做。这是我的打算:

# Just a pseudo code
def custom_metrics(y_true, y_pred):
    if K.equal(y_true, [[0.9]]):
        y_true = y_true+0.1
    return metrics.binary_accuracy(y_true, y_pred)

我应该如何比较和更改y_true标签?预先感谢!


编辑: 以下代码的输出是:

def custom_metrics(y_true, y_pred):
    print(K.shape(y_true))
    print(K.shape(y_pred))
    y_true = K.switch(K.equal(y_true, 0.9), K.ones_like(y_true), K.zeros_like(y_true))
    return metrics.binary_accuracy(y_true, y_pred)

Tensor("Shape:0", shape=(2,), dtype=int32) Tensor("Shape_1:0", shape=(2,), dtype=int32)

ValueError:对于“ cond / Switch”(操作数:“ Switch”),形状必须为0,但输入形状为[?,?],[?,?]则为2。

1 个答案:

答案 0 :(得分:0)

您可以使用tf.where

y_true = tf.where(K.equal(y_true, 0.9), tf.ones_like(y_true), tf.zeros_like(y_true))

或者,您可以使用keras.backend.switch函数。

keras.backend.switch(condition, then_expression, else_expression)

您的自定义指标功能如下所示:

def custom_metrics(y_true, y_pred):
    y_true = K.switch(K.equal(y_true, 0.9),K.ones_like(y_true), K.zeros_like(y_true))
    return metrics.binary_accuracy(y_true, y_pred)

测试代码:

def test_function(y_true):
    print(K.eval(y_true))
    y_true = K.switch(K.equal(y_true, 0.9),K.ones_like(y_true), K.zeros_like(y_true))
    print(K.eval(y_true))

y_true = K.variable(np.array([0, 0, 0, 0, 0, 0.9, 0.9, 0.9, 0.9, 0.9]))
test_function(y_true)  

输出:

[0.  0.  0.  0.  0.  0.9 0.9 0.9 0.9 0.9]
[0. 0. 0. 0. 0. 1. 1. 1. 1. 1.]