在TensorFlow

时间:2016-08-19 18:40:02

标签: python numpy tensorflow

我想在numpy中复制以下tensorflow代码。例如,我想为之前值为0的所有张量索引分配1

a = np.array([1, 2, 3, 1])
a[a==1] = 0

# a should be [0, 2, 3, 0]

如果我在tensorflow中编写类似的代码,则会收到以下错误。

TypeError: 'Tensor' object does not support item assignment

方括号中的条件应该是a[a<1] = 0中的任意条件。

有没有办法在tensorflow中实现这种“条件分配”(缺少更好的名字)?

2 个答案:

答案 0 :(得分:23)

TensorFlow API中提供了

Several comparison operators

然而,在直接操作张量时,没有任何东西等同于简洁的NumPy语法。您必须使用单个comparisonwhereassign运算符来执行相同的操作。

NumPy示例的等效代码是:

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]

打印语句当然是可选的,它们只是用于演示代码是否正确执行。

答案 1 :(得分:3)

我也开始使用tensorflow 也许有人会更直观地填补我的方法

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())

主要的麻烦是很难实现&#34;自定义逻辑&#34;。如果你无法在线性数学术语中解释你的逻辑,你需要编写&#34; custom op&#34;张量流库(more details here