神经网络卷积操作

一、nn.Conv2d

nn.Conv2d 是 PyTorch 中的一个类,它代表了一个二维卷积层,通常用于处理图像数据。在深度学习和计算机视觉中,卷积层是构建卷积神经网络(CNN)的基本构件,它们能够从图像中提取特征。
二维卷积层 nn.Conv2d 的相关参数:

  • in_channels:输入图像的通道数。例如,对于彩色图像,通常 in_channels 为 3,因为彩色图像有 RGB 三个通道。
  • out_channels:输出特征图的通道数。这个参数决定了卷积层输出的特征图数量,也就是卷积核的数量。
  • kernel_size:卷积核的大小。它是一个元组或整数,指定了卷积核在每个空间维度(高度和宽度)上的尺寸。例如,kernel_size=3
    表示卷积核是 3x3 的。
  • stride:卷积的步长。它指定了卷积核在图像上滑动的间隔。默认值为 1,意味着卷积核每次移动一个像素。
  • padding:填充。它用于在输入图像的边界周围填充零。这通常用于控制输出特征图的空间尺寸。
  • dilation:膨胀。它用于控制卷积核中元素之间的间距,用于增大卷积核的感受野。
  • groups:分组卷积的组数。通过设置这个参数,可以使得卷积层的某些部分不与其他部分的输入或输出相连接,这在某些特定的网络架构中很有用。

二、卷积操作原理

假设输入图像是一个5x5的矩阵,而卷积核是一个3x3的矩阵,通过卷积操作得到结果矩阵
在这里插入图片描述

  • 当卷积步长stride=1,计算方式:

在这里插入图片描述

  • 把卷积核放在输入图像当中,也就是1x1+2x2+1x1+2x1+1x2=10,将得到的答案放在结果的第一个框框里头。

  • 以此类推,进行第二个操作:

在这里插入图片描述

  • 同样第三个操作:

在这里插入图片描述

  • 需要注意的是,卷积核不能出格子,也就是不能像下图操作:
    在这里插入图片描述
  • 在第一行运行结束后,就往下面进行运算:

在这里插入图片描述
以此类推,将卷积核在输入图像中全部运算完成。

三、代码实现卷积操作

import torch
import torch.nn.functional as F
input = torch.tensor([
    [1, 2, 0, 3, 1],
    [0, 1, 2, 3, 1],
    [1, 2, 1, 0, 0],
    [5, 2, 3, 1, 1],
    [2, 1, 0, 1, 1]])

kernel = torch.tensor([
    [1, 2, 1],
    [0, 1, 0],
    [2, 1, 0]])

#通过函数reshape进行格式的转换
input = torch.reshape(input,(1, 1, 5, 5))
kernel = torch.reshape(kernel,(1, 1, 3, 3))
#查看转换后的input和kernel格式
print(input.shape)
print(kernel.shape)

output = F.conv2d(input, kernel, stride=1)
print(output)

注:因为conv2d的输入格式一定要是(x,y,z,t)4个数字形式,故需要使用reshape函数先进行数据的转换,然后再输入给conv2d当中。

运行结果:
在这里插入图片描述
可以看到输出的矩阵结果跟我们上面计算的结果是一致的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(CNN)中的卷积操作是通过卷积核与输入特征图进行逐元素乘积并求和的过程。具体步骤如下: 1. 定义卷积核:卷积核是一个小的矩阵,它的大小通常是正方形,例如3x3或5x5。卷积核的参数是需要通过训练来学习的。 2. 滑动窗口:将卷积核应用于输入特征图上的每个位置。滑动窗口的大小与卷积核的大小相同。 3. 逐元素乘积:在每个位置,将卷积核与输入特征图的对应区域进行逐元素乘积。 4. 求和:将逐元素乘积的结果进行求和,得到卷积操作的输出值。 5. 移动滑动窗口:将滑动窗口向右移动一个像素,并重复步骤3和步骤4,直到遍历完整个输入特征图。 6. 输出特征图:将所有卷积操作的输出值组合起来,形成输出特征图。 下面是一个示例代码,演示了如何使用卷积核对输入特征图进行卷积操作: ```python import numpy as np # 定义输入特征图 input_feature_map = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) # 定义卷积核 kernel = np.array([[1, 0], [0, 1]]) # 获取输入特征图和卷积核的大小 input_height, input_width = input_feature_map.shape kernel_height, kernel_width = kernel.shape # 计算输出特征图的大小 output_height = input_height - kernel_height + 1 output_width = input_width - kernel_width + 1 # 初始化输出特征图 output_feature_map = np.zeros((output_height, output_width)) # 进行卷积操作 for i in range(output_height): for j in range(output_width): output_feature_map[i, j] = np.sum(input_feature_map[i:i+kernel_height, j:j+kernel_width] * kernel) # 输出结果 print("输入特征图:") print(input_feature_map) print("卷积核:") print(kernel) print("输出特征图:") print(output_feature_map) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值