「深度学习一遍过」必修12:激活函数、线性层、卷积、池化、归一化、泛化、正则化、卷积反卷积结果计算公式

本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。
专栏地址:「深度学习一遍过」必修篇 

目录

1 激活函数

​1.1 S 型激活函数

1.2 ReLU 激活函数

1.3 MaxOut激活函数

2 线性层

3 卷积

4 池化

5 归一化

6 泛化

7 正则化 

8  卷积神经网络卷积结果计算公式

9 卷积神经网络反卷积结果计算公式


1 激活函数

如果没有非线性激活函数:增加网络层数模型仍然是线性的。 

1.1 S 型激活函数

包 括 Logistic 函数(常被代指 S i g m o i d 函 数 ) 与 Ta n h 函 数。

Sigmoid(x)=\frac{1}{1+e^{-x}}01 的平滑变换,也叫  Logistic 函数
Tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=2Sigmoid(2x)-1-11 的平滑变换

Sigmoid 函数优缺点:
  • 优点:输出0~1,映射平滑适合预测概率
  • 缺点:不过零点,没有负值激活,影响梯度下降效率;饱和区梯度消失问题!
Tanh 函数优缺点:
  • 优点:映射到 (-1,1) 之间,过零点,值域比 sigmoid 更大
  • 缺点:饱和区梯度消失!

1.2 ReLU 激活函数

Rectified\: \: Linear\: \: Unit,修正线性单元 

ReLU(x)=max{0,x},正区间恒等变换,负区间 0

Softplux(x)=log(1+exp(x))ReLU 的平滑版本

ReLU 函数优缺点:
  • 优点:计算简单,导数恒定;拥有稀疏性,符合人脑的神经元活跃特性
  • 缺点:非零中心化,没有负激活值,影响梯度下降效率;如果一次不恰当的参数更新后,所有数据都不能使某个神经元激活,则其对应的参数梯度为 0,以后也无法激活,陷入‘死亡’(Dead\: \: ReLU)

改进

解决  ReLU 函数负区间的零激活问题。 取固定值则为  LReLU ,为可以学习的参数则为  PreLU ,为随机值则为 RreLU

  • LReLU 函数:有 ReLU 的所有优点,并且不会有Dead\: \: ReLU问 题
  • PReLU:网络的浅层尤其是第一层卷积中,学习到的 \alpha 会比较大,而到了深层就比较小。这可以理解为网络的浅层学习到了 类似于 Gabor 的浅层特征,更大的 \alpha 可以提取到更加稠密的特征,而随着网络深度的增加,特征变得更加的稀疏。
  • RReLU:当作一个正则项,用于增强网络的泛化能力。

,将 LReLU 函数 x<0 的那一端的函数取非线性函数。

ELU 函数优点:
  • 优点:被证实有较高的噪声鲁棒性,能够使得神经元的平均激活均值趋近为0。
  • 缺点:由于需要计算指数,计算量较大。

1.3 MaxOut激活函数

Maxout 函数优缺点:
  • 优点:整体学习输入到输出的非线性映射关系, 拟合能力非常强
  • 缺点:计算量增加,增加了 k-1 个神经元

Swish 函数,swish(x)=x \cdot sigmoid(\beta x)

Swish 函数优点:
线性函数与 ReLU 函数之间的非线性插值函数,无上界有下界、平滑非单调,从数据中学习参数 \beta,可以获得任务相关的激活机制。
import torchvision
from torch import nn
from torch.nn import Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10('./dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64)

class customize_model(nn.Module):
    def __init__(self):
        super(customize_model, self).__init__()
        self.sigmoid1 = Sigmoid()

    def forward(self, input):
        output = self.sigmoid1(input)
        return output

model = customize_model()

writer = SummaryWriter('./logs')
step = 0

for data in test_loader:
    imgs, targets = data
    writer.add_images('input', imgs, step)
    output = model(imgs)
    writer.add_images('output', output, step)
    step = step + 1

writer.close()

2 线性层

import torchvision
from torch import nn
import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('./dataset', train=False, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)

class customize_model(nn.Module):
    def __init__(self):
        super(customize_model, self).__init__()
        self.Linear1 = nn.Linear(6144*32, 10)

    def forward(self, x):
        x = self.Linear1(x)
        return x

model = customize_model()

writer = SummaryWriter('./logs')
step = 0

for data in dataloader:
    imgs, targets = data
    print('原图shape:', imgs.shape)
    writer.add_images('input', imgs, step)
    # 法1°
    output1 = torch.reshape(imgs, (1, 1, 1, -1))
    # 法2°
    output2 = torch.flatten(imgs)
    output1 = model(output1)
    output2 = model(output2)
    print('(法1°)线性层shape:',output1.shape)
    print('(法2°)线性层shape:', output2.shape)
    print('*' * 50)
    step = step + 1

writer.close()

3 卷积

import torchvision
from torch import nn
import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('./dataset', train=False, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)

class customize_model(nn.Module):
    def __init__(self):
        super(customize_model, self).__init__()
        self.conv1 = nn.Conv2d(3,6,3,1,0)

    def forward(self, x):
        x = self.conv1(x)
        return x

model = customize_model()

writer = SummaryWriter('./logs')
step = 0

for data in dataloader:
    imgs, targets = data
    output = model(imgs)
    writer.add_images('input', imgs, step)
    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images('output', output, step)
    step = step + 1

writer.close()

4 池化

pooling,将一个区域的信息压缩成一个值,完成信息的抽象

依据步长和半径不同,可分为有重叠的池化和无重叠的池化。

最大池化:选取区域最大值(max pooling),能更好保留纹理特征。

平均池化:选取区域均值(mean pooling),能保留整体数据的特征。 

随机池化:按照其概率值大小随机选择,元素被选中的概率与数值大小正相关

  • 归一化 pooling 的输入,计算分布概率 p
  • 从基于 p 的多项式分布中随机采样位置。

混合池化:max/average pooling中进行随机选择;增强泛化能力,类似于dropout机制

import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10('./dataset', train=False, download=True, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64)

class customize_model(nn.Module):
    def __init__(self):
        super(customize_model, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)

    def forward(self, input):
        output = self.maxpool1(input)
        return output

model = customize_model()

writer = SummaryWriter('dataloader')
step = 0

for data in test_loader:
    imgs, targets = data
    writer.add_images('input', imgs, step)
    output = model(imgs)
    writer.add_images('output', output, step)
    step = step + 1

writer.close()

5 归一化

增强了信息的辨识度。

  • 线性归一化
  • 零均值归一化/Z-score标准化
  • 直方图均衡化

作用:去除量纲干扰,保证数据的有效性,稳定数据分布

6 泛化

模型不仅在训练集表现良好,在未知的数据(测试集)也表现良好,即具有良好的泛化能力。

泛化不好的后果:模型性能不稳定,容易受到攻击 

7 正则化 

所谓正则化,它的目标就是要同时让经验风险和模型复杂度都较小,是对模型的一种规则约束。

  • f 即预测结果函数,V 即损失函数。
  • R(f) 跟模型复杂度相关的单调递增函数,用于约束模型的表达能力。

正则化的分类

  • 显式正则化(经验正则化,参数正则化)
    网络结构,损失函数的修改,模型使用方法的调整
  • 隐式正则化
    没有直接对模型进行正则化约束,但间接获取更好的泛化能力

8  卷积神经网络卷积结果计算公式

  • 长度:H_{2}=\frac{H_{1}-F_{H}+2P}{S}+1
  • 宽度:W_{2}=\frac{W_{1}-F_{W}+2P}{S}+1
     
  • W_{1}H_{1} 表示输入的宽度、长度 
  • W_{2}H_{2} 表示输出特征图的宽度、长度
  • F 表示卷积核长和宽的大小
  • S 表示滑动窗口步长 
  • P 表示边界填充(加几圈 0

9 卷积神经网络反卷积结果计算公式

  • 长度:H_{2}=(H_{1}-1)\times S+F_{H}-2P
  • 宽度:W_{2}=(W_{1}-1)\times S+F_{W}-2P
     
  • W_{1}H_{1} 表示输入的宽度、长度 
  • W_{2}H_{2} 表示输出特征图的宽度、长度
  • F 表示卷积核长和宽的大小
  • S 表示滑动窗口步长 
  • P 表示边界填充(加几圈 0

欢迎大家交流评论,一起学习



希望本文能帮助您解决您在这方面遇到的问题



感谢阅读
END

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣仔!最靓的仔!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值