【问题标题】:Binarize tensor in Keras在 Keras 中二值化张量
【发布时间】:2018-07-25 12:59:09
【问题描述】:

我需要为 Keras 创建一个仅适用于二进制值的损失函数。想要将所有大于 0.5 的值转换为 1.0,所以我这样做了:

def MyLoss(y_true, y_pred:
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(K.cast(K.greater(y_pred, 0.5), 'float32'))
    #y_pred_f = K.flatten(K.cast(y_pred > 0.5), 'float32')
    #y_pred_f = K.flatten(y_pred > 0.5)
    return K.sum(y_true_f * y_pred_f)

代码编译,但后来它产生以下错误:

ValueError:不支持任何值。

我也尝试了注释行,同样的错误。如果我不尝试仅使用 y_pred_f = K.flatten(y_pred) 修改值,它就会运行。

我做错了什么?

如何对张量进行二值化?

【问题讨论】:

标签: python machine-learning neural-network keras keras-2


【解决方案1】:

对我的逻辑密集层进行二值化的解决方案是在激活中创建一个自定义 lambda 函数。 (我正在研究语义哈希自动编码器(Hinton))。 Keras 发出警告,但事实证明它仍然有效。由于无法在反向传播阶段计算梯度导数时区分轮函数,早期的尝试引发了错误。 (这是旧的 ValueError: None values not supported。)这里的关键是在激活中而不是作为单独的层这样做。

encoder_outputs = Dense(units=latent_vector_len, activation=k.layers.Lambda(lambda z: k.backend.round(k.layers.activations.sigmoid(x=z))), kernel_initializer="lecun_normal")(x)

通常在 0 到 1 范围内的 Real 输出被转换为 0 和 1,如图所示。

# Look it works!

y = encoder_model.predict(x=x_in)
print(y)
>>> [[1. 0. 0. 1. 0. 1. 0. 0.]]

换句话说,这种方式行不通:

decoder_outputs_bin = k.layers.Lambda(lambda z: k.backend.round(z))(decoder_outputs) # ERR at training time ValueError: None values not supported.

【讨论】:

  • 谢谢你的回答,我去测试一下。但由于我已将所有内容都移至 PyTorch,因此设计图层更加实用。
  • 您可以编写一个二值化层,其操作如下: (x-0.5)/abs(x-0.5) 这将是一个可微层,因为所有组件都是可微的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多