【发布时间】:2018-12-31 08:03:00
【问题描述】:
我需要更改张量的某些元素的值。我知道哪些元素——它们已经在布尔张量中了。
我看不到如何在 keras 代码中执行此操作。但如果我使用 TensorFlow 代码,我会这样做:
Conditional assignment of tensor values in TensorFlow
在 python numpy 中,代码如下所示:
x = np.zeros_like(sometensor)
x[sometensor>0.5] = 1.0
在 Keras 代码中(我正在使用 TF 后端),这是我最好的尝试(不起作用):
encoder_outputs_bin = k.backend.zeros_like(encoder_outputs, name="encoder_outputs_bin")
point_five = k.backend.constant(0.5, shape=k.backend.shape(encoder_outputs), name="point_five")
positives = k.backend.greater_equal(encoder_outputs, point_five)
encoder_outputs_bin[positives].assign(tf.ones(1)) # TF syntax -- might not work in keras
【问题讨论】:
-
以下代码看起来不错,但 Keras 在训练时抛出错误:encoder_outputs = Dense(units=latent_vector_len, activation='sigmoid', kernel_initializer="lecun_normal")(x) encoder_outputs_bin = k.layers.Lambda (lambda z: k.backend.round(z))(encoder_outputs)
-
是否有使用分类交叉熵损失的简单解决方案,它以某种方式在内部执行二值化并计算该 2 值分类变量的损失?
-
Round() 是不可微的,当 Keras 尝试计算梯度时,它会导致 Keras 中的错误。然而 Relu 是不可微分的,但众所周知,它工作得很好,所以也许有类似的方法可以让 Round 让 Keras 开心。
-
Relu 是可微分的。只有当它在零区域时,它才会获得零梯度。 (但是在可微区中的其他变量的移动可能会从零中拯救其他变量)。 --- Relu 是可以的,只要你没有所有元素都变为 0 的不幸情况,那么你的模型就会卡住)。
标签: python tensorflow keras