一、Conv2d
torch.nn.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 | 输入的通道数,如果是彩色照片通道数(RGB)就是3 | (int) – Number of channels in the input image |
out_channels | 输出的通道数。若输入为一张单通道的灰度图像,输出通道设置为2,则卷积层会提供2个卷积核(不一定完全相同)来分别对这个单通道图像进行卷据操作,得到2张特征图 | (int) – Number of channels produced by the convolution |
kernel_size | 卷积核的大小,可以输入一个整数或者一个元组 | (int or tuple) – Size of the convolving kernel |
stride | 卷积的过程中移动的步数 | (int or tuple, optional) – Stride of the convolution. Default: 1 |
padding | 是否对原始图像进行加边操作 | (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0 |
dilation | 卷积核对应位置的距离,卷积的各个元素之间具有位置,并非全部相邻 | (int or tuple, optional) – Spacing between kernel elements. Default: 1 |
groups | 分组卷积,一般都是设置为1,几乎不用分组卷积 | (int, optional) – Number of blocked connections from input channels to output channels. Default: 1 |
bias | 偏置,常设置为True,也就是最后加个常数进行微调 | (bool, optional) – If True, adds a learnable bias to the output. Default: True |
padding_mode | 在padding进行加边操作的时候,需要加的内容是啥,一般都是zero 全填充0 | (string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’ |
相关参数设置的演示,需要科学上网,懂得都懂
二、代码演示
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#下载CIFAR10数据集到CIFAR_10文件夹下,train=False下载测试集,transform=torchvision.transforms.ToTensor()对数据进行转换为tensor类型,download=True若没有则下载数据集dataloader = DataLoader(dataset=dataset_test,batch_size=32)
#dataset=dataset_test指定装载的数据集为dataset_test也就是CIAFAR10数据集中的测试集;batch_size=32每32张为一组class Beyond(nn.Module):def __init__(self):super(Beyond, self).__init__()self.conv2d_1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=1)#in_channels=3输入的3通道的彩色图片#out_channels=6输出为通过卷积之后得到的6通道的特征图#kernel_size=3卷积核的大小为(3,3)#stride=1每一步进行(1,1)的移动#padding=1为了防止卷积之后的特征图大小变化,这里向图片的加了一圈边def forward(self,input):result = self.conv2d_1(input)#对传入的input数据进行卷积,卷积的配置在__init__中进行定义return resultbeyond = Beyond()
print(beyond)
"""
Beyond((conv2d_1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))#也就是__init__中的定义
)
"""writer = SummaryWriter("y_log")#准备上传至tensorboardi = 0
for data in dataloader:imgs,targets = dataoutput = beyond(imgs)#print(imgs.shape)#torch.Size([32, 3, 32, 32])#print(output.shape)#torch.Size([32, 6, 32, 32])#原始的数据为[32, 3, 32, 32],[batch,channel,H,W]#卷积之后变成了6通道,故需要转换输出数据output = torch.reshape(output,(-1,3,32,32))#这里的channel为3,而batch为-1表示:输出就为3个,剩下的往batch上加,相当于多来几组writer.add_images("input_CIFAR10",imgs,i)writer.add_images("output_CIFAR10",output,i)i = i + 1writer.close()
在Terminal下运行tensorboard --logdir=y_log --port=7870
,logdir为打开事件文件的路径,port为指定端口打开;
通过指定端口2312进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
点击该链接或者复制链接到浏览器打开即可
input_CIFAR10为32张一组,而output_CIFAR10则不一样
原因是在神经网络模型构建的时候Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=1)
,输入3通道,卷积操作之后输出6通道
因为通道数的不同,无法上传至tensorboard展示,故又通过torch.reshape(output,(-1,3,32,32))
对output进行了转换下格式,其中(-1,3,32,32)
,out_channels将强制转换为3,而因为是-1故需要将多余的通过batch进行扩展,也就是增加每组图片的数量,故在tensorboard中显示的时候input和output显示的每组数量不一样。