affine_forward为什么输入x: 2*32*16*16 输入x_row: 2*8192 超参w:8192*100 输出:矩阵乘法 2*8192 ->8192*100 =>2*100
时间: 2023-07-23 10:25:04 浏览: 69
在affine_forward函数中,输入x的形状为(2,32,16,16),经过reshape之后,x_row的形状为(2,8192),这是因为32*16*16=8192,即将x的后三个维度展平成一个维度。超参w的形状为(8192,100),因此经过矩阵乘法x_row.dot(w),得到的输出形状为(2,100),即将输入x的每个样本与超参w相乘,得到每个样本对应的输出。最后再加上偏置b,得到的输出仍然是形状为(2,100)的矩阵。因此,输出的形状为(2,100)是因为输入x有2个样本,每个样本得到一个100维的输出。
相关问题
def affine_forward(x, w, b): out = None 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为什么 输入x: 2*32*16*16 输入x_row: 2*8192 超参w:8192*100 输出:矩阵乘法 2*8192 ->8192*100 =>2*100
在这段代码中,输入x的形状为(2,32,16,16),经过reshape之后,x_row的形状为(2,8192),这是因为32*16*16=8192。超参w的形状为(8192,100),因此经过矩阵乘法x_row.dot(w),得到的输出形状为(2,100)。最后加上偏置b,得到的输出仍然是形状为(2,100)的矩阵。因此代码的实现是正确的。
全连接层:矩阵变换,获取对应目标相同的行与列 输入x: 2*32*16*16 输入x_row: 2*8192 超参w:8192*100 输出:矩阵乘法 2*8192 ->8192*100 =>2*100def affine_forward(x, w, b): out = None N = x.shape[0] x_row = x.reshape(N, -1) w = np.random.randn(6272, 100) out = np.dot(x_row, w) + b.reshape(1, -1) cache = (x, w, b) return out, cache,应该怎么修改成为可操作mnist图像的算法
如果你想使用MNIST图像进行全连接层的操作,你需要将输入的x reshape为(样本数量, 特征数量),其中特征数量应该是图像的像素数量,即28 * 28 = 784。具体来说,你可以将输入的x reshape为(样本数量, 784),然后使用尺寸为(784, 100)的权重矩阵进行矩阵乘法。修改后的代码如下:
```
def affine_forward(x, w, b):
out = None
N = x.shape[0]
x_row = x.reshape(N, -1)
out = np.dot(x_row, w) + b.reshape(1, -1)
cache = (x, w, b)
return out, cache
```
在调用函数时,你需要将x reshape为(样本数量, 784),然后创建一个尺寸为(784, 100)的随机权重矩阵w,再将b初始化为0。例如:
```
x = x.reshape(x.shape[0], -1)
w = np.random.randn(784, 100)
b = np.zeros((1, 100))
out, cache = affine_forward(x, w, b)
```
这样,你就可以使用MNIST图像进行全连接层的操作了。
阅读全文