11.22,11.23学习日志

(二)神经网络

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中有些图形相关的神经网络模型可以直接使用

  • 40
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值