在DGL中,我们经常见到使用 g.local_scope() 的场合,如下面的代码
def foo(g):
with g.local_scope():
g.edata['h'] = torch.ones((g.num_edges(), 3))
g.edata['h2'] = torch.ones((g.num_edges(), 3))
return g.edata['h']
这里的g是DGL中的一个图。以前我们在学习dgl时并没有见到这个函数的调用,那今天我们来仔细try-try.
官方文档上是这这么说的:
Enter a local scope context for the graph.
By entering a local scope, any out-place mutation to the feature data will not reflect to the original graph, thus making it easier to use in a function scope (e.g. forward computation of a model).
翻译成人话就是:
使用local_scope() 范围时,任何对节点或边的修改在脱离这个局部范围后将不会影响图中的原始特征值 。真白点就是:在这个范围中,你可以引用、修改图中的特征值 ,但是只是临时的,出了这个范围,一切恢复原样。这样做的目的是方便计算。毕竟我们在图上作消息传递和聚合,有时仅是为了计算值 并不想改变原始图。
这个范围就是with g.local_scope() 的范围了,就是下面的一片缩进代码啦:
with g.local_scope():
g.edata['h'] = torch.ones((g.num_edges(), 3))
g.edata['h2'] = torch.ones((g.num_edges(), 3))
return g.edata['h']
看下面的图片
从图上可以清晰看到,在运行test后,原始图中边的特征并没有改变,依然为空。
注意:图中的变量值打错了,你可以随便测试下h或h2即可。没有h1啦。 结果是一样的。