神经网络——Conv2d的使用

在Convolution Layers  卷积层中有很多函数,像:nn.Conv1d    表示1维的;nn.Conv2d    表示2维的,如图片,等。其中Conv2d使用最多,故本文重点讲下nn.Conv2d的使用。


目录

一、Conv2d的官方文档

二、实例操作

1.理解参数之间的关系

2.实例练习


一、Conv2d的官方文档

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 (int) – 输入图像中的通道数

out_channels (int) – 卷积产生的通道数即输出图片的通道数

kernel_size (int or tuple) – 卷积核的大小(可以是个数,也可以是元组)

stride (int or tuple, optional) — 卷积的步幅。 默认值:1

padding (int, tuple or str, optional) – 填充添加到输入的所有四个边。 默认值:0

padding_mode (string, optional) –填充的几个选择 'zeros', 'reflect', 'replicate' 或 'circular'。 默认值:“零”

dilation (int or tuple, optional) – 内核元素之间的间距。 默认值:1

groups (int, optional) – 从输入通道到输出通道的阻塞连接数。 默认值:1

bias (bool, optional) — 如果为真,则为输出添加可学习的偏差。 默认值:真

其中,标红的参数使用的较多。

shape:

在搭建神经网络中,我们可以根据已知数据来推算出其他的。

二、实例操作

1.理解参数之间的关系

Conv2d中常用的参数有in_channels, out_channels, kernel_size, stride, padding,学习之前可以先了解一些参数之间的关系。

可以进行简单的理解:

当in_channels = 1,out_channels = 1时,表示输入的图像数量是1, 输出的数量也是1,这时有一个卷积核。
 
而当in_channels = 1,out_channels = 2时,表示输入的图像数量是1, 输出的数量也是2,这时有两个卷积核,这两个卷积核可能一样,也可能不一样。
 

2.实例练习

练习代码如下:

import torchvision
import torch
from torch import nn
from torch.utils.data import  DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from torch.nn import Conv2d

#使用CIFAR10数据集
dataset_conv = torchvision.datasets.CIFAR10("./dataset", train=False, transform=transforms.ToTensor(), download=True)

#将数据集放入dataloader中,让它进行加载
dataloder = DataLoader(dataset=dataset_conv, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

class Test(nn.Module):  #创建一个Test类,继承nn.Module
    def __init__(self):
        super(Test, self).__init__()    #完成父类的初始化
        self.conc1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)                                        #在Test这个网络写入个卷积层

    def forward(self, x):
        x = self.conc1(x)
        return (x)

#初始化这个网络并输出
test = Test()
print(test)

#写入tensorboard中
writer = SummaryWriter("logs")
step = 0
for data in dataloder:
     imgs, target = data
     output = test(imgs)    #输出的数据是经过神经网络处理的数据

#查看数据类型代码
     # print(imgs.shape)
     # print(output.shape)
     #torch.Size([64, 3, 32, 32])

     writer.add_images("conv2d", imgs, global_step=step)     #因为不是一张图片,所以使用images

     #torch.Size([64, 6, 30, 30]) ——>[xx, 3, 30, 30] 因为彩色图片是3channals的,但是我们输出是6channals,,它识别不出来所以会报错
     output = torch.reshape(output, (-1, 3, 30, 30))

     #使用reshape来变换通道,因为batch我们不知道,直接输入-1,它会根据后面内容,自动推导出来(这个方法有点取巧,供学习理解)

     writer.add_images("output", output, step)
     step = step + 1

writer.close()

 

来源:晓亮.

物联沃分享整理
物联沃-IOTWORD物联网 » 神经网络——Conv2d的使用

发表评论