全连接神经网络结构

顾名思义,全连接神经网络指的是上一层网络中的所有神经元都与下一层网络中的所有神经元相连,即上一层网络所有神经元的输出都作为下一层网络所有神经元的输入。一个简单的全连接神经网络结果如下,

该网络除去输入层以及输出层外有两层隐藏层,每个隐藏层有三个神经元,每层神经元都与下层神经元进行全连接。

正向传播

在网络的正向传播过程中,每个神经元首先将上层网络神经元的输出进行一个线性组合,然后通过一个非线性函数进行非线性变换作为当前神经元的输出。神经元的结构如下图所示,

上层神经元产生的输出x1,x2,x3x_1, x_2, x_3x1​,x2​,x3​作为输入传入当前神经元,首先在权重w1,w2,w3w_1, w_2, w_3w1​,w2​,w3​和一个偏置项bbb的作用下进行线性组合,然后通过非线性函数fff进行非线性变换产生输出yyy,即
y=f(w1x1+w2x2+w3x3+b)。y = f(w_1x_1 + w_2x_2 + w_3x_3+b)。 y=f(w1​x1​+w2​x2​+w3​x3​+b)。

激活函数的作用是为了让网络能够解决非线性问题,如果没有激活函数,整个网络可以视为一个简单的线性函数,然而现实中的问题大多数是非线性的,所以通过引入激活函数来表达非线性模型。常见的激活函数有
sigmoid:δ(x)=11+e−x,{\rm sigmoid:\quad}\delta(x) = \frac{1}{1 + e^{-x}}, sigmoid:δ(x)=1+e−x1​,tanh:tanh(x)=ex−e−xex+e−x,{\rm tanh:\quad}tanh(x)=\frac{e^x - e^{-x}}{e^x + e^{-x}}, tanh:tanh(x)=ex+e−xex−e−x​,ReLu:relu(x)=max(0,x)。{\rm ReLu:\quad}relu(x)=max(0, x)。 ReLu:relu(x)=max(0,x)。

以本文开始时的网络结构为例,网络的正向传播过程如下,
第一个隐藏层:x(2)=f1(W(1)x+B(1)),\boldsymbol{x^{(2)}} = f_1(\mathbf{W^{(1)}}\boldsymbol x+\mathbf{B^{(1)}}), x(2)=f1​(W(1)x+B(1)),其中x=[x11,x12]T,W(1)∈R3×2,B(1)∈R3×1\boldsymbol x=[x_{11}, x_{12}]^T, \mathbf{W^{(1)}} \in R^{3 \times 2}, \mathbf{B^{(1)}} \in R^{3 \times 1}x=[x11​,x12​]T,W(1)∈R3×2,B(1)∈R3×1。
第二个隐藏层:x(3)=f2(W(2)x(2)+B(2)),\boldsymbol{x^{(3)}} = f_2(\mathbf{W^{(2)}}\boldsymbol{x^{(2)}}+\mathbf{B^{(2)}}), x(3)=f2​(W(2)x(2)+B(2)),其中x(2)=[x21,x22,x23]T,W(2)∈R3×3,B(2)∈R3×1\boldsymbol{x^{(2)}}=[x_{21}, x_{22}, x_{23}]^T, \mathbf{W^{(2)}} \in R^{3 \times 3}, \mathbf{B^{(2)}} \in R^{3 \times 1}x(2)=[x21​,x22​,x23​]T,W(2)∈R3×3,B(2)∈R3×1。
输出层:y^=f3(W(3)x(3)+B(3)),\hat{y} = f_3(\mathbf{W^{(3)}}\boldsymbol{x^{(3)}}+\mathbf{B^{(3)}}), y^​=f3​(W(3)x(3)+B(3)),其中x(3)=[x31,x32,x33]T,W(3)∈R1×3,B(3)∈R1×1\boldsymbol{x^{(3)}}=[x_{31}, x_{32}, x_{33}]^T, \mathbf{W^{(3)}} \in R^{1 \times 3}, \mathbf{B^{(3)}} \in R^{1 \times 1}x(3)=[x31​,x32​,x33​]T,W(3)∈R1×3,B(3)∈R1×1。

因此整个网络可以视为一个关于输入的非线性复合函数,即y^=f(x,W,B)=f3(W(3)f2(W(2)f1(W(1)x+B(1))+B(2))+B(3))。\hat{y} = f(\boldsymbol x, \mathbf W, \mathbf B) = f_3(\mathbf{W^{(3)}}f_2(\mathbf{W^{(2)}}f_1(\mathbf{W^{(1)}}\boldsymbol x+\mathbf{B^{(1)}})+\mathbf{B^{(2)}})+\mathbf{B^{(3)}})。 y^​=f(x,W,B)=f3​(W(3)f2​(W(2)f1​(W(1)x+B(1))+B(2))+B(3))。给定一组输入x\boldsymbol xx就可以得到网络的输出y^\hat{y}y^​,如何评价这组输出的准确性或这个网络的好坏?这就涉及到损失函数的知识点了。

损失函数

我们首先知道神经网络属于一种有监督学习过程,神经网络当然可以处理有监督学习的两大任务——回归以及分类,而对于不同的任务,常用的损失函数也不同。

回归问题

对于回归问题,我们的目的是让网络输出的结果尽可能接近真实值,因此均方误差(MSE)通常被选择作为这类问题的损失函数,即LMSE=1n∑i=1n(yi−yi^)2,L_{MSE} = \frac{1}{n}\sum_{i = 1}^{n}(y_i - \hat{y_i})^2, LMSE​=n1​i=1∑n​(yi​−yi​^​)2,其中nnn表示样本数,yi,yi^y_i, \hat{y_i}yi​,yi​^​分别表示第iii个样本的真实标签与网络的预测结果。

下面给出MSE的测试代码,

import paddle.fluid as fluid
import numpy as nppredict = np.array([[-5.5, -1.3, 3.1, 0.5, 1.7]], dtype=np.float64).T
label = np.array([[-5, -2, 2, 1, 2]], dtype=np.float64).T#手动计算MSE
loss = np.mean((predict - label) ** 2)
print(loss.T)#paddle计算MSE
with fluid.dygraph.guard():pre = fluid.dygraph.to_variable(predict)l = fluid.dygraph.to_variable(label)loss1 = fluid.layers.mse_loss(pre, l)print(loss1.numpy().T)

下面是它的执行结果。

0.458
[0.458]

分类问题

对于分类问题,我们的目的是让网络输出的样本类别尽可能与真实类别保持一致。通常使用交叉熵损失函数,具体而言,二分类问题同多分类问题的又有些许区别。

对于二分类问题而言,网络的输出层通过sigmoid激活函数后可以输出一个(0,1)(0, 1)(0,1)范围内的数值,表示该样本属于正类的概率,这时交叉熵损失的计算方式为Lcross_entropy=1n∑i=1n(−yilog(yi^)−(1−yi)log(yi^)),L_{cross\_entropy} = \frac{1}{n}\sum_{i = 1}^n(-y_ilog(\hat{y_i}) - (1 - y_i)log(\hat{y_i})), Lcross_entropy​=n1​i=1∑n​(−yi​log(yi​^​)−(1−yi​)log(yi​^​)),其中nnn表示样本数,yiy_iyi​表示第iii个样本的真实类别(正类为1,负类为0),yi^\hat{y_i}yi​^​表示第iii个样本通过网络预测为正类的概率。

下面给出sigmoid交叉熵的测试代码,

import paddle.fluid as fluid
import numpy as nppredict = np.array([[-5, -1, 3, 0.5, 1]], dtype=np.float64).T
label = np.array([[0, 0, 1, 1, 1]], dtype=np.float64).T#手动计算交叉熵
sigmoidPre = 1 / (1 + np.exp(-1 * predict))
loss = -1 * label * np.log(sigmoidPre) - (1 - label) * np.log(1 - sigmoidPre)
print(loss.T)#通过paddle计算
with fluid.dygraph.guard():pre = fluid.dygraph.to_variable(predict)l = fluid.dygraph.to_variable(label)loss1 = fluid.layers.sigmoid_cross_entropy_with_logits(pre, l)print(loss1.numpy().T)

下面是它的执行结果,可以验证我们思路的正确性。

[[0.00671535 0.31326169 0.04858735 0.47407698 0.31326169]]
[[0.00671535 0.31326169 0.04858735 0.47407698 0.31326169]]

对于多分类问题,网络的输出层输出的是kkk维向量,在输出层时通过softmax激活函数将这个向量归一化到(0,1)(0,1)(0,1)范围内,因此每个数就可以用来表示该样本属于对应的kkk类别的概率,softmax计算公式如下pij=eyij^∑d=1keyid^,p_{ij} = \frac{e^{\hat{y_{ij}}}}{\sum_{d=1}^ke^{\hat{y_{id}}}}, pij​=∑d=1k​eyid​^​eyij​^​​,其pijp_{ij}pij​表示第iii个样本属于第jjj个类别的概率,yi^=[yi1^,…,yik^]\boldsymbol{\hat{y_i}} = [\hat{y_{i1}}, \dots,\hat{y_{ik}}]yi​^​=[yi1​^​,…,yik​^​]表示第iii个样本通过网络输出的kkk维向量。因而此时交叉熵损失的计算方式为Lcross_entropy=1n∑i=1n(−∑j=1kyijlog(pij)),L_{cross\_entropy} = \frac{1}{n}\sum_{i = 1}^n(-\sum_{j = 1}^ky_{ij}log(p_{ij})), Lcross_entropy​=n1​i=1∑n​(−j=1∑k​yij​log(pij​)),其中yi=[yi1,…,yik]\boldsymbol{y_i} = [y_{i1}, \dots,y_{ik}]yi​=[yi1​,…,yik​]表示第iii个样本的所属类别的one-hot编码。

可以看出二分类问题中交叉熵损失函数的计算是多分类问题的一个特例,对于二分类问题网络也可以采用每次输出两个结果,分别表示该样本属于正类和负类的概率,那么交叉熵损失的计算就同多分类问题的交叉熵计算一致了。

下面给出softmax交叉熵的测试代码,

import paddle.fluid as fluid
import numpy as nppredict = np.array([[-5.5, -1.3, 3.1], [-4.9, -3, 2.6], [-1, 2, -3], [5, 1, -1], [3.7, -0.3, -2.9]], dtype=np.float64)
label = np.array([[0, 0, 1, 2, 2]], dtype=np.int64).T#手动计算softmax交叉熵
expPre = np.exp(predict)
softmaxPre = expPre / np.sum(expPre, axis=1)[:, np.newaxis]
oneHot = np.eye(3, dtype=np.int64)[label[:, 0]]
loss = -1 * np.sum((oneHot * np.log(softmaxPre)), axis=1)
print(loss.T)#paddle计算softmax交叉熵
with fluid.dygraph.guard():pre = fluid.dygraph.to_variable(predict)l = fluid.dygraph.to_variable(label)loss1 = fluid.layers.softmax_with_cross_entropy(pre, l)print(loss1.numpy().T)

下面是它的执行结果,可以验证我们思路的正确性。

[8.61238444 7.50424194 0.05498524 6.02058114 6.61948494]
[[8.61238444 7.50424194 0.05498524 6.02058114 6.61948494]]

有关全连接网络的反向传播与梯度下降移步下文全连接神经网络基础——反向传播及梯度下降。

全连接神经网络基础——正向传播及损失函数相关推荐

  1. 全连接神经网络——MINST手写数字识别

    简介 本文构建了一个全连接神经网络(FCN),实现对MINST数据集手写数字的识别,没有借助任何深度学习算法库,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等.最终的代码总行数不超过200 ...

  2. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类

    )全连接神经网络(FC) 全连接神经网络是一种最基本的神经网络结构,英文为Full Connection,所以一般简称FC. FC的准则很简单:神经网络中除输入层之外的每个节点都和上一层的所有节点有连 ...

  3. 全连接神经网络反向传播详解

    训练神经网络基本采用反向传播+梯度下降来进行,具体过程如下: 全连接层神经元之间互相连接,假设第一层有三个节点,第二层有个节点,如下图所示: 我们通过w11,w12,w21,w22,w31,w32来分 ...

  4. 【神经网络与深度学习】 Numpy 实现全连接神经网络

    1.实验名称 Numpy 实现全连接神经网络实验指南 2.实验要求 用 python 的 numpy 模块实现全连接神经网络. 网络结构为一个输入层.一个隐藏层.一个输出层. 隐藏层的激活函数为 Re ...

  5. 全连接神经网络详解(Full Connect Neural Network)

    文章目录 前言 一.单层神经网络 1.1 正向传播 1.2 损失函数 1.3 梯度下降 二.浅层神经网络 2.1 正向传播 2.2 反向传播 三.深层神经网络 3.1 ImageNet发展史 3.2 ...

  6. 第六节:Pytorch实现全连接神经网络

    第六节:Pytorch实现全连接神经网络 前面的五节中,我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧,包括:网络的搭建.选择不同的实践技巧(优化器选择.学习率下降等等)以及可视化训 ...

  7. 手写数字识别全部代码--全连接神经网络方法

    ''' #2018-06-25 272015 June Monday the 26 week, the 176 day SZ 手写字体识别程序文件1: 这个程序使用了全连接神经网络也就是DNN. 定义 ...

  8. 深度之眼Pytorch打卡(十三):Pytorch全连接神经网络部件——线性层、非线性激活层与Dropout层(即全连接层、常用激活函数与失活 )

    前言   无论是做分类还是做回归,都主要包括数据.模型.损失函数和优化器四个部分.数据部分在上一篇笔记中已经基本完结,从这篇笔记开始,将学习深度学习模型.全连接网络MLP是最简单.最好理解的神经网络, ...

  9. 全连接神经网络单层模型原理

    全连接神经网络单层模型原理 前言 单层MLP 1. 前向传播 2. 激活函数 2.1 Sigmoid函数 2.2 tanh函数 2.3 ReLu函数 2.4 Leaky ReLu函数 3. 损失函数 ...

最新文章

  1. ccf 高速公路(顺便当tarjan模板)
  2. jfinal集成使用shiro
  3. JAVA面试必备的知识宝典(一)
  4. 计算机usb共享网络泄密,杜绝USB泄密 MyUSBOnly
  5. 定时任务 cron 表达式详解
  6. php背景色如何填充满,php - 按一定百分比覆盖背景颜色
  7. 【Pro ASP.NET MVC 3 Framework】.学习笔记.4.MVC的主要工具-使用Moq
  8. 单CPU环境中如何实现多进程并行工作?
  9. 【电力拖动自动控制系统】感应/异步电机动态模型完全手把手推导
  10. 20135202闫佳歆——信息安全系统设计基础第六周学习总结
  11. ts类型声明文件的正确使用姿势
  12. web将pdf转成图片以及图片转回pdf的方法
  13. 华为麒麟9000性能提升幅度大,但恐难成安卓一哥
  14. 老将引退AMD换血成功
  15. MySQL的核心日志
  16. 4年功能测试月薪9.5K,3个月时间成功进阶自动化,跳槽涨薪6k后我的路还很长...
  17. 固态硬盘量产复活记(慧荣SM2256K+H27QFG8PEM5R)
  18. SQL Server 中WITH (NOLOCK)浅析 2014-08-30 11:58 by 潇湘隐者, 58264 阅读, 33 评论, 收藏, 编辑 概念介绍 开发人员喜欢在SQL脚本
  19. 动软代码生成器 第一次使用出现附加数据库错误是否添加写入权限
  20. 中国大学生计算机编程第一人楼天城访谈

热门文章

  1. 云服务器文件做共享,云服务器文件共享
  2. [PS] 透明底图片制作
  3. Golang连接池应用实践
  4. java mysql连接池配置_Java数据库连接池的几种配置方法(以MySQL数据库为例)
  5. 读博,每天要不要工作十二小时
  6. 基于SSM的美容院管理系统
  7. 《测绘管理与法律法规》真题易错本
  8. 实验一:Cifar10图像分类竞赛 学习记录
  9. HTML入门学习笔记+详细案例
  10. 数据监控体系是什么?该怎么搭建?