繁体   English   中英

matmul:输入操作数 1 的核心维度 0 不匹配,带有 gufunc 签名

[英]matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature

topology = [p, 4, 8, 16, 8, 4, 1]

neural_net = create_nn(topology, sigm)

l2_cost = (lambda Yp, Yr: np.mean((Yp - Yr) ** 2),
           lambda Yp, Yr: (Yp- Yr))



def train(neural_net, X, Y, l2_cost, lr=0.5):

  out = [(None, X)]
  
  #Foward pass
  for l, layer in enumerate(neural_net):
    

    z = out[-1][1] @ neural_net[l].W + neural_net[l].b
    a = neural_net[l].act_f[0](z)

    out.append((z, a))
  print(out[-1[1]])

train(neural_net, X, Y, l2_cost, 0.5)

这告诉我下一个错误

matmul: Input operand 1 has a mismatch in its core dimension 0, 
with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 4 is different from 2)

欢迎来到 StackOverFlow!

不知道代码的 rest,特别是不知道矩阵的shape ,我最好的猜测是您试图将尺寸与预期不匹配的矩阵相乘。

让我引用 PennState 这篇文章中的一段话:

要执行矩阵乘法,第一个矩阵的列数必须与第二个矩阵的行数相同。

每当您使用@运算符时,您就是在告诉 Python 您正在执行矩阵乘法!

我们以以下两个矩阵为例:

import numpy as np

X = np.array([[1, 2], [3, 4], [5, 6]])
Y = np.array([[7, 8, 9], [9, 10, 11]])

X 的形状为 (3, 2),而 Y 的形状为 (2, 3)。 这意味着它们确实可以相乘,并且生成的矩阵将具有 (3, 3) 形状。

print(X @ Y)

######### Output #########
# [[ 25  28  31]
# [ 57  64  71]
# [ 89 100 111]]
##########################

现在假设您尝试转置矩阵 Y,即反转其行和列,使其成为 (3, 2) 矩阵。 你期望会发生什么?

是的,您猜对了,Python 会告诉您您做错了什么,因为线性代数中不允许此操作。

# Matrix Multiplication between X and Y transposed
print(X @ Y.T)

######### Output #########
# ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0
# with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 2)
##########################

因此,您唯一应该做的就是使用Y.shape类的命令检查矩阵尺寸并纠正错误。

我希望这有帮助: )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM