二维卷积的动手实现

#学自深度学习5.1章
在这里插入图片描述
在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。图5.1中的输出数组高和宽分别为2,其中的4个元素由二维互相关运算得出:

0×0+1×1+3×2+4×3=19,
1×0+2×1+4×2+5×3=25,
3×0+4×1+6×2+7×3=37,
4×0+5×1+7×2+8×3=43.

import torch
def corr2d(x,k):
    k_h,k_w = k.shape
    y=torch.zeros(x.shape[0]+1-k_h, x.shape[1]+1-k_w)
    #如果是full_corr2d,可以修改y的shape
    for i in range(y.shape[0]):
        for j in range(y.shape[1]):
            y[i,j]=(x[i:i+k_h, j:j+k_w]*k).sum()
    return y

X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
print(corr2d(X, K))

#tensor([[19., 25.],
#        [37., 43.]])

features map(valid_corr2d)
shape[0] = (X.shape[0]+stride-K.shape[0]) / stride
shape[1] = (X.shape[1]+stride-K.shape[1]) / stride

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要手动实现二维卷积核,我们首先需要了解卷积的工作原理。卷积操作的目的是将一个滤波器(也称为卷积核)在输入的图像上滑动,并对每个滑动位置的局部区域进行加权求和,从而得到一个输出特征图。 首先,我们需要准备输入图像和卷积核。假设输入图像是NxN大小的,卷积核大小为KxK,我们先创建一个大小为NxN的二维数组来表示输入图像,并用随机数初始化。接下来,我们创建一个大小为KxK的二维数组作为卷积核。 然后,我们需要遍历输入图像的每个位置,并在每个位置上进行卷积操作。对于每个位置,我们取与卷积核大小相同的局部区域,并将该区域与卷积核进行按元素相乘,并将结果求和。这个求和结果就是在当前位置上卷积的输出值。 最后,我们将所有卷积的输出值放入一个新的二维数组中,这个数组的大小为(N-K+1)x(N-K+1)。这个输出数组就是经过卷积操作后得到的特征图。 在Python中,我们可以使用循环来实现上述过程。具体代码如下: ```python import numpy as np def manual_convolution(input_image, kernel): N, _ = input_image.shape K, _ = kernel.shape output_size = N - K + 1 output = np.zeros((output_size, output_size)) for i in range(output_size): for j in range(output_size): output[i, j] = np.sum(input_image[i:i+K, j:j+K] * kernel) return output # 生成输入图像和卷积核 N = 5 K = 3 input_image = np.random.random((N, N)) kernel = np.random.random((K, K)) # 手动进行二维卷积操作 output = manual_convolution(input_image, kernel) print("输出特征图:") print(output) ``` 以上代码首先生成了一个5x5的随机输入图像和一个3x3的随机卷积核,然后调用`manual_convolution`函数进行手动实现二维卷积操作。最后,输出得到的特征图。 请注意,手动实现二维卷积操作只是一种简化的方式,如果需要高效地进行卷积操作,建议使用已经优化过的卷积函数,如PyTorch中的`torch.nn.functional.conv2d`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lins H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值