一、卷积
使用之前需要引入:
import torch
import torch.nn.functional as F
参数:
官网提供数据如上,其中:
input:输入。需要是 tensor 型的,要写明有数据分成几批,输入通道有几个,高和宽是多少
weight:权重,卷积核(kernel)。要写明输出通道有几个,(group一般取1)输入通道数,高和宽
bias:偏置
stride:步长,可以是单个数,或者元组(sH:控制横向步径,sW:控制纵向步径)
padding:填充
使用方法举例:
import torch
import torch.nn.functional as F
input = torch.tensor([[1,2,0,3,1],
[0,1,2,3,1],
[1,2,1,0,0],
[5,2,3,1,1],
[2,1,0,1,1]]) # 这是输入矩阵
# 下面是卷积核
kernel = torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])
# pytorch 提供的尺寸变换
input = torch.reshape(input,(1,1, 5, 5)) # batchsize=1*1 宽高=5*5 通道=1
'''
reshape要求输入:tensor形式的矩阵,输入像变换的尺寸大小
'''
kernel = torch.reshape(kernel,(1,1, 3, 3)) # 卷积核宽高,通道等信息重置
output = F.conv2d(input, kernel, stride=1)
output2 = F.conv2d(input, kernel, stride=2)
print(output)
print(output2)
# padding操作
output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)
#结果:
tensor([[[[10, 12, 12],
[18, 16, 16],
[13, 9, 3]]]])
tensor([[[[10, 12],
[13, 3]]]])
tensor([[[[ 1, 3, 4, 10, 8],
[ 5, 10, 12, 12, 6],
[ 7, 18, 16, 16, 8],
[11, 13, 9, 3, 4],
[14, 13, 9, 7, 4]]]])
Process finished with exit code 0
信息补充:
kernel:卷积核;
batch:神经网络训练模型时,有1000个样本,分成10批,就是10个batch,每批100个样本,那么:batch = 10, batch_size = 100;
Epoch:1个epoch等于使用训练集中的全部样本训练一次,通俗的讲几次epoch就是整个数据集被轮几次;
参考:(38条消息) 神经网络训练中batch的作用(从更高角度理解)_神经网络batch_做个好男人!的博客-CSDN博客
二、卷积层
1、官网定义:
参数说明(数据都要转换成 tensor 型):
in_channels:输入通道数;int型
out_channels:输出通道数;int型 输出通道有几个,卷积核就有几个;
kernel_size:卷积核大小;int/tuple型(一个数或者元组)
stride:步长;int/tuple型
padding:填充;int/tuple型
dilation:卷积核对应位的距离,空洞卷积;int/tuple型
groups:一般是1,如果改变就是分组卷积;int型
bias:偏置,True表示计算时偏置要加上去;bool型
padding_mode:填充的模式 'zeros':填充部分都设置成0,还有'reflect''replicate''circular'型;string型
其中只有前三个参数是需要自己设置的,其他都有默认值,比较常用的是前面五个参数。
2、实例:
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("F:\\pycharm\\text\\dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=False)
# 这里是需要一个测试数据集,数据集在F:\pycharm\text\dataset里面,将数据集里的数据集变成 tensor 型
dataloader = DataLoader(dataset,batch_size=64)
# 数据集被分组,每组64张图片,图片取自 dataset,最后赋值给 dataloader
class Tudui(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
# 创建一个卷积层
def forward(self, x):
x = self.conv1(x) # x 经过一个卷积层后得到一个输出,还叫他 x
return x
tudui = Tudui()
print(tudui)
# 输出:Tudui(
# (conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))
# ) 输出卷积的名字叫 conv1,后面是他的信息,3个输入通道,6个输出通道,卷积核原来输入的是
# 3,但是卷积核自动填充,变成了:3*3,后面的步长也是一样,自动扩变成1*1(横向每次走一步,纵向每次走一步)
上面是基本的引用和创建卷积层,接下来是进入的层和输出的层处理数据的具体形况:
for data in dataloader:
imgs, targets = data
output = tudui(imgs)
print(output.shape) # torch.Size([64, 6, 30, 30]) 输出通道变多了,但是经过卷积图片尺寸变小了
print(imgs.shape) # torch.Size([64, 3, 32, 32])