python numpy tensorflow

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.