【问题标题】:Item Assignment Tensorflow 2.0 - TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment项目分配 Tensorflow 2.0 - TypeError:“tensorflow.python.framework.ops.EagerTensor”对象不支持项目分配
【发布时间】:2019-10-04 18:40:00
【问题描述】:

我正在使用 Tensorflow 2.0,并正在尝试更新我的张量中的切片。

使用像 PyTorch 中的普通项目分配,它不起作用。

import tensorflow as tf

tensor = tf.ones((10, 192, 85))
tensor[:, :, 0] = tf.math.sigmoid([:, :, 0])

>>> Output
TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment

我看到可以使用tf.tensor_scatter_nd_update,但感觉太冗长而效率不高,因为我必须单独导出要更新的索引。因此,我不确定这是否是在急切张量中进行项目分配的最佳方法(我需要下面的代码块来实现上面更简单的“PyTorch 2-liner style”):

import tensorflow as tf

def get_indices(tensor):
  indices = []
  for i in range(tensor.shape[0]):
    for j in range(tensor.shape[1]):
      indices.append([i, j, 0])
  return tf.convert_to_tensor(indices)

tensor = tf.ones((10, 192, 85))
indices = get_indices(tensor)
updates = tf.reshape(tf.math.sigmoid(tensor[:, :, 0]), (-1,))
tensor = tf.tensor_scatter_nd_update(tensor, indices, updates)

在 Tensorflow 2.0 中是否有更简单/更有效的方式来分配 EagerTensors 的项目?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    你可以这样做:

    tensor = tf.ones((10, 192, 85))
    tensor = tf.concat([tf.math.sigmoid(tensor[:,:,0:1]), tensor[:,:,1:]], axis=2)
    

    【讨论】:

    • 这适用于在最后一层执行 sigmoid,但如果我必须在张量内跨不同层执行 sigmoid 操作,那么它可能不太合适。
    • 或者,a,b,c, = tf.split(tensor, [a_dim, b_dim, c_dim], axis=2); tf.concat([a, tf.math.sigmoid(b), c], axis=2) 并指定您要处理的 b_dim
    猜你喜欢
    • 2016-07-31
    • 2014-02-18
    • 2017-03-26
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2016-10-08
    相关资源
    最近更新 更多