2020-07-31 blog

研究了一下卷积的底层算法,发现其实并没有那么简单

可能通过卷积的底层来实现我的想法的话会比较麻烦一点吧

那可能就要去看看图网络那边的运算了


看了一下图计算相关的资料,我发现我之前设想的可增cell的模型,似乎可以得到图实现

我想了想,其实神经元就是图节点,神经连接就是图连接。

所以图神经网络才是未来主流?


接上昨天设想的模型结构部分。

虽然看起来运算过程很接近Convolution,但是其实差别有点大。因为这其实就是一个不共享权值的Convolution。

而Convolution其实也可以用图来表示!本质上它就是由KxK个节点指向一个节点的图。

那么,昨天我设想的运算怎么用图来表示呢?

首先是Input和Output节点。按照模式二来看的话,那就是一个Input节点KxK个Output节点有连接。对于一个Input节点,它的图连接表示可以用一个矩阵来表示。比如一个3x3的映射[..., f11, f12, ..., f33, ...]。其中,从f11到f33一共九个节点。如果是第二类映射的话,那么f22需要去掉,变成0,后面再另外加。虽然图表示的话就是f22=1,但是因为训练的时候权值可变,而我不希望这个1发生变化,所以采取了分开运算的方式,但是表示还是可以以此表示的。

那么,也就是说这个图可以用[[I11], [i12], ..., [ihw]]来表示。矩阵的高是Input的节点数,w是Output的节点数。那么,也就是说只需要用Input与图表示矩阵进行矩阵乘法就能得到Output。(当然,形状什么的还是要处理一下的。)

但是,对于多channel的图表示可能还需要考虑考虑,虽然不是不能实现,但是参数太大了。


笔记:

Keras.Layer.add_weight是生成一个指定形状的权重,指向的函数是tensorflow/python/training/tracking/base/Trackable._add_variable_with_custom_getter

重点:在Layer类里的__init__或者build里面调用Keras.backend的variable函数,并赋值到Layer的属性,可以将这个Tensor加入到Trainable weight。

重点:要添加non_trainable参数,调用Keras.backend的constant函数,并调用self._non_trainable_weights.append(variable)将该参数加入进去


肝了几个小时(凌晨),把核心部分给肝出来了。

主要是权重部分比较难搞。一开始是用variable来创建,后面发现创建的权重是全1的,可能不太合适,所以把这个做成了mask,乘到用add_weight生成的权重,这样就得到了一个随机生成并且是符合连接情况的权重。

不过仔细看了一下Initializer的实现,好像可以不用那么费劲。

直接继承一个init并且在返回的地方写个mask就好了。

到白天的时候攻关一下支持Channel。


支持channel很快就写好了。

支持了channel之后,accuracy一下子就上去了。但是表现也还是不够理想,达不到Maxout NIN的成功率。

而且参数量太过大了。

可能还得再改改思路。


想到了一个东西,Graph In Graph

说不定会很有趣。


突然想到了参数量的原因,一是因为这样的矩阵里面充满了大量的0,其实根本用不上。

然后就是,一个cell它的多个突触其实传递的值是一样的,而现在的创建方法是假定了不一样。


今天累死了,走了一万多步。

不过也可能跟太久没运动有关。以前在主校区从南六楼走回去韵苑也是走差不多的路,甚至更多,但是没觉得那么累。

去了一趟图书馆,感觉还好吧。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注