nn.Conv2d与nn.ConvTranspose2d函数的用法

本文详细解析了卷积神经网络中的通道数问题,包括输入、输出通道及卷积核的关系。介绍了PyTorch中nn.Conv2d与nn.ConvTranspose2d的使用方法,包括参数说明与图像尺寸变化原理,帮助读者深入理解卷积操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 通道数问题

描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果有RGB三种颜色来描述它,就是三通道。最初输入的图片样本的 channels ,取决于图片类型;
卷积操作完成后输出的 out_channels ,取决于卷积核的数量。此时的 out_channels 也会作为下一次卷积时的卷积核的 in_channels;
卷积核中的 in_channels ,上面已经说了,就是上一次卷积的 out_channels ,如果是第一次做卷积,就是样本图片的 channels 。
举个例子,假设现有一个为 6×6×3的图片样本,使用 3×3×3 的卷积核(filter)进行卷积操作。此时输入图片的 channels 为 3,而卷积核中的 in_channels 与需要进行卷积操作的数据的 channels 一致(就是图片样本,为3)。接下来进行卷积操作,卷积核中的27个数字与分别与样本对应相乘后,再进行求和,得到第一个结果。依次进行,最终得到 4×4的结果。由于只有一个卷积核,所以最终得到的结果为 4×4×1,out_channels 为 1。如下图所示:

在这里插入图片描述

在实际应用中,都会使用多个卷积核。这里如果再加一个卷积核,就会得到 4×4×2的结果。如下图所示:

在这里插入图片描述

2. nn.Conv2d

class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True)

nn.Conv2d的功能是:对由多个输入平面组成的输入信号进行二维卷积。输入信号的形式为 ,

(1)参数说明:
N:表示batch size(批处理参数)
Cin:表示channel个数
H,W:分别表示特征图的高和宽。

stride(步长):步长,默认为1,可以设为1个int型数或者一个(int, int)型的tuple。

kernel_size:卷积核的宽度和长度,单个整数或由两个整数构成的list/tuple。如为单个整数,则表示在各个空间维度的相同长度。

padding(补0):控制zero-padding的数目,padding是在卷积之前补0。

dilation(扩张):控制kernel点(卷积核点)的间距; 可以在此github地址查看:Dilated convolution animations

groups(卷积核个数):通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —— in_channels中数目的卷积核:

(2)图像尺寸:
经过一次卷积之后,生成的图的大小:(original_size - (kernal_size - 1)) / stride

3. nn.ConvTranspose2d

nn.ConvTranspose2d的功能是进行反卷积操作

(1)输入格式:
nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)

(2)参数的含义:
in_channels(int) – 输入信号的通道数
out_channels(int) – 卷积产生的通道数
kerner_size(int or tuple) - 卷积核的大小
stride(int or tuple,optional) - 卷积步长,即要将输入扩大的倍数。
padding(int or tuple, optional) - 输入的每一条边补充0的层数,高宽都增加2*padding
output_padding(int or tuple, optional) - 输出边补充0的层数,高宽都增加padding
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias=True,添加偏置
dilation(int or tuple, optional) – 卷积核元素之间的间距

nn.Conv2dnn.functional.conv2d是PyTorch中用于进行二维卷积操作的两种方式,它们之间有以下区别: 1.函数nn.Conv2d是一个类,需要实例化为对象后才能使用,而nn.functional.conv2d是一个函数,可以直接调用。 2. 继承关系:nn.Conv2dnn.Module类的子类,因此它可以被用作神经网络模型的一部分,并且可以在模型的forward方法中被调用。而nn.functional.conv2d不是nn.Module的子类,它是一个纯函数,只能在模型的forward方法中被调用。 3. 参数传递:nn.Conv2d的参数需要在实例化时进行传递,包括输入通道数、输出通道数、卷积核大小等。而nn.functional.conv2d的参数需要在每次调用时传递,包括输入张量、卷积核、步长、填充等。 4. 内部实现:nn.Conv2d使用了可学习的参数,包括卷积核权重和偏置项,这些参数会在训练过程中进行更新。而nn.functional.conv2d没有可学习的参数,它只是对输入张量进行卷积操作。 下面是一个示例代码,展示了如何使用nn.Conv2dnn.functional.conv2d进行二维卷积操作: ```python import torch import torch.nn as nn import torch.nn.functional as F # 使用nn.Conv2d进行卷积操作 conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1) input1 = torch.randn(1, 3, 32, 32) output1 = conv1(input1) # 使用nn.functional.conv2d进行卷积操作 input2 = torch.randn(1, 3, 32, 32) kernel = torch.randn(64, 3, 3, 3) output2 = F.conv2d(input2, kernel, stride=1, padding=1) print(output1.shape) print(output2.shape) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值