为 Keras 中的某些张量元素分配新值

Posted

技术标签:

【中文标题】为 Keras 中的某些张量元素分配新值【英文标题】:Assign new values to certain tensor elements in Keras 【发布时间】: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

【问题讨论】:

相关:***.com/questions/48795910/binarize-tensor-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 的不幸情况,那么你的模型就会卡住)。 【参考方案1】:

这个答案并不是真正的“分配”,它得到了另一个张量,但我相信它会做......

此外,您打算做的事情将完全破坏这些元素的反向传播。

知道这一点:

positives = k.backend.greater_equal(encoder_outputs, 0.5)
positives = k.backend.cast(positives, k.backend.floatx())

encoder_outputs = positives + ((1-positives)*encoder_outputs)

【讨论】:

需要反向传播。 那么不要让它们保持不变。 如果我有时间我会尝试一下。感谢您的参与。【参考方案2】:

激活中的 lambda 函数对我有用。这比简单地使用内置激活函数要复杂一步。

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)

此代码将 Dense 的输出从 Reals 更改为 0,1(即二进制)。

Keras 发出警告,但代码仍然有效。

# Look it works!

y = encoder_model.predict(x=x_in)
print(y)

>>>[[1. 0. 0. 1. 0. 1. 0. 0.]]

【讨论】:

Round 是不会反向传播的函数之一。 :( 拟合时,您将看到“一个操作没有渐变”或“不支持无值”。

以上是关于为 Keras 中的某些张量元素分配新值的主要内容,如果未能解决你的问题,请参考以下文章

张量相对于元素邻居的条件值

keras中的加权mse自定义损失函数

如何有效地分配给 TensorFlow 中的张量切片

如何有条件地缩放 Keras Lambda 层中的值?

如何在 Keras 中裁剪一个张量,每个子张量都有不同的裁剪值?

分配器(GPU_0_bfc)在使用纯张量流时尝试分配内存不足,而在 keras 上更复杂的模型上没有错误