深度学习--神经网络

一、深度学习的简单概念

深度学习是一种模仿人类大脑的运行方式,从大量数据中学习特征的学习模式。

深度学习是机器学习的子集,它与机器学习的关系如下:

二、感知神经网络

2.1简单定义

神经网络(Neural Networks)是一种模拟人脑神经元网络结构的计算模型,用于处理复杂的模式识别、分类和预测等任务。

神经网络由多个互相连接的节点(即人工神经元)组成。

三、人工神经元

定义:人工神经元是神经网络的基本构建单位。核心功能是接受输入信号,经过加权求和∑和非线性激活函数f处理后,输出结果。

3.1构造人工神经元

人工神经元接受信息输入之后经过加权求和处理,在经过激活函数处理(这个不是非得有的过程),最后将结果输出。

理解图像如下:

3.2组成部分

根据3.1的图像我们可以观察到x,w,b,∑,f,现进行一一解释:

(1)X:输入input,代表输入数据,通常包含n个特征量,即用向量表示。每一个输入值对应一个权重;

(2)W:权重weight,每一条输入数据都有自己的权重,它表示的是该输入对最终结果的重要程度;

(3)b:偏置bias,一个可调参数,类似于截距,帮助调整模型的输出;

(4)∑:加权求和,输入数据*权重之后再求和,最后加上偏置;

(5)f:激活函数,用于将加权求和后的结果转换为输出结果,引入非线性特性,使神经网络能够处理复杂的任务。

3.3数学表示

数学公式:

3.4对比生物神经元

人工神经元和生物神经元对比如下表:

生物神经元 人工神经元
细胞核 节点 (加权求和 + 激活函数)
树突 输入
轴突 带权重的连接
突触 输出

四、深入神经网络(重点)

神经网路是由大量神经单元连接构成的计算模型。每一个神经元的输出作为下一层的输入,最后得到神经网络的输出。

4.1基本结构

(1)输入层:神经网络的第一层,主要是接收输入信息,不进行计算;

(2)隐藏层:位于输入层和输出层之间,进行特征提取和转换。一般有多个层,且每一层一般有多个神经单元;

(3)输出层:神经网络的最后一层,产生最终的结果。

4.2网络构建

神经元:方框

4.3全连接神经网络

定义:每一层的神经元与上一层的所有神经元全连接,一般用于图像分类,文本分类等任务。

根据3.1的图像我们可以观察到x,w,b,∑,f,并且进行了一一解释:

(1)X:输入input,代表输入数据,通常包含n个特征量,即用向量表示。每一个输入值对应一个权重;

(2)W:权重weight,每一条输入数据都有自己的权重,它表示的是该输入对最终结果的重要程度;

(3)b:偏置bias,一个可调参数,类似于截距,帮助调整模型的输出;

(4)∑:加权求和,输入数据*权重之后再求和,最后加上偏置;

(5)f:激活函数,用于将加权求和后的结果转换为输出结果,引入非线性特性,使神经网络能够处理复杂的任务。

现在我们要了解一下这几个参数的数据形式,如何组成的:

(1)X输入:(batch_size,in_features),输入样本条数,输入特征数量;

(2)W权重:(out_features,in_features),输出特征数量,输入特征数量;

(3)b偏置:(out_features),输出特征数量;

(4)Z输出:(batch_size,out_features),输入样本条数,输出特征数量;

4.3.1特点

全连接神经网络的特点

(1)全连接层:层与层之间都是相互连接的,后一个神经元与前一个神经元相连;

(2)权重数量:神经元之间是全连接的,权重数都不相同,权重个数多(权重数量太高容易导致模型复杂度高,计算量大,消耗时间长);

(3)学习能力强:能够学习输入数据的全局特征。

4.3.2计算步骤

(1)数据传输:输入数据经过每一层的计算,逐层传递到输出层;

**(2)激活函数:**每一层的输出通过激活函数处理后再输出;

**(3)损失计算:**在输出层计算预测值与真实值之间的差距,即损失函数值;

**(4)反向传播:**通过backward算法计算每个权重的梯度,并更新权重。

4.3.3基本组件认知

4.3.3.1线性层组件
(1)介绍

线性层:神经网络中常用的层类型,主要用于将输入数据通过线性变换映射到输出空间。

API:

from torch import nn

nn.Linear(in_features,out_features,bias=True)

解释:

in_features:输入特征的数量;

out_features:输出特征的数量;

bias:是否设置偏置项,为True则表示设置偏置,为False则表示不设置偏置。

注意:定义单线性层的时候可以不用写类方法,直接调用nn.Linear就好。

非单线性层时,要注意后一层的输入要与前一层的输出对应,要填一样。

(2)代码实现

有两种实现方式:

a.自定义类,依次完成对初始化、对前向方法的描述;

(1)自定义神经网络类,继承nn.Model;

(2)初始化方法,定义线性层;

(3)实现前向传播方法

代码示例:

python 复制代码
import torch
from torch import nn

class mynn(nn.Module):
    def __init__(self,input_size):
        super().__init__()
    # 定义线性层
        self.fc1 = nn.Linear(input_size,64)
        self.fc2 = nn.Linear(64,32)
        self.fc3 = nn.Linear(32,1)

    def forward(self,x):
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)
        return  x

input_size = 32
model = mynn(input_size)
print(model)

结果:

mynn(

(fc1): Linear(in_features=32, out_features=64, bias=True)

(fc2): Linear(in_features=64, out_features=32, bias=True)

(fc3): Linear(in_features=32, out_features=1, bias=True)

)

b.调用nn.Sequential模型,不用再写对前向传播的逻辑描述。

(1)定义输入特征量;

(2)直接调用API,创建模型;

(3)打印结果

代码示例:

python 复制代码
from torch import nn
in_featrues = 32
model = nn.Sequential(
    nn.Linear(in_featrues,64),
    nn.Linear(64,32),
    nn.Linear(32,1)
)
print(model)

结果:

Sequential(

(0): Linear(in_features=32, out_features=64, bias=True)

(1): Linear(in_features=64, out_features=32, bias=True)

(2): Linear(in_features=32, out_features=1, bias=True)

)

4.3.3.2激活函数组件

定义:主要是运用在隐藏层引入非线性,让神经网络学习更复杂的规律,使网络具备非线性能力,增强其表达能力。

常见的损失函数:

API:import torch.nn.function as F

(1)sigmoid函数:会出现梯度消失问题 sigmoid = F.sigmoid()

(2)tanh函数:会出现梯度消失问题 tanh = F.tanh()

(3)ReLU函数:x小于等于0会出现数据丢失问题 relu = F.ReLU()

(4)LakyReLU函数:解决了数据丢失问题 leakyrelu = F.LakyReLU()

(5)softmax函数:可用来做分类 softmax = F.softmax()

4.3.3.3损失函数组件

定义:损失函数是用来量化预测值与真实值之间的差异。

常用的损失函数主要分为两大类:import torch.nn as nn

(1)回归

均方误差损失MSE Loss:Loss = nn.MSELoss()

平均绝对误差损失 L1 Loss:Loss = nn.L1Loss()

(2)分类

交叉熵损失:Loss = nn.CrossEntropyLoss()---多分类

二元交叉熵损失:Loss = nn.BCEWithLogitsLoss()---二分类

4.3.3.4优化器

定义:是用于更新模型参数以最小化损失函数的核心工具。常常定义在损失criterion后。

常用的优化器:

  • SGD(随机梯度下降)

  • Adagrad(自适应梯度)

  • RMSprop(均方根传播)

  • Adam(自适应矩估计)

核心方法:

梯度清零:zero_grad()

参数更新:step()

4.3.4创建全连接神经网络

我们以求函数的参数为例,介绍全连接神经网络如何解决参数问题。

已知 x = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float)

y = torch.tensor([3, 5, 7, 9, 11], dtype=torch.float)

两个初始数据,现在我们要写一个线性回归函数,求参数解。

步骤:

(1)数据输入;

(2)调用模型;

(3)定义学习率,批次,损失,优化器

(4)循环:前向传播、损失函数、优化器梯度清理、反向传播、优化器参数更新

(5)打印结果

代码示例;

python 复制代码
import torch
from torch import nn,optim
#基本数据输入
x = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float).view(5,1)
y = torch.tensor([3, 5, 7, 9, 11], dtype=torch.float).view(5,1)
#调用模型
model = nn.Linear(1,1)
#定义lr,epochs,criterion,optimizer
lr = 0.02
epochs = 300
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(),lr=lr)
#循环,前向传播、Loss、梯度清零、反向传播、梯度更新
for epoch in range(epochs):
    y_pred = model(x)
    Loss = criterion(y,y_pred)
    optimizer.zero_grad()
    Loss.backward()
    optimizer.step()
#打印结果
print('权重为',model.weight,'偏置为',model.bias)

结果:

权重为 Parameter containing:

tensor([[2.0241]], requires_grad=True) 偏置为 Parameter containing:

tensor([0.9129], requires_grad=True)

五、小结

本节内容我们大致对神经元有了一些基础了解,以及全连接神经网络的基本认识和基本操作。尤其是基本组件的部分,这个部分很重要,要清楚创建全连接网络的基本步骤,后续创建奠定基础。