美文网首页
两件小事

两件小事

作者: Seaton | 来源:发表于2022-04-14 23:38 被阅读0次

    今天白天继续研究GCN的源码,又出现了被一个小问题折磨半天的情况。

    GCN正则化部分源码

    torch_geometric中的GCNConv是一个继承torch.nn.Module的类。但是根据pytorch的风格,我们可以实例化一个my_-gcn = GCNConv(in_-channels, out_-channels),然后把这个实例化对象my_-gcn像函数一样调用,例如 x = my_-gcn(x, edge_-index)进行图卷积。问题来了,这个GCNConv类在初始化的时候有个参数cached,表示是否缓存这次计算好的规范化邻接矩阵,并且在下次计算的时候直接用缓存值而非重新计算。我一开始怎么也没想通,这个代码的逻辑。觉得每次计算好归规范化邻接矩阵之后虽然将值保留到self._-cached_-edge_-index里了,但是随着一次卷积运算结束,my_-gcn调用完成后,函数自动释放,self._-cached_-edge_-index中的值无法保留到下一个my_-gcn函数里呀。

    后来发现自己真的肤浅了,根本原因是没有搞懂这个类的实例化对象作为函数的方式。要是my_-gcn只是一个一般的函数,那么在这个函数中修改的局部变量自然无法在下次调用中使用。但是实际上my_-gcn是一个类的实例,并且这个类的实例在初始化后,便可以无数次调用。由于其没有释放内存,其私有变量即self.xxx在修改后是会保留到下次调用的时候的。这样实例化一个类作为模型中的一层,并且模型训练过程中不断修改层(也就是实例)中的参数的方式,是pytorch一个重要的特性。试想一下,如果模型中的一个层如果是一个普通的函数而非实例化的对象,那么函数在执行完后是无法对其参数进行更新的,除非有很多全局变脸(那样就乱了呀)。用类的__call__方法(pytorch的模型中是forward方法)将实例像函数一样调用,使得这个特殊的函数的运行在和模型一样的空间和时间下(这话是我自己的理解,不一定对),进而使得了函数中的变量(实例中的私有变量)可以保留上次模型对其做的改变。非常佩服,非常服气。说到底自己还是对于Python中万物皆对象的特性理解的不够深,对于类的__call__特征理解的不够深。这个方法真的有很多神奇的功能,比如装饰器等等。

    第二件事是自己身体状态的事,真的让我震惊了。为了让一家人增加抵抗力,今天带一家人出门跑步,跑的很慢,龟速那种,配速大概9分钟一公里。跑完一家都很舒服,多巴胺和内啡肽分泌,也能明显感觉到大家都很开心。但是跑完后的1个小时后,我又出现了那种类似低血糖的感觉,即大脑非常疲惫,几乎无法思考,学什么都没有力气,一副缺氧奄奄一息的状态。这样的状态大概持续了两三个小时,我就纳闷了,平时我跑个5公里10公里出现这样的情况容易理解,这次这么龟速地跑4公里,身体应该完全能过承受得了这个运动量才对,怎么可能在多巴胺内啡肽退去后又这么累呢?后来我问我爸妈有没有同样出现过我那种困顿疲乏的状态,他们说:跑完步精神地很,怎么可能累吗?我直接黑人问号脸!!原来真的是我自己的问题,而不是运动量过大。很可能是我激素分泌的原因,对于多巴胺、内啡肽或者肾上腺素这几个激素浓度降低有更敏感的反应。具体什么原因还有待进一步实验,准备买个可穿戴血糖仪,先测试一下运动前后血糖的变化吧。

    别人都是跑完步高效一整天,我是跑完步兴奋1小时,之后萎靡大半天。从效率角度上来讲,很亏呀!!!

    相关文章

      网友评论

          本文标题:两件小事

          本文链接:https://www.haomeiwen.com/subject/choxertx.html