python - Asignación condicional de valores de tensor en TensorFlow
numpy (2)
También estoy empezando a usar Tensorflow. Quizás alguien llene mi enfoque de manera más intuitiva.
import tensorflow as tf
conditionVal = 1
init_a = tf.constant([1, 2, 3, 1], dtype=tf.int32, name=''init_a'')
a = tf.Variable(init_a, dtype=tf.int32, name=''a'')
target = tf.fill(a.get_shape(), conditionVal, name=''target'')
init = tf.initialize_all_variables()
condition = tf.not_equal(a, target)
defaultValues = tf.zeros(a.get_shape(), dtype=a.dtype)
calculate = tf.select(condition, a, defaultValues)
with tf.Session() as session:
session.run(init)
session.run(calculate)
print(calculate.eval())
El problema principal es que es difícil implementar la "lógica personalizada". Si no puede explicar su lógica dentro de los términos matemáticos lineales, debe escribir la biblioteca "op personalizada" para el tensorflow ( más detalles aquí )
Quiero replicar el siguiente código
tensorflow
en
tensorflow
.
Por ejemplo, quiero asignar un
0
a todos los índices de tensor que anteriormente tenían un valor de
1
.
a = np.array([1, 2, 3, 1])
a[a==1] = 0
# a should be [0, 2, 3, 0]
Si escribo un código similar en
tensorflow
me sale el siguiente error.
TypeError: ''Tensor'' object does not support item assignment
La condición entre corchetes debe ser arbitraria como en
a[a<1] = 0
.
¿Hay alguna manera de realizar esta "asignación condicional" (por falta de un nombre mejor) en
tensorflow
?
Varios operadores de comparación están disponibles dentro de la API de TensorFlow.
Sin embargo, no hay nada equivalente a la sintaxis concisa de NumPy cuando se trata de manipular los tensores directamente.
Debe hacer uso de la
comparison
individual,
where
y
assign
operadores para realizar la misma acción.
El código equivalente a su ejemplo NumPy es este:
import tensorflow as tf
a = tf.Variable( [1,2,3,1] )
start_op = tf.global_variables_initializer()
comparison = tf.equal( a, tf.constant( 1 ) )
conditional_assignment_op = a.assign( tf.where (comparison, tf.zeros_like(a), a) )
with tf.Session() as session:
# Equivalent to: a = np.array( [1, 2, 3, 1] )
session.run( start_op )
print( a.eval() )
# Equivalent to: a[a==1] = 0
session.run( conditional_assignment_op )
print( a.eval() )
# Output is:
# [1 2 3 1]
# [0 2 3 0]
Las declaraciones de impresión son, por supuesto, opcionales, solo están ahí para demostrar que el código funciona correctamente.