深度学习-神经网络:DNN(Deep Neural Networks=Fully Connected Neural Net==MLP,深度神经网络=全连接神经网络=多层感知器)

一、神经网络的介绍

1. 人工神经网络的概念

人工神经网络(英语:Artificial Neural Network,ANN),简称神经网络(Neural Network,NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型,用于对函数进行估计或近似。

和其他机器学习方法一样,神经网络已经被用于解决各种各样的问题,例如机器视觉和语音识别。这些问题都是很难被传统基于规则的编程所解决的。

2. 神经元的概念

在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。

1943 年,McCulloch 和 Pitts 将上述情形抽象为上图所示的简单模型,这就是一直沿用至今的 M-P 神经元模型。把许多这样的神经元按一定的层次结构连接起来,就得到了神经网络。

一个简单的神经元如下图所示,

在这里插入图片描述
其中:

  1. a 1 , a 2 … a n a_1,a_2\dots a_n a1,a2an 为各个输入的分量
  2. w 1 , w 2 ⋯ w n w_1,w_2 \cdots w_n w1,w2wn 为各个输入分量对应的权重参数
  3. b b b 为偏置
  4. f f f激活函数,常见的激活函数有tanh,sigmoid,relu
  5. t t t 为神经元的输出

使用数学公式表示就是:
t = f ( W T A + b ) t = f(W^TA+b) t=f(WTA+b)
可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果

3. 单层神经网络

是最基本的神经元网络形式,由有限个神经元构成,所有神经元的输入向量都是同一个向量。由于每一个神经元都会产生一个标量结果,所以单层神经元的输出是一个向量,向量的维数等于神经元的数目。

示意图如下:
在这里插入图片描述

4. 感知机(多个输入,一个输出==>设置一个阈值可用于二分类)

感知机由两层神经网络组成,输入层接收外界输入信号后传递给输出层(输出+1正例,-1反例),输出层是 M-P 神经元

在这里插入图片描述
其中从 w 0 , w 1 ⋯ w n w_0,w_1\cdots w_n w0,w1wn都表示权重

感知机的作用:

把一个n维向量空间用一个超平面分割成两部分,给定一个输入向量,超平面可以判断出这个向量位于超平面的哪一边,得到输入时正类或者是反类,对应到2维空间就是一条直线把一个平面分为两个部分

5. 多层神经网络

多层神经网络就是由单层神经网络进行叠加之后得到的,所以就形成了的概念,常见的多层神经网络有如下结构:

  • 输入层(Input layer),众多神经元(Neuron)接受大量输入消息。输入的消息称为输入向量。
  • 输出层(Output layer),消息在神经元链接中传输、分析、权衡,形成输出结果。输出的消息称为输出向量。
  • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。隐层可以有一层或多层。隐层的节点(神经元)数目不定,但数目越多神经网络的非线性越显著,从而神经网络的强健性(robustness)更显著。

示意图如下:
在这里插入图片描述
概念:全连接层

全连接层:当前一层和前一层每个神经元相互链接,我们称当前这一层为全连接层。

思考:假设第N-1层有m个神经元,第N层有n个神经元,当第N层是全连接层的时候,则N-1和N层之间有1,这些参数可以如何表示?
在这里插入图片描述
从上图可以看出,所谓的全连接层就是在前一层的输出的基础上进行一次 Y = W x + b Y=Wx+b Y=Wx+b的变化(不考虑激活函数的情况下就是一次线性变化,所谓线性变化就是平移(+b)和缩放的组合(*w))

6. 激活函数(增加模型的非线性分割能力)

在前面的神经元的介绍过程中我们提到了激活函数,那么他到底是干什么的呢?

假设我们有这样一组数据,三角形和四边形,需要把他们分为两类
在这里插入图片描述
通过不带激活函数的感知机模型我们可以划出一条线, 把平面分割开
在这里插入图片描述
假设我们确定了参数w和b之后,那么带入需要预测的数据,如果y>0,我们认为这个点在直线的右边,也就是正类(三角形),否则是在左边(四边形)

但是可以看出,三角形和四边形是没有办法通过直线分开的,那么这个时候该怎么办?

可以考虑使用多层神经网络来进行尝试,比如在前面的感知机模型中再增加一层
在这里插入图片描述
对上图中的等式进行合并,我们可以得到:
y = ( w 1 − 11 w 2 − 1 + ⋯   ) x 1 + ( w 1 − 21 w 2 − 1 + ⋯   ) x 2 + ( w 2 − 1 + ⋯   ) b 1 − 1 y = (w_{1-11}w_{2-1}+\cdots)x_1+(w_{1-21}w_{2-1}+\cdots)x_2 + (w_{2-1}+\cdots)b_{1-1} y=(w111w21+)x1+(w121w21+)x2+(w21+)b11
上式括号中的都为w参数,和公式 y = w 1 x 1 + w 2 x 2 + b y = w_1x_1 + w_2x_2 +b y=w1x1+w2x2+b完全相同,依然只能够绘制出直线

所以可以发现,即使是多层神经网络,相比于前面的感知机,没有任何的改进。

但是如果此时,我们在前面感知机的基础上加上非线性的激活函数之后,输出的结果就不在是一条直线
在这里插入图片描述
如上图,右边是sigmoid函数,对感知机的结果,通过sigmoid函数进行处理

如果给定合适的参数w和b,就可以得到合适的曲线,能够完成对最开始问题的非线性分割

所以激活函数很重要的一个作用就是增加模型的非线性分割能力

常见的激活函数有:

在这里插入图片描述
看图可知:

  • sigmoid 只会输出正数,以及靠近0的输出变化率最大
  • tanh和sigmoid不同的是,tanh输出可以是负数
  • Relu是输入只能大于0,如果你输入含有负数,Relu就不适合,如果你的输入是图片格式,Relu就挺常用的,因为图片的像素值作为输入时取值为[0,255]。

激活函数的作用除了前面说的增加模型的非线性分割能力外,还有

  • 提高模型鲁棒性
  • 缓解梯度消失问题
  • 加速模型收敛等

7、神经网络示例

一个男孩想要找一个女朋友,于是实现了一个女友判定机,随着年龄的增长,他的判定机也一直在变化

14岁的时候(机器学习模型,输入的是已经经过特征工程处理过的数据):

在这里插入图片描述
无数次碰壁之后,男孩意识到追到女孩的可能性和颜值一样重要,于是修改了判定机(机器学习模型,输入的是已经经过特征工程处理过的数据):在这里插入图片描述
在15岁的时候终于找到呢女朋友,但是一顿时间后他发现有各种难以忍受的习惯,最终决定分手。一段空窗期中,他发现找女朋友很复杂,需要更多的条件才能够帮助他找到女朋友,于是在25岁的时候,他再次修改了判定机(机器学习模型,输入的是已经经过特征工程处理过的数据):在这里插入图片描述
在更新了女友判定机之后,问题又来了,很多指标不能够很好的量化,如何颜值,什么样的叫做颜值高,什么样的叫做性格好等等,为了解决这个问题,他又更新了判定机,最终得到超级女友判定机(神经网络模型,输入的是基础数据):
在这里插入图片描述
上述的超级女友判定机其实就是神经网络,它能够接受基础的输入,通过隐藏层的线性的和非线性的变化最终的到输出

通过上面例子,希望大家能够理解深度学习的思想

  • 输出的最原始、最基本的数据,通过模型来进行特征工程,进行更加高级特征的学习,然后通过传入的数据来确定合适的参数,让模型去更好的拟合数据。
  • 这个过程可以理解为盲人摸象,多个人一起摸,把摸到的结果乘上合适的权重,进行合适的变化,让他和目标值趋近一致。整个过程只需要输入基础的数据,程序自动寻找合适的参数

二、DNN全连接神经网络详细图

全连接层的数学本质就是将输入矩阵(形状为: [ l , m ] [l,m] [l,m])与该全连接层的权重矩阵(形状为: [ m , n ] [m,n] [m,n])进行一次矩阵乘法---->得到一个输出矩阵(形状为: [ l , n ] [l,n] [l,n])。
在这里插入图片描述

三、深度学习算法那用于分类的流程

在这里插入图片描述

四、深度学习应用于手写数字识别

在这里插入图片描述
在这里插入图片描述

五、创建Single-Layer全连接神经网络

在这里插入图片描述

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf

# 一、创建输入数据
X_input = tf.random.normal([5, 3])
print('\nX_input.shape = {0}'.format(X_input.shape))
print('X_input = \n{0}'.format(X_input))
print('\n********************************************************************************************************************************\n')
# 二、创建全连接神经网络的一层Layer:输出为维度为 [b,3],输入维度为 [b,5]
net_layer = tf.keras.layers.Dense(2)
net_layer.build(input_shape=(None, 3))
print('net_layer.kernel = \n{0}'.format(net_layer.kernel))
print('\nnet_layer.weights = \n{0}'.format(net_layer.weights))
print('\nnet_layer.bias = {0}'.format(net_layer.bias))
print('\n********************************************************************************************************************************\n')
# 三、将输入数据通过连接层net_layer得到输出数据
X_out_logits = net_layer(X_input)  # 如果输入数据X_input的维度与创建的net_layer的维度不相符,则会出错
print('X_out_logits.shape = {0}'.format(X_out_logits.shape))
print('\nX_out_logits = \n{0}'.format(X_out_logits))
# 四、计算不经Softmax处理的输出值相对于[[0,1],[0,1],[0,1],[0,1],[0,1]]作为目标值的损失Loss,其中的参数from_logits包含了softmax功能,更稳定
loss_logits = tf.losses.categorical_crossentropy([[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], X_out_logits,from_logits=True)
print('\nloss_logits = {0}'.format(loss_logits))
print('\n********************************************************************************************************************************\n')
# 五、将输出层数据进行Softmax转换
X_out_softmax = tf.nn.softmax(X_out_logits)
print('X_out_softmax.shape = {0}'.format(X_out_softmax.shape))
print('\nX_out_softmax = \n{0}'.format(X_out_softmax))
# 六、计算Softmax处理后的输出值相对于[[0,1],[0,1],[0,1],[0,1],[0,1]]作为目标值的损失Loss
loss_softmax = tf.losses.categorical_crossentropy([[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], X_out_softmax)
print('\nloss_softmax = {0}'.format(loss_softmax))

打印结果:

X_input.shape = (5, 3)
X_input = 
[[-0.83183014 -2.249491    0.313703  ]
 [ 0.85954493  0.31218356 -0.41492802]
 [-1.3023648   1.6817355  -0.86241364]
 [ 1.8608457   0.04719599 -1.0695515 ]
 [-0.13034204  0.18900126  0.33111823]]

********************************************************************************************************************************

net_layer.kernel = 
<tf.Variable 'kernel:0' shape=(3, 2) dtype=float32, numpy=
array([[ 0.75907207,  0.54366004],
       [-0.13655823, -0.18771261],
       [ 0.26757193,  0.49025846]], dtype=float32)>

net_layer.weights = 
[<tf.Variable 'kernel:0' shape=(3, 2) dtype=float32, numpy=
array([[ 0.75907207,  0.54366004],
       [-0.13655823, -0.18771261],
       [ 0.26757193,  0.49025846]], dtype=float32)>, <tf.Variable 'bias:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)>]

net_layer.bias = <tf.Variable 'bias:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)>

********************************************************************************************************************************

X_out_logits.shape = (5, 2)

X_out_logits = 
[[-0.24029437  0.12382057]
 [ 0.4988022   0.20527749]
 [-1.4490013  -1.4465322 ]
 [ 1.119889    0.47845155]
 [-0.03615073  0.05599383]]

loss_logits = [0.52757144 0.85064065 0.6919134  1.064438   0.6481359 ]

********************************************************************************************************************************

X_out_softmax.shape = (5, 2)

X_out_softmax = 
[[0.40996382 0.59003615]
 [0.5728588  0.4271412 ]
 [0.49938273 0.50061727]
 [0.6550783  0.34492168]
 [0.47698015 0.52301985]]

loss_softmax = [0.52757144 0.85064065 0.6919134  1.0644379  0.64813584]

Process finished with exit code 0

六、创建Multi-Layer全连接神经网络

在这里插入图片描述

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras

# 一、创建输入数据
X_input = tf.random.normal([5, 3])
print('\nX_input.shape = {0}'.format(X_input.shape))
print('X_input = \n{0}'.format(X_input))
print('\n********************************************************************************************************************************\n')
# 二、创建含有Multi Layers全连接神经网络的:输入维度为 [b,5],输出为维度为 [b,3]
model = keras.Sequential([
    keras.layers.Dense(2, activation='relu'),
    keras.layers.Dense(2, activation='relu'),
    keras.layers.Dense(2)
])
model.build(input_shape=[None, 3])  # 如果输入数据X_input的维度与创建的net_layer的维度不相符,则会出错
print('模型概况:')
model.summary()  # 打印模型概况
print('\n********************************************************************************************************************************\n')
print('模型可训练参数:')
variable_index = 1
for variable in model.trainable_variables:
    print('variable{0}.name = {1}----variable{0}.shape = {2}'.format(variable_index, variable.name, variable.shape))
    variable_index = variable_index + 1
print('\n********************************************************************************************************************************\n')
# 三、将输入数据通过model得到输出数据
X_out_logits = model(X_input)
print('X_out_logits.shape = {0}'.format(X_out_logits.shape))
print('\nX_out_logits = \n{0}'.format(X_out_logits))
# 四、计算不经Softmax处理的输出值相对于[[0,1],[0,1],[0,1],[0,1],[0,1]]作为目标值的损失Loss,其中的参数from_logits包含了softmax功能,更稳定
loss_logits = tf.losses.categorical_crossentropy([[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], X_out_logits,from_logits=True)
print('\nloss_logits = {0}'.format(loss_logits))
print('\n********************************************************************************************************************************\n')
# 五、将输出层数据进行Softmax转换
X_out_softmax = tf.nn.softmax(X_out_logits)
print('X_out_softmax.shape = {0}'.format(X_out_softmax.shape))
print('\nX_out_softmax = \n{0}'.format(X_out_softmax))
# 六、计算Softmax处理后的输出值相对于[[0,1],[0,1],[0,1],[0,1],[0,1]]作为目标值的损失Loss
loss_softmax = tf.losses.categorical_crossentropy([[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], X_out_softmax)
print('\nloss_softmax = {0}'.format(loss_softmax))

打印结果:

X_input.shape = (5, 3)
X_input = 
[[-2.2702136   1.4081583  -0.6957787 ]
 [-0.7238747   1.2303656  -0.726873  ]
 [-1.391751    0.48323044 -0.66497386]
 [-1.0151541   2.8389835   1.1646931 ]
 [ 1.3002726   0.01269057  0.50732976]]

********************************************************************************************************************************

模型概况:
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 2)                 8         
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 6         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 6         
=================================================================
Total params: 20
Trainable params: 20
Non-trainable params: 0
_________________________________________________________________

********************************************************************************************************************************

模型可训练参数:
variable1.name = dense/kernel:0----variable1.shape = (3, 2)
variable2.name = dense/bias:0----variable2.shape = (2,)
variable3.name = dense_1/kernel:0----variable3.shape = (2, 2)
variable4.name = dense_1/bias:0----variable4.shape = (2,)
variable5.name = dense_2/kernel:0----variable5.shape = (2, 2)
variable6.name = dense_2/bias:0----variable6.shape = (2,)

********************************************************************************************************************************

X_out_logits.shape = (5, 2)

X_out_logits = 
[[ 0.          0.        ]
 [-0.11606402  0.137331  ]
 [ 0.          0.        ]
 [ 0.          0.        ]
 [-0.19588767  0.4769542 ]]

loss_logits = [0.6931472  0.5744544  0.6931472  0.6931472  0.41227952]

********************************************************************************************************************************

X_out_softmax.shape = (5, 2)

X_out_softmax = 
[[0.5        0.5       ]
 [0.4369881  0.56301194]
 [0.5        0.5       ]
 [0.5        0.5       ]
 [0.3378608  0.6621392 ]]

loss_softmax = [0.6931472  0.5744544  0.6931472  0.6931472  0.41227952]

Process finished with exit code 0



全连接神经网络(DNN)
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
全连接神经网络
全连接神经网络(DNN)
深度神经网络(DNN)模型与前向传播算法
笨方法学机器学习(二)全连接神经网络
全连接神经网络(DNN)

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值