一、深度学习的简单概念
深度学习是一种模仿人类大脑的运行方式,从大量数据中学习特征的学习模式。
深度学习是机器学习的子集,它与机器学习的关系如下:
二、感知神经网络
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)实现前向传播方法
代码示例:
import torch
from torch import nnclass 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 xinput_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)打印结果
代码示例:
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)打印结果
代码示例;
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)
五、小结
本节内容我们大致对神经元有了一些基础了解,以及全连接神经网络的基本认识和基本操作。尤其是基本组件的部分,这个部分很重要,要清楚创建全连接网络的基本步骤,后续创建奠定基础。