def affine_forward(x, w, b): out = None # Reshape x into rows N = x.shape[0] x_row = x.reshape(N, -1) # (N,D) -1表示不知道多少列,指定行,就能算出列 = 2 * 32 * 16 * 16/2 = 8192 out = np.dot(x_row, w) + b # (N,M) 2*8192 8192*100 =>2 * 100 cache = (x, w, b) return out, cache def affine_backward(dout, cache): x, w, b = cache dx, dw, db = None, None, None dx = np.dot(dout, w.T) # (N,D) # dx维度必须跟x维度相同 dx = np.reshape(dx, x.shape) # (N,d1,...,d_k) # 转换成二维矩阵 x_row = x.reshape(x.shape[0], -1) # (N,D) dw = np.dot(x_row.T, dout) # (D,M) db = np.sum(dout, axis=0, keepdims=True) # (1,M) return dx, dw, db
时间: 2024-01-25 16:03:11 浏览: 110
affine_fit(X):仿射表面-matlab开发
这段代码实现了全连接层的反向传播。
输入$dout$为上一层的梯度,将其送入全连接层的反向传播函数中。从缓存$cache$中取出输入$x$、权重$w$和偏置$b$。
首先,计算输入梯度$dx$,通过矩阵乘法得到$dout$和权重$w$的转置$w.T$的乘积,然后将得到的二维矩阵通过reshape函数转换为与输入$x$相同的形状。这里需要注意,由于在前向传播中通过reshape函数将输入$x$转换为二维矩阵,因此在反向传播中也需要通过reshape函数将输入梯度$dx$转换为与输入$x$相同的形状。
然后,计算权重梯度$dw$,通过矩阵乘法得到输入$x$的转置$x\_row.T$和输出梯度$dout$的乘积。
最后,计算偏置梯度$db$,通过求和得到输出梯度$dout$在第0维上的和,即对于每个样本在输出梯度上的和,得到形状为(1,M)的偏置梯度$db$。
将输入梯度$dx$、权重梯度$dw$和偏置梯度$db$返回即可。
这段代码可以用于搭建全连接神经网络中的一个层的反向传播。
阅读全文