我在学习编程和人工智能方面是新手,不知道如何解决这个问题。我通过YouTube学习编程,但那里没有提到这个问题。由于我是新手,我完全不知道如何解决这个问题,甚至不知道问题是什么 – 请帮帮我 D:
问题如下:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-58-2d579b4cf5ca> in <module>() 16 17 ---> 18 train(neural_net, X, Y, l2_cost, 0.5)<ipython-input-58-2d579b4cf5ca> in train(neural_net, X, Y, l2_cost, lr) 11 #Forward pass - 前向传递 12 for l, layer in enumerate(neural_net):---> 13 z = out[-1][1] @ neural_net[l].W + neural_net[l].b 14 a = neural_net[l].act_f[0](z) 15 out.append((z, a))ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
我在Google Colab上编程 – 真的很需要帮助我的代码如下:”’
import numpy as npimport scipy as csimport matplotlib.pyplot as pltfrom sklearn.datasets import make_circles# 创建数据集n = 500 # 要分析的样本数量p = 2 # 样本的特征数量X, Y = make_circles(n_samples = n, factor = 0.5, noise=0.05)plt.scatter(X[Y == 0,0], X[Y == 0,1])plt.scatter(X[Y == 1,0], X[Y == 1,1], c = 'salmon')plt.show()# 神经网络层类class neural_layer(): def __init__(self, n_conn, n_neur, act_f): self.act_f = act_f self.b = np.random.rand(1, n_neur) * 2 - 1 self.W = np.random.rand(n_conn, n_neur) * 2 - 1# 激活函数sigm = (lambda x: 1 / (1 + np.e ** (-x)), lambda x: x * (1 - x))relu = lambda x: np.maximum(0, x)_x = np.linspace(-5, 5, 100)plt.plot(_x, relu(_x))l0 = neural_layer(p, 4, sigm)l1 = neural_layer(4, 8, sigm)# 一直到无穷...def create_nn(topology, act_f): nn = [] # 神经网络各层的容器 for l, layer in enumerate(topology[:-1]): nn.append(neural_layer(topology[1], topology[l+1], act_f)) return nntopology = [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)] # 前向传递 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))train(neural_net, X, Y, l2_cost, 0.5)
”’
回答:
你试图乘以两个不兼容的矩阵。
W 的形状 = (4,4)
out[-1][1] 的形状 = (500,2)
在这一行
z = out[-1][1] @ neural_net[l].W + neural_net[l].b
这是如何修复的
你需要更改下面的行,将“1”改为“l”
更改:
nn.append(neural_layer(topology[1], topology[l+1], act_f))
为
nn.append(neural_layer(topology[l], topology[l+1], act_f))