(二)神经网络
3.池化层
MaxPool()中参数含义:
-
kernel_size
(核大小): 池化操作使用的窗口大小(核的大小)。这是一个整数或元组,指定了池化窗口的高度和宽度。例如,kernel_size=3
表示使用一个 3x3 的窗口进行池化。 -
stride
(步幅): 池化窗口在输入上滑动的步幅。它是一个整数或元组,表示在进行池化操作时窗口的滑动间隔。默认值是kernel_size
,即窗口不重叠。 -
padding
(填充): 在输入的边界上添加零值的层数。这是一个整数或元组,指定在输入的高度和宽度的两侧添加零值的数量。默认值是 0,表示不使用填充。 -
dilation
(膨胀): 窗口中元素之间的间距。这是一个整数或元组,用于指定在池化窗口中元素之间的间隔。默认值是 1,表示没有膨胀。 -
ceil_mode
: 一个布尔值,用于确定在计算输出大小时是否使用“ceil”模式。如果ceil_mode=True
,则使用向上取整;如果ceil_mode=False
,则使用向下取整。 -
意思是到数据末尾不够池化层的宽度或高度的数据是否保留
import torch from torch import nn from torch.nn import MaxPool2d 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]],dtype=torch.float32) #通过显式指定 dtype=torch.float32,你确保了输入张量的数据类型是浮点数, # 从而避免了模型输入和参数之间的类型不匹配错误。 input = torch.reshape(input,(-1,1,5,5)) class Tudui(nn.Module): def __init__(self): super(Tudui,self).__init__() self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True) def forward(self,input): output = self.maxpool1(input) return output tudui = Tudui() output = tudui(input) print(output)
最大池化是取池化部分的最大值,目的是为了保证数据的情况下减小数据量,例子是1080p的视频和720p的视频
图像的最大池化:
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("../data",train=False,download=True,
transform=torchvision.transforms.ToTensor())
#在 torchvision.datasets.CIFAR10 中,transform 参数用于指定对加载的图像进行的转换操作。
dataloader = DataLoader(dataset,batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)
def forward(self,input):
output = self.maxpool1(input)
return output
tudui = Tudui()
writer = SummaryWriter("logs_maxpool")
step = 0
for data in dataloader:
imgs,targets=data
writer.add_images("input",imgs,step)
output = tudui(imgs)
writer.add_images("output",output,step)
step+=1
writer.close()
-
卷积是特征提取: 卷积操作通过学习和应用卷积核提取输入数据的特征。
-
池化是降维和减少计算: 池化操作通过取局部区域的最大值或平均值来降低特征图的维度,减少计算量
4.非线性激活
1>ReLU:当输入为正数时,ReLU 输出该正数;当输入为负数时,ReLU 输出零。这意味着只有正数部分被激活,负数部分被抑制。这有助于神经网络的稀疏激活性,使得只有激活的神经元参与信息传递,从而提高网络的表达能力。
以ReLU为例,ReLU中inplace参数的含义:
例一:input = -1
ReLU(input,inplace = True)
input=0
例二:
input = -1
output=ReLU(input,inplace = False)
input=-1
output=0
inplace作用就是传递的时候会不会替代掉原来的值,一般情况下默认是False这样可以对原始数据进行保留
import torch
from torch import nn
from torch.nn import ReLU
input = torch.tensor([[1,-0.5],
[-1,3]])
input = torch.reshape(input,(-1,1,2,2))
print(input.shape)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.relu1 = ReLU()
def forward(self,input):
output=self.relu1(input)
return output
tudui = Tudui()
output = tudui.relu1(input)
print(output)
#torch.Size([1, 1, 2, 2])
#tensor([[[[1., 0.],
# [0., 3.]]]])
Sigmoid()激活函数:当 Sigmoid 函数的输出接近 0 时,表示输入的对应事件发生的概率非常低;当输出接近 1 时,表示事件发生的概率非常高。在二分类问题中,通常将输出大于 0.5 的样本判定为正类别,小于 0.5 的样本判定为负类别。在深度学习中,Sigmoid 主要用于二分类问题的输出层。例如,在图像分类中,当模型需要判断图像是猫还是狗时,输出层通常使用 Sigmoid 函数,模型的输出可以理解为图像属于猫类别的概率。
import torch
import torchvision.datasets
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("../data",train = False,download = True,
transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.relu1 = ReLU()
self.sigmoid1 = Sigmoid()
def forward(self,input):
hidden_output = self.relu1(input)
output=self.sigmoid1(input)
return output
tudui = Tudui()
writer = SummaryWriter("logs_relu")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input",imgs,global_step=step)
output = tudui(imgs)
writer.add_images("output",output,step)
step += 1
writer.close()
5.线性层及其他层介绍
nn.Linear
是 PyTorch 中用于定义线性变换的模块。它表示一个全连接层,将输入特征线性映射到输出特征。
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader
dataset = torchvision.datasets.CIFAR10("../data",train=False,download=True,
transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.linear1 = Linear(196608,10)
def forward(self,input):
output = self.linear1(input)
return output
tudui = Tudui()
for data in dataloader:
imgs,targets = data
print(imgs.shape)
output = torch.reshape(imgs,(1,1,1,-1))#可以指定尺寸进行变换
#output = torch.flatten(imgs)就是直接把多维的转变成一行
print(output.shape)
output = tudui(output)
print(output.shape)
in_features和out_features
6.练习CIFAR10 model结构
Sequential是可以让代码更简洁
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.model1 = Sequential(
Conv2d(3,32,5,padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x = self.model1(x)
return x
tudui = Tudui()
print(tudui)
input = torch.ones((64,3,32,32))
output = tudui(input)
print(output)
writer = SummaryWriter("../logs_seq")
writer.add_graph(tudui,input)
writer.close()
可以在tensorboard上看到其网络模型
官网上torchvision.model中有些图形相关的神经网络模型可以直接使用