生成随机权重列表后:
sizes = [784,30,10]
weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1],sizes[1:])]
利用Numpy的Kronecker产品创建foo
(带形状(900, 23520)
):
然后,将foo
与data
的切片相乘,即
bar = np.dot(foo,data[0])
其中data[0].shape
是(23520,)
,而{
foo
相当浪费。形状为(30,784)
的weights[0]
如何以更灵活的方式用于与data[0]
相乘?在
更一般地说,data[0]
是形状为^{
下面是我尝试过的循环:
for i in range(len(data)):
foo = np.kron(np.identity(30),weights[0])
bar = np.dot(foo,data[i])
你实际上是在做矩阵矩阵乘法,其中第一个因子是
weights[0]
,第二个因子是data[i]
,分成30个相等的片,组成列。在印刷品:
^{pr2}$诀窍是将} 来对抗{},从而绕过{}创建,就像这样-
data
重塑为3D
张量,然后使用^{在引擎盖下,
^{pr2}$tensordot
使用转置轴、重塑形状,然后np.dot
。因此,使用所有这些手工劳动来避免对tensordot
的函数调用,我们将有一个,如下-Related post to understand ^{} 。在
样本运行
让我们用一个玩具例子来解释那些可能不了解问题的人会发生什么:
所以,问题是去掉}的所有行执行此操作。在
foo
的创建步骤,进入output_first_row
,并对{建议的解决方案是:
让我们验证一下结果:
所有建议方法的运行时测试-
^{} 和下面的注释可能有助于理解
tensordot
如何更好地与tensors
一起工作。在相关问题 更多 >
编程相关推荐