我想构建一个本地连接的权重矩阵,该矩阵表示纯python / numpy中的本地连接的神经网络,而没有Torch或TensorFlow之类的深度学习框架。
权重矩阵是具有尺寸(数字输入,数字输出)的非正方形二维矩阵。 (在我的情况下为自动编码器;输入>隐藏)
因此,我想构建该函数,采用矩阵尺寸和接收场的大小(本地连接数),并给出关联的权重矩阵。我已经创建了这样的函数,但是对于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))
期待您的回复!
答案 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, :]
我希望这就是您想要的。
编辑: 我认为实施方式有误。我重新实现该功能,我们逐个进行。
我计算感受野的半径(填充)。
确定W的大小。
我通过删除填充区域来计算步长,这样我就始终呆在里面。
我计算权重。
删除填充。