在Keras代码中:为某些张量元素分配新值

时间:2018-07-23 19:34:53

标签: python tensorflow keras

我需要更改张量的某些元素的值。我知道什么元素-它们已经在布尔张量中。

我看不到如何在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

2 个答案:

答案 0 :(得分:0)

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

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

知道这一点:

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

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

答案 1 :(得分:0)

激活中的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.]]