Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TensorFlow,什么时候可以使用类似Python的负索引?_Python_Numpy_Tensorflow - Fatal编程技术网

TensorFlow,什么时候可以使用类似Python的负索引?

TensorFlow,什么时候可以使用类似Python的负索引?,python,numpy,tensorflow,Python,Numpy,Tensorflow,我不熟悉TensorFlow(1.2版),但不熟悉Python或Numpy。我正在建立一个模型来预测蛋白质分子的形状。我需要在一些额外的代码中包装TensorFlow的标准tf.loss.cosine_距离函数,因为我需要停止一些NaN值在损耗计算中的传播 我确切地知道哪些细胞是NaN。我的机器学习系统对这些细胞的预测并不重要。我计划在对损耗函数求和之前,将tf.loss.cosine_距离输出的NaN部分转换为零 下面是一段工作代码,使用tf.scatter\u nd\u update进行元素

我不熟悉TensorFlow(1.2版),但不熟悉Python或Numpy。我正在建立一个模型来预测蛋白质分子的形状。我需要在一些额外的代码中包装TensorFlow的标准tf.loss.cosine_距离函数,因为我需要停止一些NaN值在损耗计算中的传播

我确切地知道哪些细胞是NaN。我的机器学习系统对这些细胞的预测并不重要。我计划在对损耗函数求和之前,将tf.loss.cosine_距离输出的NaN部分转换为零

下面是一段工作代码,使用tf.scatter\u nd\u update进行元素分配:

def custom_distance(predict, actual):
    with tf.name_scope("CustomDistance"):
        loss = tf.losses.cosine_distance(predict, actual, -1, 
               reduction=tf.losses.Reduction.NONE)
        loss = tf.Variable(loss) # individual elements can be modified
        indices = tf.constant([[0,0,0],[29,1,0],[29,2,0]])
        updates = tf.constant([0., 0., 0.])
        loss = tf.scatter_nd_update(loss, indices, updates)
        return loss
但是,这只对我所拥有的一种蛋白质有效,它有30个氨基酸长。如果我有不同长度的蛋白质呢?我会有很多。 在Numpy中,我只使用Python的负索引,用-1代替索引行中的两个29。Tensorflow不会接受这一点。如果我进行替换,我会得到一个很长的回溯,但我认为最重要的部分是:

File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Invalid indices: [0,1] = [-1, 1, 0] is not in [0, 30)
(我还可以修改预测张量,以便在计算损失之前,相关单元与实际张量完全匹配,但在每种情况下,挑战都是一样的:在TensorFlow对象中指定单个元素的值。)

我应该忘记TensorFlow中的负索引吗?我正在仔细阅读TensorFlow文档,以了解解决此问题的正确方法。我假设我可以检索输入张量沿主轴的长度,并使用它。但是在看到TensorFlow和Numpy之间的强烈相似性之后,我不得不怀疑这是否很笨拙


感谢您的建议。

它可以与tensorflow绑定到python切片操作符一起使用。例如,
loss[-1]
loss
的有效切片

在您的情况下,如果只有三个切片,则可以分别指定它们:

update_op0 = indices[0,0,0].assign(updates[0])
update_op1 = indices[-1,1,0].assign(updates[1])
update_op2 = indices[-1,2,0].assign(updates[2])
如果切片数大于此数,或者切片数可变,则前面的方法不实用。您可以编写一个类似这样的小辅助函数,将“正索引或负索引”转换为“仅正索引”:


看起来分散更新还不支持负索引。确实有人在推动TF匹配numpy语义,但一些ops还没有抓住上升趋势,我将尝试您的一种或两种方法。第一个我不太明白。我在看tf.assign(),但它似乎取代了整个张量,而不仅仅是单个元素。我不确定tf.constant的赋值方法有何不同。您的第二个示例较长,但其目的很明确。我在您的第二个示例中发现了一个错误,否则它会起作用。在“idx=tf.where(idx<0,s-idx,idx)”的行上,减号应该是加号。谢谢第二步:在第一个例子中,您的意思是在键入“索引”的三行中键入“损失”吗?如果是这样的话,这个例子现在对我来说也是有意义的。请让我知道,谢谢。
def to_pos_idx(idx, x):
  # todo: shape & bound checking
  idx = tf.convert_to_tensor(idx)
  s = tf.shape(x)[:tf.size(idx)]
  idx = tf.where(idx < 0, s + idx, idx)
  return idx
indices = tf.constant([[0,0,0],[-1,1,0],[-1,2,0]])
indices = tf.map_fn(lambda i: to_pos_idx(i, loss), indices) # transform indices here
updates = tf.constant([0., 0., 0.])
loss = tf.scatter_nd_update(loss, indices, updates)