在Convolution Layers 卷积层中有很多函数,像:nn.Conv1d 表示1维的;nn.Conv2d 表示2维的,如图片,等。其中Conv2d使用最多,故本文重点讲下nn.Conv2d的使用。
目录
一、Conv2d的官方文档
二、实例操作
1.理解参数之间的关系
2.实例练习
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:
在搭建神经网络中,我们可以根据已知数据来推算出其他的。
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,这时有两个卷积核,这两个卷积核可能一样,也可能不一样。
练习代码如下:
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 + 1writer.close()