7.3单通道卷积核及步长stride

原理

下面是步长为2的例子:


例子:pytorch的卷积conv2d示例

import torch
import torch.nn.functional as F

# 输入是一个5x5的矩阵
input = torch.tensor([[1, 1, 1, 0, 0],
                       [0, 1, 1, 1, 1],
                       [0, 0, 1, 1, 0],
                       [0, 0, 1, 0, 0],
                       [0, 1, 1, 0, 0]])

# 卷积核是一个3x3的矩阵
kernel = torch.tensor([[1, 0, 1],
                        [0, 1, 0],
                        [1, 0, 1]])

print("Input shape:", input.shape)
print("Kernel shape:", kernel.shape)

# 重新定义尺寸,把尺寸改成四个数,1个batch size,1个通道,长和宽
input = input.reshape((1, 1, 5, 5))
kernel = kernel.reshape((1, 1, 3, 3))

print("Reshaped Input shape:", input.shape)
print("Reshaped Kernel shape:", kernel.shape)

# 使用F.conv2d进行卷积操作,stride=1时的输出
output1 = F.conv2d(input, kernel, stride=1)
print("Output with stride=1:\n", output1)

# 使用F.conv2d进行卷积操作,stride=2时的输出
output2 = F.conv2d(input, kernel, stride=2)
print("Output with stride=2:\n", output2)

为什么要重新定义尺寸

在PyTorch中使用F.conv2dtorch.nn.Conv2d进行卷积操作时,输入数据和卷积核(权重)需要具有特定的形状,以确保操作可以正确执行。以下是所需的形状:

  • 输入数据:形状应为(N, C, H, W),其中:

    • N 是批大小(batch size)。
    • C 是通道数(number of channels)。
    • H 是高度(height)。
    • W 是宽度(width)。
  • 卷积核:形状应为(M, C_in, H_k, W_k),其中:

    • M 是输出通道数(number of output channels,即卷积层的过滤器数量)。
    • C_in 是输入通道数(number of input channels)。
    • H_k 和 W_k 分别是卷积核的高度和宽度。

原始代码中的输入是一个5x5的矩阵,这没有包含通道维度和批大小。在PyTorch中,卷积操作期望输入至少有四个维度,所以需要将原始的二维矩阵重塑为四维张量,以匹配卷积层的期望输入形状。

在代码中,输入矩阵被重塑为(1, 1, 5, 5),表示:

  • 1个批大小(N=1
  • 1个通道(C=1
  • 高度为5(H=5
  • 宽度为5(W=5

卷积核被重塑为(1, 1, 3, 3),表示:

  • 1个输出通道(M=1),在这个例子中,我们只使用一个卷积核,所以输出通道数与输入通道数相同。
  • 1个输入通道(C_in=1
  • 卷积核的高度和宽度都是3(H_k=3W_k=3

重塑尺寸的目的是为了确保输入数据和卷积核的形状与PyTorch中卷积操作的要求一致,从而能够正确地进行卷积计算。如果输入数据或卷积核的形状不正确,F.conv2d将无法执行,并且会抛出错误。


在PyTorch框架中,实现卷积操作非常简单。以下是一个简单的示例,演示如何使用PyTorch创建一个卷积层,并将其应用于输入数据。这个示例中,我们将创建一个简单的卷积神经网络层,包括卷积层、激活函数ReLU以及一个简单的前向传播过程。

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # 定义一个卷积层,输入通道为1,输出通道为8,卷积核大小为3x3
        self.conv1 = nn.Conv2d(1, 8, kernel_size=3, stride=1, padding=1)
    
    def forward(self, x):
        # 应用卷积层
        x = self.conv1(x)
        # 应用ReLU激活函数
        x = F.relu(x)
        return x

# 创建网络实例
net = SimpleCNN()

# 创建一个假的输入数据,例如一个28x28的单通道图像
# 假设batch size为1
input_tensor = torch.randn(1, 1, 28, 28)

# 前向传播,获取输出
output = net(input_tensor)

print("Output shape:", output.shape)

这段代码首先导入了必要的PyTorch模块,然后定义了一个简单的卷积神经网络SimpleCNN,它包含一个卷积层和一个ReLU激活函数。在__init__方法中,我们初始化了一个nn.Conv2d卷积层,其中参数padding=1用于保持输出特征图的大小与输入相同。在forward方法中,我们实现了前向传播过程,首先通过卷积层,然后应用ReLU激活函数。

最后,我们创建了一个网络实例,生成了一个随机初始化的输入张量,并进行了前向传播以获取输出。输出的形状将显示在控制台。

请注意,这个示例是非常基础的,实际的卷积神经网络可能会包含多个卷积层、池化层、全连接层等,以及更复杂的结构和参数设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值