在自定义指标中更改 yTrue
Change yTrue in custom metrics
我正在尝试在 Keras 中实现 GAN,我想使用 One-sided label smoothing
技巧,即将真实图像的标签设为 0.9
而不是 1
。但是,现在内置指标 binary_crossentropy
没有做正确的事情,对于真实图像它总是 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:形状必须为 0 级,但对于 'cond/Switch'(op:'Switch')具有输入形状的 2 级:[?,?], [?,?].
您可以使用 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.]
我正在尝试在 Keras 中实现 GAN,我想使用 One-sided label smoothing
技巧,即将真实图像的标签设为 0.9
而不是 1
。但是,现在内置指标 binary_crossentropy
没有做正确的事情,对于真实图像它总是 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:形状必须为 0 级,但对于 'cond/Switch'(op:'Switch')具有输入形状的 2 级:[?,?], [?,?].
您可以使用 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.]