深度学习 Review【一】线性回归、Softmax、感知机、卷积

课程地址

一、线性回归

线性模型:y = ax + b
在这里插入图片描述
单层神经网络(输出层不看做是一层)
在这里插入图片描述

1 损失函数

比较真实值和预估值
以下几种损失函数比较

  • 0-1损失函数(zero-one loss)

  • 绝对值损失函数

  • log对数损失函数
    基于信息论:一个不太可能的事件发生了的话,要比一个非常可能发生的事件提供更多的信息。
    在这里插入图片描述

  • 平方损失函数

  • 指数损失函数(exponential loss)

  • Hinge 损失函数

  • 感知损失(perceptron loss)函数

  • 交叉熵损失函数 (Cross-entropy loss function)
    相对熵:衡量P和Q两个分布的差异
    将相对熵最小化
    在这里插入图片描述

语音的几种损失函数

2 参数学习

选取不同的w和b,根据输入X,计算y的损失
最小化损失

3 梯度下降 GD

在这里插入图片描述
学习率:每次计算loss后调整的步长

小批量随机梯度下降 SGD:通过随机采样b个样本计算近似损失,以减少计算梯度求导的消耗
这里的b 就是batchsize,并行进入神经网络的样本数量

3 torch实现

# `nn` 是神经网络的缩写
from torch import nn
#Sequential是存放网络的list
#全连接层(单层网络)输入维度是2 输出为1
net = nn.Sequential(nn.Linear(2, 1))
#初始化网络参数
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
#损失函数 均方误差
loss = nn.MSELoss()
#定义优化算法 小批量随机梯度下降 传入net的参数w和b 指定学习率lr
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
#训练
num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y)
        trainer.zero_grad() #梯度清零以计算backward
        l.backward() 
        trainer.step() #更新模型
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)

二、Softmax分类

预测离散的类型,通常有多个输出,输出 i 是预测为第 i 类的置信度
在这里插入图片描述
对每个类别进行一位有效编码(One-Hot),编码后为向量y作为输入,每个类别的置信度分数(即每个类别的概率)作为输出(输出向量的每个元素非负,元素和为1)
使用均方损失函数训练

1 损失函数

橙色为导数,绿色为最大似然函数,蓝色为损失函数
在这里插入图片描述
随着预测值和真实值相差不同,进行不同的优化
在这里插入图片描述
不管预测值和真实值相差多远,都能稳定优化
在这里插入图片描述
在预测值和真实值相差不大时,减少优化

2 torch实现

import torch
from torch import nn
from d2l import torch as d2l

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# PyTorch不会隐式地调整输入的形状 在线性层前定义展平层(flatten)调整网络输入的形状
#输入为784 输出为10
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
#初始化为均值为0方差为0.01的随机值
def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);

loss = nn.CrossEntropyLoss()

trainer = torch.optim.SGD(net.parameters(), lr=0.1)
#训练模型
num_epochs = 10
def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  
    animator = Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0.3, 0.9],
                        legend=['train loss', 'train acc', 'test acc'])
    for epoch in range(num_epochs):
        train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
        test_acc = evaluate_accuracy(net, test_iter)
        animator.add(epoch + 1, train_metrics + (test_acc,))
    train_loss, train_acc = train_metrics
    assert train_loss < 0.5, train_loss
    assert train_acc <= 1 and train_acc > 0.7, train_acc
    assert test_acc <= 1 and test_acc > 0.7, test_acc
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

三、感知机 Perceptron

1 二分类的感知机

二分类问题,x为给定输入,w为权重,b为偏移
在这里插入图片描述
线性回归输出的是实数,softmax回归输出的是概率,这里只输出0和1(或者-1和1)是二分类问题
在这里插入图片描述
y为实际值,wx+b为预测值,以下所有wx为w和x的混合积

w=b=0;
while(所有分类正确): 
	if (y*[wx+b]<=0) w+=y*x,b+=y;

等价于使用batchsize为1的梯度下降,其中loss=max(0,-y*wx)
根据收敛定理,对于正确的数据一定可以得到一条直线,将两类样本点分开
局限:普通感知机不能拟合XOR函数,必须使用多层感知机

2 多层感知机MLP

两个分类器做乘法(用与门和或门实现与或门)
在这里插入图片描述

单隐藏层-单分类

Hidden-layer隐藏层是 mxn 的矩阵
在这里插入图片描述
使用线性激活函数会导致多个连接层摞在一起,变成单层感知机;应当使用Sigmoid、Tanh、ReLU

多隐藏层多分类

在这里插入图片描述
结果 y = softmax (o)

在这里插入图片描述
每次计算出隐藏层结果之前都要使用非线性激活函数,最后一层可以直接通过softmax得到y

3 torch实现

import torch
from torch import nn
from d2l import torch as d2l

net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))
# 将三维flatten成二维
def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()#交叉熵损失
trainer = torch.optim.SGD(net.parameters(), lr=lr)

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

四、卷积层

1 卷积操作

卷积是具有平移不变性(权重共享)和局部性的全连接
以下以二维卷积为例
二维交叉相关:w为权重,v为重新构建索引后的w
在这里插入图片描述
平移不变性:换不同的位置 卷积的计算方式不改变
在这里插入图片描述

局部性:卷积核在局部进行运算即可
在这里插入图片描述

2 卷积层

在这里插入图片描述
填充:通过填充保证卷积后矩阵尺寸不会太小
在这里插入图片描述

步长(步幅):矩阵太大,跳过一些以控制输出
在这里插入图片描述

3 gif

动图地址

正卷积 Convolution

No padding, no stridesArbitrary padding, no stridesHalf padding, no stridesFull padding, no strides
No padding, stridesPadding, stridesPadding, strides (odd)

转置卷积 Transposed Convolution

No padding, no strides, transposedArbitrary padding, no strides, transposedHalf padding, no strides, transposedFull padding, no strides, transposed
No padding, strides, transposedPadding, strides, transposedPadding, strides, transposed (odd)

空洞卷积 Dilated convolution
在这里插入图片描述

4 多输入输出通道channls

意义

多个输出out通道可以识别特定的模式,Eg:RGB图片三通道可以按照颜色分别识别
多个输入in通道可以识别并组合输入中的模式,Eg:在识别猫的图片时,分别识别出猫的脚和身体,然后组合

实现

多输入in:在每个通道各自卷积后加权求和(降维)为一个通道
多输出out:使用多个卷积核,每个卷积核生成一个输出通道

5 1x1的卷积层

不识别空间模式,只是融合不同通道的信息,对不同的通道进行加权求和
Eg:语音分离
在这里插入图片描述
将input拉成一维的向量就变成全连接层

五、ConvTranspoes 转置卷积

增大输入的高宽,一般用于恢复形状,但输出的信息比较抽象,不能被人直接分辨,也用于上采样。
输入中的每一个值与卷积核的每一个值做乘法,把重合的部分相加。
padding是去掉输出的外层。
在这里插入图片描述

六、池化层(汇聚层) Pooling

卷积层做边缘检测时,对边缘太敏感,检测时往往会不准确

最大池化:在滑动窗口时,返回窗口中的最大值
平均池化:返回窗口中各元素的均值

特点

超参数有窗口大小、填充和步幅
没有可学习的参数
输出通道数=输入通道数
在每个输入通道都用池化层来分别获得输出,不进行多通道融合

torch实现

2x3大小的窗口

pool2d = nn.MaxPool2d((2, 3), padding=(1, 1), stride=(2, 3))
pool2d(X)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值