本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。 专栏地址:「深度学习一遍过」必修篇
目录
如果没有非线性激活函数:增加网络层数模型仍然是线性的。

1.1 S 型激活函数
包 括

函数(常被代指

函 数 ) 与

函 数。

,

到

的平滑变换,也叫

函数

,

到

的平滑变换


函数优缺点:

函数优缺点:

之间,过零点,值域比

更大

,修正线性单元

,正区间恒等变换,负区间


,

的平滑版本


函数优缺点:

,以后也无法激活,陷入‘死亡’(

)
解决

函数负区间的零激活问题。 휶 取固定值则为

,为可以学习的参数则为

,为随机值则为

。


函数:有

的所有优点,并且不会有

问 题

:网络的浅层尤其是第一层卷积中,学习到的

会比较大,而到了深层就比较小。这可以理解为网络的浅层学习到了 类似于

的浅层特征,更大的

可以提取到更加稠密的特征,而随着网络深度的增加,特征变得更加的稀疏。

:当作一个正则项,用于增强网络的泛化能力。

,将

函数

的那一端的函数取非线性函数。


函数优点:



函数优缺点:

个神经元

函数,



函数优点:
线性函数与

函数之间的非线性插值函数,无上界有下界、平滑非单调,从数据中学习参数

,可以获得任务相关的激活机制。
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()
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()
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()

,将一个区域的信息压缩成一个值,完成信息的抽象
依据步长和半径不同,可分为有重叠的池化和无重叠的池化。

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

平均池化:选取区域均值(mean pooling),能保留整体数据的特征。
随机池化:按照其概率值大小随机选择,元素被选中的概率与数值大小正相关

的输入,计算分布概率

。

的多项式分布中随机采样位置。
混合池化: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()
增强了信息的辨识度。
作用:去除量纲干扰,保证数据的有效性,稳定数据分布

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

泛化不好的后果:模型性能不稳定,容易受到攻击
所谓正则化,它的目标就是要同时让经验风险和模型复杂度都较小,是对模型的一种规则约束。


即预测结果函数,

即损失函数。

跟模型复杂度相关的单调递增函数,用于约束模型的表达能力。
正则化的分类:



、

表示输入的宽度、长度

、

表示输出特征图的宽度、长度

表示卷积核长和宽的大小

表示滑动窗口步长

表示边界填充(加几圈

)



、

表示输入的宽度、长度

、

表示输出特征图的宽度、长度

表示卷积核长和宽的大小

表示滑动窗口步长

表示边界填充(加几圈

)