在前面的数学原理篇中,已经提到了各种深度学习的数学知识基本框架,那么从这篇文章开始,我将和大家一起走进深度学习的大门(部分图片和描述取自其他文章)。

目录

一、首先我们需要知道什么是深度学习?

二、了解神经元与感知机

​三、全连接神经网络

四、神经网络框架(前向传播)实例编写

总结

一、首先我们需要知道什么是深度学习?

深度学习是机器学习领域中的一个新的研究方向,模仿生人类神经网络,学习样本数据的内在规律的一种方法,神经网络属于监督学习的过程,可以处理:回归、分类。

机器学习:数据输入——人工特征提取——分类——输出

深度学习:数据输入——神经网络特征提取和分类——输出

作用:图像识别:物体,场景,人脸识别,跟踪

自然语言处理(NLP):机器翻译,文本识别

语音技术:语言识别

主要框架:Pytorch(简单)、Tensorflow(适用工业界部署)、Mindspore(华为AI框架,脱敏)

二、了解神经元与感知机

关于神经元的介绍我就不过多赘述了,大家只需要知道感知机模型就是一个简单的人工神经网络

(这里看不懂别太纠结,后面实例将加深理解)

x(输入)*w(权重w,b)——>Σwx+b求和——>output(输出)

对感知机进行数学建模

#通常我们把(w,b,统一称为为W权重)

ΣW*X+b(矩阵相乘求和)(Σ求和,W权重,b偏置,x输入)

在上述的过程中感知机的输入为线性,输出也为线性,那么怎么用感知机解决非线性问题呢?

感知机模型解决线性不可分问题:感知机模型+激活函数(把线性变非线性)

说简单点就是把感知机的输出,输入到激活函数中,使其变成非线性。

其实感知机模型的完整图是这样的:

我们来看看激活函数的图像大家就明白了:

激活函数的特点:

Sigmoid:深层神经网络中极易造成梯度消失,使用于二分类问题。

Softmax:多分类问题,全概率,所有概率值加起来等于1

ReLU:不存在梯度消失(不饱和函数),丢掉不重要的特征(稀疏性),运算简单,收敛速度快,更符合生物神经网络激活机制,常用于训练过程激活函数。

为什么要使用激活函数:大家可以想像火车站排队的栏杆,激活函数就是这样不断的约束引导输入走向我们想要的目标,这才是它的底层含义,而它的用途就是把线性问题变成非线性,以及把输出映射到概率分布,方便我们进行分类。

关于激活函数详细请阅读我的文章:

实例:

(观察左边的函数)g(x)为激活函数sigoid

#在计算机套件上运行Calculator Suite - GeoGebra

实现MLP代码:

## 感知机模型实例
import numpy as np
import matplotlib.pyplot as plt
"""
#感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型
1.初始话权重向量w0,可以设置为随机数等。但是要位于【-1,1】之间。
2. 指定学习率lr(步长,learning rate),介于(0,1)间。注意学习率过小,收敛速度较慢。但是如果较大,容易在达到期望输出时产生波动。
3. 开始以下迭代3.1  计算学习信号 R = D(期望输出)-F(W'X)(训练输出)3.2  计算权重调整 deltaW = lr*(D-R')*X3.3 更新权重 W0 = W0+deltaW
4.不断训练直到训练输出==期望输出,或者正确率达到某个条件。
"""
def Mlp(X, Y, weight, EPOCH, lr):# 在训练次数内,进行以下迭代for epoch in range(EPOCH):# 计算当前权重下的线性加权结果out=X.dot(weight)# 将当前线性加权结果进行sigmody= np.sign(out)#梯度下降# 根据实际输出与期望输出的差值调整权重delatW = lr * (Y - y.T).dot(X)# 调整权重weight = weight + delatWprint(y)# 判断训练输出结果和期望输出结果是否相同if (Y == y).all():breakreturn weightif __name__ == "__main__":# 设置训练集X = np.array([[1, 4, 3], [1, 5, 4], [1, 4, 5], [1, 1, 1], [1, 2, 1], [1, 3, 2]])Y = np.array([1, 1, 1, -1, -1, -1])# 设置训练次数和学习率,初始权重([-1,1])EPOCH= 100lr = 0.1np.random.seed(4)weight = 2 * (np.random.random(3) - 0.5)# 开始训练W = Mlp(X, Y, weight, EPOCH, lr)# 输出分界线并绘图x1 = np.array([1, 6])x2 = (-W[1] / W[2]) * x1 - W[0] / W[2]plt.plot(x1, x2)plt.plot(X[:, 1][0:3], X[:, 2][0:3], 'ro')plt.plot(X[:, 1][3:6], X[:, 2][3:6], 'b*')plt.show()

 三、全连接神经网络

又称深度神经网络,多层感知机(MLP)结构,前面讲到的感知机是它的基础,就像人类的反射弧是由很多个神经元构成的,全连接神经网络也由很多个感知机构成。

全连接神经网络结构:

大家可以把每一个节点点想象成一个感知机,每个结点和下一层所有节点都有运算关系,这就是名称中‘全连接’的含义,上图的中间层也称为隐藏层,全连接神经网络通常有多个隐藏层,增加隐藏层可以更好分离数据的特征,但过多的隐藏层也会增加训练时间以及产生过拟合。

全连接神经网络训练分为前向传播、后向传播两个过程,前向传播数据沿输入到输出后计算损失函数值,后向传播则是一个优化过程,利用梯度下降法减小前向传播产生的损失函数值,从而优化、更新参数。

拿这个两层全连接神经网络举例,层间激活函数为RuLE,最后一层的激活函数为SoftMax。输入数据是一个3维向量,隐藏层有4个结点,意味着通过线性映射将3维向量映射为一个4维向量,最后再变为一个3维向量输出,这里需注意:softmax一般用于多分类任务中,将输出总和归一化(做多分类输出层的输出函数),从而成为预测类别的概率分布,通常之后可以接交叉熵损失函数。

我们现在将输出结果输入到了sofmax激活函数中得到了样本的概率分布,那么如何度量神经网络分类器预测分布和真实分布之间的距离呢? 

这里我们先引入了一个方法One-hot一位有效编码。类别的数量就是one-hot向量的维度,比如将三类编码为:[0,0,1]、[0,1,0]、[1,0,0]。——这里需要注意我们是对真实值进行编码,不是预测值。

我们把样本分布转化为one-hot编码,将分类值映射到整数就可以很好的表达类别了。这里的[1,0,0]就表示三类中的bird。

度量分类器预测分布和真实分布之间的误差:用交叉熵损失函数

(上一篇文章有详细讲解:                      这里就是用来衡量两个随机分布差异(作为误差))。

以上就是前向传播(fp传播)以及计算损失的过程,后面我们将逐步实现。

四、神经网络框架(前向传播)实例编写

下面我们用torch编写一个简单的(隐藏层3+输出层1)4层全连接神经网络框架

import torch#导入pytorch库
from torch import nn#神经网络模块包括卷积层、池化层以及激活函等
#封装一个全连接类
class Net_v1(nn.Module):#首先Net_v1继承自nn.Module,#初始化函数(构造函数)def __init__(self):#通过super(python中的超类)完成父类的初始化。super().__init__()#实现全连接神经网络的定义,sequeential看成神经网络的容器self.layer=nn.Sequential(#输入层:img.shapenn.Linear(1200*675*3,512),#这里的1200*675*3为图片的尺寸加层数(h,w,rgb)#隐藏层(每一层的输入是上一层的输出nn.Linear(512,128),nn.Linear(128, 64),nn.Linear(64, 32),#输出层nn.Linear(32,10),#由于是10分类所以最后一层为10#激活函数# 图片的输入是NV结构,N-批次(几张图片),V-体积(w*h*c)# 1200*675*3,激活v,dim=1,第二个维度(0,1)取图片的体积nn.Softmax(dim=1))#前向计算(前向传播),拿到计算结果def forward(self,x):return self.layer(x)
if __name__ == '__main__':net_v1=Net_v1()x = torch.randn(1, 1200 * 675 * 3)  # 传随机数测试(NV结构)y = net_v1.forward(x)#前向传播print(y.shape)#前向传播输出形状print(y,torch.sum(y))#前向传播输出的tensor(概率分布),sum=1

输出:

可以看出我们的输出为10个概率分布对应于是分类。通过以上的代码我们就完成了神经网络前向传框架的构建,接下来就是损失函数和反向传播的部分了(持续更新)。

五、MNIST数据集处理

在上述的前向传播的框架中,神经网络的输入是一张1200*675*3的图片输出是1*10(10类)的概率分布,那么我们如何将大量的数据集作为输入丢进神经网络里面呢?我们需要对数据集进行处理,后续我会以MNIST数据集(数据集分为训练集(train)和验证集(test))为例,为大家讲解数据集处理的相关操作。

总结

在以上的学习中,我们明白了全连接神经网络的输入(数据集TRAIN)和神经网络特征提取和分类的基本流程、最后的输出(概率分布),并编写了前向传播所需的网络框架,后面我们将学习构建损失函数和如何利用损失函数进行反向传播更新权重,另外关于文中提到了方法里面的简单的数学知识,大家可以看一下我之前的两篇文章,由于本人现学现卖,不足之处还望指正。

深度学习初级阶段——全连接神经网络(MLP、FNN)相关推荐

  1. 【计算机视觉与深度学习】全连接神经网络(二)

    计算机视觉与深度学习系列博客传送门 [计算机视觉与深度学习]线性分类器(一) [计算机视觉与深度学习]线性分类器(二) [计算机视觉与深度学习]全连接神经网络(一) 目录 激活函数再探讨 梯度下降算法 ...

  2. 深度学习原理-----全连接神经网络

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

  3. 【计算机视觉与深度学习】全连接神经网络(一)

    计算机视觉与深度学习系列博客传送门 [计算机视觉与深度学习]线性分类器(一) [计算机视觉与深度学习]线性分类器(二) 目录 从线性分类器到全连接神经网络 全连接神经网络的权值 全连接神经网络与线性不 ...

  4. 【简易笔记】计算机视觉与深度学习(全连接神经网络、卷积) EP2

    本篇承接上文:计算机视觉与深度学习 EP1 本篇主要内容: 全连接神经网络(P4 - P6) 卷积与卷积神经网络(P7 - P8) 经典网络分析(P9 - P10) 可视化(P12 - P13) 主要 ...

  5. 全连接神经网络 MLP

    全连接神经网络–MLP 全连接神经网络,又叫多层感知机,是一种连接方式较为简单的人工神经网络,是前馈神经网络的一种. MLP的神经网络架构 网络架构为: 通过输入层,隐藏层,输出层三个网络层组成,其中 ...

  6. 深度学习框架 TensorFlow:张量、自动求导机制、tf.keras模块(Model、layers、losses、optimizer、metrics)、多层感知机(即多层全连接神经网络 MLP)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 安装 TensorFlow2.CUDA10.cuDNN7.6. ...

  7. 计算机视觉(四)全连接神经网络MLP

    目录 多层感知器/全连接神经网络 一.全连接神经网络绘制 二.激活函数 常用的激活函数 三.网络结构设计 四.损失函数 softmax 交叉熵损失 对比多类支持向量机损失 五.优化算法 计算图与反向传 ...

  8. Pytorch:全连接神经网络-MLP回归

    Pytorch: 全连接神经网络-解决 Boston 房价回归问题 Copyright: Jingmin Wei, Pattern Recognition and Intelligent System ...

  9. 【深度学习】全连接层or卷积层

    对于图像处理任务而言,在经过一连串的卷积.池化操作后,最后要接一个全连接层来对提取到的特征进行分类或者回归. 一般前面带卷积操作的被称之为卷积基,后面跟一层或多层全连接层. 卷积神经网络中流动的是3维 ...

最新文章

  1. 免费公开课 | 基于定制数据流技术的AI计算加速
  2. android studio 将文件打包成jar文件
  3. 把知识变成图谱一共需要花几步?89页全网最全清华知识图谱报告-学习笔记
  4. php 服务定位,服务定位器(Service Locator)
  5. 使用TensorFlow.js的AI聊天机器人二:训练Trivia Expert AI
  6. C++面向对象编程之类的使用(从struct到class的进阶)
  7. fastadmin model关联模型 关联查询问题
  8. 《Applying Deep Learning to Answer Selection: A Study And an Open Task》文章理解小结
  9. DPDK初始化分析(四)
  10. iOS 网络https传输
  11. qml实现高德地图(2)
  12. 树莓派4B配置远程桌面软件 Teamviewer(解决报错)
  13. 台式计算机搜索不到无线信号,win7电脑搜不到无线信号怎么办_win7找不到无线网络怎么解决-win7之家...
  14. java 判断时间24小时_Java 判断时间是否超过24小时
  15. 使用ShareSDK实现QQ登录和分享操作
  16. Vue脚手架的三种安装方式
  17. Hololens2仿真器 模拟手势输入
  18. 【Python】条件变量、信号变量、事件
  19. Java后端程序员3年工作经验总结(一)
  20. 推荐/广告算法社招生存指南(浅梦)

热门文章

  1. S905电视盒数码视讯Q5/Q7刷Armbian并部署Klipper甜糖(一初识S905)
  2. 小度会是下一个苹果吗?
  3. 达梦数据库DCA认证培训总结
  4. DEVC++关于Windows-socket网络编程,需首先链接lws2_32库
  5. NodeJs实战-待办列表(5)-使用MySQL存储待办事项
  6. BIOS定时开机 ,关机的八个方法
  7. 小程序截取字符串后三位
  8. iOS UILabel设置行间距和字间距并计算高度
  9. jQuery 利用键盘上下键移动表格内容
  10. 闲聊Oracle Exadata与Hadoop