16.神经网络 - 卷积层

神经网络 - 卷积层

pytorch官网网站卷积层(Convolution Layers):Convolution Layers

nn.Conv1d 一维卷积Applies a 1D convolution over an input signal composed of several input planes.
nn.Conv2d 二维卷积Applies a 2D convolution over an input signal composed of several input planes.
nn.Conv3d 三维卷积Applies a 3D convolution over an input signal composed of several input planes.

图像为二维矩阵,所以讲解 nn.Conv2d:

Conv2d — PyTorch 1.10 documentation

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
 
# in_channels 输入通道数
# out_channels 输出通道数
# kernel_size 卷积核大小 
#以上参数需要设置
 
#以下参数提供了默认值
# stride=1 卷积过程中的步进大小
# padding=0 卷积过程中对原始图像进行padding的选项
# dilation=1 每一个卷积核对应位的距离
# groups=1 一般设置为1,很少改动,改动的话为分组卷积
# bias=True 通常为True,对卷积后的结果是否加减一个常数的偏置
# padding_mode='zeros' 选择padding填充的模式

参数含义:

image-20240725184056104

动图(演示地址): [conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic · GitHub](conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic · GitHub)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

kernel_size

定义了一个卷积核的大小,若为3则生成一个3×3的卷积核

卷积核的参数是从一些分布中进行采样得到的
实际训练过程中,卷积核中的值会不断进行调整

in_channels & out_channels

in_channels:输入图片的channel数(彩色图像 in_channels 值为3)
out_channels:输出图片的channel数

in_channels 和 out_channels 都为 1 时,拿一个卷积核在输入图像中进行卷积

out_channels 为 2 时,卷积层会生成两个卷积核(不一定一样),得到两个输出,叠加后作为最后输出

CIFAR10数据集实例

# CIFAR10数据集
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
 
dataset = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)  # 这里用测试数据集,因为训练数据集太大了
dataloader = DataLoader(dataset,batch_size=64)
 
# 搭建神经网络Tudui
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        # 因为是彩色图片,所以in_channels=3
        self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)   #卷积层conv1
    def forward(self,x):  #输出为x
        x = self.conv1(x)
        return x
 
tudui = Tudui()  # 初始化网络
# 打印一下网络结构
print(tudui)   #Tudui((conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1)))
 
writer = SummaryWriter("logs")
step = 0
for data in dataloader:
    imgs,targets = data  #经过ToTensor转换,成为tensor数据类型,可以直接送到网络中
    output = tudui(imgs)
    print(imgs.shape)     #输入大小 torch.Size([64, 3, 32, 32])  batch_size=64,in_channels=3(彩色图像),每张图片是32×32的
    print(output.shape)   #经过卷积后的输出大小 torch.Size([64, 6, 30, 30])  卷积后变成6个channels,但原始图像减小,所以是30×30的
    writer.add_images("input",imgs,step)
    
    # 6个channel无法显示。torch.Size([64, 6, 30, 30]) ——> [xxx,3,30,30] 第一个值不知道为多少时写-1,会根据后面值的大小进行计算
    output = torch.reshape(output,(-1,3,30,30))
    writer.add_images("output",output,step)
    step = step + 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行后(如果没启用环境),在 Terminal 里启动 pytorch 环境:

conda activate pytorch

打开 tensorboard:

tensorboard --logdir=logs

打开网址(卷积后得到的输出)

image-20240725184659473

卷积层 vgg16

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积前后维度计算公式

img

4861571558)]

卷积前后维度计算公式

img

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络卷积层是其中最重要的一层,它通过卷积操作对输入数据进行特征提取。下面是卷积层的工作原理: 1. 输入数据:卷积层的输入是一个多维数组,通常是一个图像或特征图。这个输入数据被称为输入特征图。 2. 卷积核:卷积层包含多个卷积核,每个卷积核都是一个小的多维数组。卷积核的大小通常是正方形,例如3x3或5x5。 3. 卷积操作:卷积操作是将卷积核与输入特征图进行逐元素相乘,并将结果相加得到一个新的特征图。这个操作可以看作是在输入特征图上滑动卷积核,每次计算一个局部区域的乘积和。 4. 特征图:卷积操作得到的新特征图是卷积层的输出。它表示了输入特征图中不同位置的特征。 5. 激活函数:通常,在卷积操作之后,会对特征图应用一个激活函数,例如ReLU函数。这样可以引入非线性,增加网络的表达能力。 6. 步幅和填充:卷积操作可以通过调整步幅和填充来控制输出特征图的大小。步幅是卷积核在输入特征图上滑动的距离,填充是在输入特征图边缘添加额外的像素。 7. 多通道卷积:如果输入特征图有多个通道(例如RGB图像),每个卷积核都会与输入特征图的每个通道卷积操作,并将结果相加得到一个新的特征图。 . 参数共享:卷积层的参数是卷积核的权重。在卷积操作中,每个卷积核都会与输入特征图的不同位置进行相同的计算,因此可以共享参数,减少网络的参数量。 9. 池化层:在卷积层之后,通常会添加一个池化层来减小特征图的尺寸,并提取更加显著的特征。 10. 多层卷积:卷积神经网络通常包含多个卷积层,每个卷积层都可以提取不同级别的特征。 下面是一个示例代码,演示了如何在Python中使用卷积层: ```python import tensorflow as tf # 创建卷积层 conv_layer = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)) # 输入数据 input_data = tf.random.normal(shape=(1, 28, 28, 1)) # 前向传播 output_data = conv_layer(input_data) # 输出特征图的形状 print(output_data.shape) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值