为 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 中的某些张量元素分配新值的主要内容,如果未能解决你的问题,请参考以下文章