卷积神经网络(CNN)自学笔记2:卷积层

一、卷积层的定义

卷积层是卷积神经网络的基本组成之一,主要作用是用于提取图像特征。

1.卷积操作的原理

卷积操作是一种数学运算,用于两个函数之间的积分。对于图像处理,卷积操作通常表示为对输入图像与滤波器(也称为卷积核或kernel)进行点积运算。卷积核是一个较小的矩阵,通过滑动窗口的方式在输入图像上移动,计算每个位置的点积,从而生成特征图(feature map)。

Pytorch中的Tensor通道排列顺序是:[batch, channel, height, width]

2.卷积操作的一些基本概念

卷积核(Kernel)

也被叫做滤波器(filter),假设卷积核的高和宽分别为𝑘ℎ和𝑘𝑤,则将称为𝑘ℎ×𝑘𝑤卷积,比如3×3卷积,就是指卷积核的高为3, 宽为3。卷积核中数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重。

填充(Padding)

填充(Padding)是在卷积神经网络(CNN)中为输入张量的边缘添加额外的像素,以控制输出特征图的大小并保持输入图像的空间尺寸。填充有助于保留输入图像边缘的信息,并在卷积运算中避免空间尺寸的过度缩小。

步长(Stride)

步长(Stride)是卷积操作中的一个参数,决定了卷积核在输入图像上滑动的步幅。具体来说,步长定义了卷积核每次滑动的距离。它控制了卷积运算中卷积核在输入图像上移动的距离,从而影响输出特征图的大小。

卷积层输出特征图的尺寸计算

H=\frac{W-F+2P}{S}+1

其中,H为输出特征图的高度和宽度(假设输入为正方形图像),W为输入图像的高度和宽度,F为卷积核大小,P为填充,S为步长。

注:当输出图像的尺寸计算公式得到的结果为非整数时,在 PyTorch 中,通常会将其向下取整(取floor),以确保输出图像的尺寸为整数。

import torch
import torch.nn as nn

# 输入张量
input_tensor = torch.randn(1, 3, 7, 7)  # (batch_size, channels, height, width)

# 定义卷积层,步长为2,卷积核大小为2x2,填充为1
conv_layer = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=2, stride=2, padding=1
### PyTorch 中 Conv2d 的使用 在 PyTorch 中,`torch.nn.Conv2d` 是用于执行二维卷积操作的核心类。该类接受多个参数来定义卷积层的行为。 #### 参数说明 - `in_channels`: 输入张量的通道数。 - `out_channels`: 输出张量的通道数(即滤波器的数量)。 - `kernel_size`: 卷积核大小,可以是一个整数或一对整数值表示高度和宽度。 - `stride`: 步幅,默认为 1。 - `padding`: 填充方式,默认不填充。 - `dilation`: 膨胀率,默认为 1。 - `groups`: 控制输入和输出之间的连接,默认为 1 表示全连接模式。 - `bias`: 是否包含偏置项,默认为 True。 - `padding_mode`: 边缘填充的方式,默认采用零填充[^3]。 #### 实现例子 下面展示了一个简单的实例,演示如何创建并应用一个自定义配置的二维卷积层: ```python import torch import torch.nn as nn # 定义输入张量 (batch_size, channels, height, width) input_tensor = torch.randn((1, 1, 4, 4)) # 初始化卷积层对象 conv_layer = nn.Conv2d( in_channels=1, out_channels=2, kernel_size=(3, 3), stride=1, padding=0) # 应用卷积运算得到输出特征图 output_feature_map = conv_layer(input_tensor) print("Input Tensor Shape:", input_tensor.shape) print("Output Feature Map Shape:", output_feature_map.shape) ``` 这段代码展示了如何构建一个具有单个输入通道、两个输出通道以及 \(3 \times 3\) 大小卷积核的标准卷积层,并将其应用于给定的输入张量上[^4]。 #### 手动实现 Conv2d 为了更深入理解卷积过程的工作原理,还可以通过手动编写 Python 函数来进行卷积计算。这里给出一种简化版本的手工实现方法,仅适用于不含批次尺寸(batch size) 和多通道(channel dimension)的情况: ```python def manual_conv2d(image, kernel): """A simplified version of a convolution operation.""" img_h, img_w = image.shape[:2] ker_h, ker_w = kernel.shape result_height = img_h - ker_h + 1 result_width = img_w - ker_w + 1 # Initialize the resulting matrix with zeros. result_matrix = torch.zeros(result_height, result_width) for i in range(result_height): for j in range(result_width): patch = image[i:i+ker_h, j:j+ker_w] result_matrix[i][j] = torch.sum(patch * kernel).item() return result_matrix ``` 此函数接收一张灰度图片作为输入(`image`) 及其对应的卷积核 (`kernel`) ,返回经过卷积后的结果矩阵[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值