深度学习学习笔记
Day06
机器学习、深度学习——>都是实现AI一种途径方式
机器学习:只要数学好,公式都能推导出来
深度学习:解释性稍微差,例如:分层->6层就是比5层好,不知道为什么,但是实验结果是如此
什么是神经网络
人工神经网络(Artificial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。人脑可以看作是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号

当电信号通过树突进入到细胞核时,会逐渐聚集电荷。达到一定的电位后,细胞就会被激活,通过轴突发出电信号
如何构建神经网络
神经网络是由多个神经元组成,构建神经网络就是再构建神经元,神经元构建说明:

加权求和——>通过sigmoid映射前面的加权求和
这个过程就像,来源不同的树突(树突都会由不同的权重)的信息,进行的加权计算,输入到细胞中做加和,再通过激活函数输出细胞值
使用多个神经元来构建神经网络,相邻层之间的神经元相互连接,并给每一个连接分配一个强度(权重):

文字介绍:
神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中的基本部分是:
1、输入层(Input Layer):即输入x的那一层(如图像、文本、声音等)。每个输入特征对应一个神经元。输入层将数据传递给下一层的神经元
2、输出层(Output Layer):即输出y的那一层。输出层的神经网络的任务(回归,分类等)生成的最终的预测结果
3、隐藏层(Hidden Layers):输入层和输出层之间都是隐藏层,在神经网络中,隐藏层是介于输入层与输出层之间的所有网络层,负责对输入特征进行逐层变换和抽象提取,是实现模型非线性拟合能力的核心部分。
神经网络特点:
同一层的神经网络之间没有连接
第N层的每个神经元和第N-1层的所以神经元相连(这就是full connected的含义),这就是全连接神经网络
全连接神经网络接收的样本数据是二维的,数据再每一层之间需要以二维的形式传递
第N-1层神经元的输出就是第N层神经元的输入
每个连接都有一个权重(w系数和b系数)

加权求和+激活函数——>神经元+神经元——>神经网络
激活函数
激活函数用于对每层的输出数据进行变换,进而为整个网络注入了非线性因素。此时,神经网络就可以拟合各种曲线
1、没有引入非线性因素的网络等价于使用一个线性模型来拟合
2、通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力

常见的激活函数-sigmoid激活函数
激活函数公式:x越大,整体越大

激活函数求导公式:

sigmoid激活函数的函数图像:

1、sigmoid函数可以将任意的输入映射到(0,1)之间,当输入的值大致在<-6或者》6时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分信息。比如:输入100和输出10000经过sigmoid的激活函数几乎都是等于1的,但是输入的数据之间相差100倍的信息就丢失了
2、对应sigmoid函数而言,输入值在[-6,-6]之间输出值才会有明显差异,输入值在[-3,3]之间才会有比较好的效果
3、通过上述导数图像,我们发现倒数数值范围是(0,0.25),当输入<-6或者>6时,sigmoid激活函数图像的导数接近为0,此时网络参数将更新极其缓慢,或者无法更新。
4、一般来说,sigmoid网络在5层之内就会产生梯度消失的现象。而且,该激活函数并不是以0为中心的,所以在实践中这种激活函数使用很少。sigmoid函数一般只用于二分类的输出层
"""
案例:
绘制Tanh函数图像和导数图像
Sigmoid激活函数介绍:
激活函数的目的:
给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,
激活函数的分类:
Sigmoid
ReLU
Tanh
SoftMax
Sigmoid激活函数:
主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)
数据在【-6,6】之间有效果,在【-3,3】之间效果明显
求导后范围在【0,0.25】
Tanh激活函数:
主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)
数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】
求导后范围在【0,1】,较之于Sigmoid收敛速度快
细节:
绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
"""
import plt
import torch
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#1、创建画布和坐标轴
fig,axes=plt.subplots(1,2)
#2、生产数据点
x=torch.linspace(-20,20,1000)
#3、计算上述点,Sigmoid函数处理后的值
y=torch.sigmoid(x)
#4、在第一个子图中绘制sigmoid函数图像
axes[0].plot(x,y)
axes[0].set_title('Sigmoid激活函数图像')
axes[0].grid()
#5、在第二个图上,绘制sigmoid激活函数的导数图像
#5.1 重新生成1000个点
#参1:起始值 参2:结束值 参3:生成个数 参4:是否需要梯度
x=torch.linspace(-20,20,1000,requires_grad=True)
#5.2具体的计算上述1000点。sigmoid函数导数后的值
torch.sigmoid(x).sum().backward()
#5.3绘图
axes[1].plot(x.detach(),x.grad)
axes[1].set_title('Sigmoid激活函数导数图像')
axes[1].grid()
plt.show()
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)