张量流中ref边缘和非ref边缘之间的区别是什么?

时间:2017-03-04 14:26:35

标签: tensorflow

正如标题所说,我想知道" ref edge"之间的概念差异。和"非参考边缘"在TensorFlow。

我在TensorFlow中阅读图分区算法。 这里(line 826 of graph_partition.cc)是提到的评论 "非参考边缘":

$.ajax({
    url: url,
    data: data,
    method: 'GET',
    success: function(data) {
        console.log(data)
        $("#editProject").modal('show');
        $('#editProject').find('.modal-body').html(data);
    }
})

有人能更清楚地解释这种差异吗?非常感谢。

1 个答案:

答案 0 :(得分:4)

在TensorFlow中,大多数边缘是"非参考"边缘,这意味着沿着该边缘流动的值是常数。如果将TensorFlow图中的顶点(操作)视为函数,则可以将非ref边视为表示传统编程语言(如C或C ++)中passed by value的函数参数。例如,操作z = tf.matmul(x, y)的输入和输出都是非参考边缘。

A" ref edge"在TensorFlow中,允许沿着该边缘流动的值发生变异。继续函数类比,ref edge表示函数参数passed by reference(我们从中取名称" ref" edge)。 ref边缘的最常见用法是tf.Variable的当前内部实现:内部Variable kernel拥有可变缓冲区,并在ref边缘输出对该缓冲区的引用。诸如tf.assign(var, val)之类的操作期望它们的var参数沿着ref edge传递,因为它们需要改变var中的值。

图分区算法特别处理ref边缘,因为它们对应于可能随图形执行而变化的值。由于非ref边缘是常数值,因此TensorFlow可以假设在两个设备之间交叉的相同操作中的所有非ref边缘可以组合成单个边缘,这节省了网络/存储器带宽。由于ref边缘上的值可以改变(例如,如果在步骤中间更新变量),TensorFlow必须小心不要组合边缘,以便远程设备可以看到新值。通过类比C / C ++,TensorFlow图分区器将ref-edge视为表示volatile变量,以便进行优化。

最后,从上面的解释量可以看出,ref边缘非常复杂,并且一直在努力将它们从TensorFlow执行模型中删除。替换是"资源类型边缘",它允许非张量值沿边缘流动(统一变量,队列,读取器和TensorFlow中的其他复杂对象),以及采用可变资源的显式操作作为输入并读取其值(作为非ref输出边缘)。新的"资源变量的实施"可以看到here in Pythonhere in C++