如何在纯Numpy中实现本地连接的层

时间:2019-01-14 19:42:35

标签: python numpy neural-network deep-learning

我想构建一个本地连接的权重矩阵,该矩阵表示纯python / numpy中的本地连接的神经网络,而没有Torch或TensorFlow之类的深度学习框架。

enter image description here

权重矩阵是具有尺寸(数字输入,数字输出)的非正方形二维矩阵。 (在我的情况下为自动编码器;输入>隐藏)

因此,我想构建该函数,采用矩阵尺寸和接收场的大小(本地连接数),并给出关联的权重矩阵。我已经创建了这样的函数,但是对于8的输入大小和4的输出大小(RF = 4),我的函数输出是:

[[ 0.91822845 0.          0.          0.        ]
[-0.24264655 -0.54754138  0.          0.        ]
[ 0.55617366  0.12832513 -0.28733965  0.        ]
[ 0.27993286 -0.33150324  0.06994107  0.61184121]
[ 0.          0.04286912 -0.20974503 -0.37633903]
[ 0.          0.         -0.10386762  0.33553009]
[ 0.          0.          0.          0.09562682]
[ 0.          0.          0.          0.        ]]

但我想要:

[[ 0.91822845 0.          0.          0.        ]
[-0.24264655 -0.54754138  0.          0.        ]
[ 0.55617366  0.12832513  0.          0.        ]
[ 0          -0.33150324  0.06994107  0         ]
[ 0.          0.04286912 -0.20974503  0.        ]
[ 0.          0.         -0.10386762  0.33553009]
[ 0.          0.          0.11581854  0.09562682]
[ 0.          0.          0.          0.03448418]]

这是我的python代码:

import numpy as np

def local_weight(input_size, output_size, RF):
    input_range = 1.0 / input_size ** (1/2)
    w = np.zeros((input_size, output_size))
    for i in range(0, RF):
        for j in range(0, output_size):
            w[j+i, j] = np.random.normal(loc=0, scale=input_range, size=1)
    return w

print(local_weight(8, 4, 4))

期待您的回复!

1 个答案:

答案 0 :(得分:0)

诀窍是在一块小垫子上工作,以使其更舒适(或控制极限)。

然后,您必须定义相对于输入要执行的步骤(不超过输入/输出)。完成此操作后,您只需要填充空隙,然后取下垫子即可。

import math
import numpy as np
def local_weight(input_size, output_size, RF):
    input_range = 1.0 / input_size ** (1/2)
    padding = ((RF - 1) // 2)
    w = np.zeros(shape=(input_size + 2*padding, output_size))
    step = float(w.shape[0] - RF) / (output_size - 1)
    for i in range(output_size):
        j = int(math.ceil(i * step))
        j_next = j + RF
        w[j:j_next, i] = np.random.normal(loc=0, scale=input_range, size=(j_next - j))
    return w[padding:-padding, :]

我希望这就是您想要的。

编辑: 我认为实施方式有误。我重新实现该功能,我们逐个进行。

  1. 我计算感受野的半径(填充)。

  2. 确定W的大小。

  3. 我通过删除填充区域来计算步长,这样我就始终呆在里面。

  4. 我计算权重。

  5. 删除填充。