神经网络介绍-激活函数、参数初始化、模型的搭建

news2024/12/24 2:29:57

目录

    • 1、深度学习了解
      • 1.1 深度学习简介
      • 1.2 神经网络
    • 2、神经网络的工作流程
      • 2.1 激活函数
        • 2.1.1 Sigmoid/Logistics函数
        • 2.1.2 tanh(双曲正切曲线)
        • 2.1.3 RELU
        • 2.1.4 Leaky Relu
        • 2.1.5 SoftMax
        • 2.1.6 其他激活函数
      • 2.2 参数初始化
        • 2.2.1 随机初始化
        • 2.2.2 标准初始化
        • 2.2.3 Xavier初始化
        • 2.2.4 He初始化
    • 3,神经网络的搭建
      • 3.1 通过Sequential构建
      • 3.2 通过function API构建--实践中常用
      • 3.3 通过model的子类构建
    • 4,神经网络的优缺点
    • 5,总结

1、深度学习了解

1.1 深度学习简介

机器学习:获取数据–特征提取–分类器–输出
深度学习:获取数据–深度学习 --输出
深度学习是机器学习的一个子集,不需要手工设计特征,可解释性差,效果好
应用场景:图像识别、语音识别、机器翻译、自动驾驶

历史:
1989年:反向传播算法
2012年:李飞飞imageNet首次使用深度学习
2019年:transformer

1.2 神经网络

神经网络:人工神经网络,是一种模仿生物神经网络结构和功能的计算模型。
神经元之间传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号
神经网络:对每个神经元的输入进行加权和,送人激活函数后进行输出
输入层:对应的输入数据
隐藏层:输入与输出之间的
输出层:获取输出的
特点:
1,每一层的神经元之间没有连接
2,当前层的输入是上一层神经元的输出
3,数据传输过程:输入->隐藏层->输出层

2、神经网络的工作流程

2.1 激活函数

激活函数作用:向神经网络中引入非线性因素
通过激活函数,神经网络可以拟合各种曲线。如果不用激活函数,每一层输出都是上一层输入的线性函数。

2.1.1 Sigmoid/Logistics函数

在这里插入图片描述
处处可导
在x足够小或者足够大的时候,导师为0,容易造成梯度消失
sigmoid一般只用于二分类的输出层

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10,10,1000)
y = tf.nn.sigmoid(x)
plt.plot(x,y)
plt.grid()

在这里插入图片描述

2.1.2 tanh(双曲正切曲线)

上面的sigmiod曲线的中心点不在原地,所以出现了tanh
在这里插入图片描述
y范围:-1到1
tanh函数是以0为中心的,收敛速度比sigmoid快(更陡峭),减少迭代次数,两侧的导数为0,同样会造成梯度消失。
使用时,可在隐藏层使用tanh函数,在输出层使用sigmoid函数

x = np.linspace(-10,10,100)
y = tf.nn.tanh(x)
plt.plot(x,y)
plt.grid()

在这里插入图片描述

2.1.3 RELU

在这里插入图片描述
ReLU是目前最常用的激活函数,
在x<0时,ReLU导数为0,落入小于0区域时,权重无法更新,这种称为“神经元死亡”,缓解过拟合问题
在x>0时,是其本身,缓解梯度消失问题
与sigmoid相比,RELU的优势:
1,采用sigmoid函数时计算量大,而采用Relu时,计算量会节省很多
2,sigmiod容易出现梯度消失问题,从而无法完成深层网络的训练
3,Relu会使得一部分神经元的输出为0,造成网络的稀疏性,减少了参数的相互依存关系,缓解过拟合问题

x = linespace(-10,10,100)
y = tf.nn.relu(x)
plt.plot(x,y)
plt.grid()

在这里插入图片描述
无脑使用relu

2.1.4 Leaky Relu

改进Leaky Relu
对于relu,防止出现大量神经元死亡问题,所以引入了leakrelu
在这里插入图片描述
小于0时,导数是一个常数

x = linespace(-10,10,100)
y = tf.nn.leaky_relu(x)
plt.plot(x,y)
plt.grid()

2.1.5 SoftMax

SoftMax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结构以概率的形式展示出来
在这里插入图片描述
网络输出的logits通过softmax函数,就映射成(0,1)的值,理解为概率,选择概率最大的接点作为我们的预测目标类别

x = tf.constant([0.2,0.02,0.15,1.3,0.5,0.06,1.1,0.05,3.75])
y = tf.nn.softmax(x)

在这里插入图片描述

2.1.6 其他激活函数

在这里插入图片描述
怎么选择激活函数?
隐藏层:优先relu,再leakyrelu,不要使用sigmoid,使用tanh
输出层:二分类–sigmoid ;多分类—softmax ; 回归—恒等激活
在这里插入图片描述

2.2 参数初始化

对于某一个神经元来说,需要初始化的参数有两类,一类权重W,还有一类偏置b,偏置b初始化为0即可,权重的初始化很重要
在这里插入图片描述
下面是对权重初始化的方法:

2.2.1 随机初始化

从均值为0,标准差为1的高斯分布中取样, 使用一些很小的值对w进行初始化

2.2.2 标准初始化

权重参数初始化从区间均匀分布随机取值,(-1/对d开根号,1/对d开根号)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量

2.2.3 Xavier初始化

各层的激活值和梯度的方差在传播过程中保持一致,也叫做Glorot初始化。在tf.keras中实习方式有两种:
1,正态化Xavier初始化
从以0为中心,标准差为stddev = sqrt(2/(fan_in+fan_out))的正态分布中抽取样本,其中fan_in是输入神经元的个数,fan_out是输出的神经元个数

#正态化Xavier初始化
import tensorflow as tf
initializer = tf.keras.initializers.glorot_normal()
values = initializer((9,1)) #生成9行1列的权重
values

2,标准化Xavier初始化
从[-limit,limit]中的均匀分布中抽样采样,其中limit = sqrt(6/(fan_in+fan_out)),其中fan_in是输入神经元的个数,fan_out是输出的神经元个数

#标准化Xavier初始化
import tensorflow as tf
initializer = tf.keras.initializers.glorot_uniform()
values = initializer((9,1)) #生成9行1列的均匀分布的权重
values

2.2.4 He初始化

正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。在tf.keras中也有两种:
1,正态化的he初始化
从以0为中心,标准差为stddev = sqrt(2/(fan_in))的正态分布中抽取样本,其中fan_in是输入神经元的个数

#正态化的he初始化
import tensorflow as tf
initializer = tf.keras.initializers.he_normal() #实例化
values = initializer((9,1)) #生成9行1列的权重
values

2,标准化Xavier初始化
从[-limit,limit]中的均匀分布中抽样采样,其中limit = sqrt(6/(fan_in),其中fan_in是输入神经元的个数

#标准化Xavier初始化
import tensorflow as tf
initializer = tf.keras.initializers.he_uniform()
values = initializer((9,1)) #生成9行1列的均匀分布的权重
values

相较于Xavier,he初始化只考虑了输入神经元数

3,神经网络的搭建

在这里插入图片描述
tf.Keras中构建模有两种方式,一种通过Sequential构建,一种通过Model类构建。前者是按照一定的顺序对层进行堆叠,而后者可以构建较复杂的网络模型
构建网络层----tf.keras.layers.dense()

3.1 通过Sequential构建

Sequential()提供了一个层的列表,能够快速构建一个神经网络模型
输入层–隐藏层–输出层

#Sequential构建神经网络
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

model = keras.Sequential([
	#第一隐藏层
	layers.Dense(3,activation='relu',kernel_initializer = 'he_normal',name='layer1',input_shape=(3,)),
	#3个神经元,激活函数,初始化方式,当前层名字,3个输入
	#第二隐藏层
	layers.Dense(2,activation='relu',kernel_initializer = 'he_normal',name='layer2'),
	#输出层
	layers.Dense(2,activation='sigmoid',kernel_initializer = 'he_normal',name='layer3')
]
	name = 'sequential' #当前model的名字
)

model.summary()#展示模型结果
keras.utils.plot_model(model)

在这里插入图片描述
param指参数,权重的个数。43 =12;42=8;3*2=6
在这里插入图片描述

在这里插入图片描述
Sequentia只能构建简单的模型,单输入单输出类型的

3.2 通过function API构建–实践中常用

function API可以构建更为复杂的模型,将层作为可调用的对象并返回张量,并将输入向量和输出向量提供给tf.keras.Model的inputs和outputs参数

#function API构建神经网络
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

inputs = keras.Input(shape=(3,),name=input) #定义输入:tf.keras.input
#第一隐藏层
x = layers.Dense(3,activation='relu',name='layer1')(input)  #要指定隐藏层的输入
#第二隐藏层
x = layers.Dense(2,activation='relu',name='layer1')(x)
#输出层
layers.Dense(2,activation='sigmoid',name='layer3')(x)
#创建模型
model = keras.Model(input=inputs,outputs = outputs,name='Function API Model')#构建模型tf.keras.Model

model.summary()#展示模型结果
keras.utils.plot_model(model,show_shapes=True)#绘制出模型结果

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

3.3 通过model的子类构建

通过model的子类构建模型,需要在__init__中定义神经网络的层,在call方法中定义网络的前向传播过程

#model构建神经网络
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

class Mymodel(keras.Model):
	#定义网络的层结构
	def __init__(self):
		super(Mymodel,self).__init__()
		#第一隐藏层
		x = layers.Dense(3,activation='relu',name='layer1')
		#第二隐藏层
		x = layers.Dense(2,activation='relu',name='layer1')
		#输出层
		layers.Dense(2,activation='sigmoid',name='layer3')
	#定义网络的前向传播
	def call(self,inputs):
		x = self.layer1(inputs)
		x = self.layer2(x)
		outputs = self.layer3(x)
		return outputs

#实例化
model = Mymodel()
#设置输入
x = tf.ones((1,3))
y = model(x)
y
model.summary()	
#这种方式下不能使用plot_model了

在这里插入图片描述
步骤:
1,定义一个tf.keras.model的子类
2,init 完成网络中层的构建
3,call 完成前向传播

4,神经网络的优缺点

优点:

  • 精度高,优于其他的机器学习方法
  • 可以近似任意的非线性模型
  • 随着计算机硬件的发展,近年受到热捧,有大量的框架和库可供使用

缺点:

  • 黑箱,无法解释模型内部是如何工作的
  • 训练时间长,需要大量计算力
  • 网络结构复杂,需要调整超参数
  • 小数据集上表现不佳,容易发生过拟合

神经网络 发展历史:
1969年–单层感知机
1986年–反向传播
受制于计算机的硬件
2012年–ImageNet比赛上大放异彩
2016年–AlphaGo

5,总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客585】ipvs场景下dummy网卡的作用

linux ipvs模式下dummy网卡的作用 1、场景&#xff1a; 在使用ipvs来实现vip的负载均衡的时候&#xff0c;有时我们会在linux中创建一块dummy网卡&#xff0c;并在网卡上绑上vip 2、场景示例&#xff1a;k8s kube-proxy组件的ipvs模式 kube-proxy在ipvs模式下生成了一块kub…

iperf工具源码下载、编译、编译报错解决、以及测试网络带宽

1、iperf源码下载 (1)源码下载地址&#xff1a;https://iperf.fr/iperf-download.php; (2)有的版本源码下载下来并不能直接编译成功&#xff0c;可能会报缺少头文件或者编译选项的错误&#xff0c;要么去解决这些错误&#xff0c;要么换个版本再试一下&#xff1b; (3)在我的环…

Linux学习【教程+实操】【超基础】

链接:资料提取码&#xff1a;6klp 今日内容Linux简介Linux安装网卡设置安装SSH连接工具Linux和Windows目录结构对比Linux常用命令Linux命令初体验文件目录操作命令拷贝移动命令打包压缩命令文本编辑命令查找命令Linux软件安装软件安装方式安装jdk&#xff08;采用二进制发布包…

mysql索引字段设计

表字段数量与row大小限制可以参考官方文档 https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#column-count-limits 复合索引 参考&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html 数量限制 一个复合索引最多可以包含16个列&…

微信小程序--自定义组件

组件的创建与引用 1.创建组件 在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建 components -> test 文件夹 在新建的components -> test文件夹上&#xff0c;鼠标右键&#xff0c;点击“新建Component" 键入组件的名称之后回车&#xff0c;会自动生成组件对…

C语言进阶(9)——C语言文件操作

本章重点 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定文件缓冲区 文章目录本章重点1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件打开和关闭3.1 文件指针3.2文件的打开和关闭4. 文件…

【蓝桥杯嵌入式】第十一届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解

题目再现 题目分析 通过阅读本届试题可知&#xff0c;其功能比较单一&#xff0c;除了试题中常客——LED、LCD、按键三巨头外&#xff0c;还包含了定时器的PWM以及ADC读取这两个部分&#xff0c;考察的重点在于对定时器产生PWM的应用以及如何修改PWM的占空比&#xff0c;完全消…

MPU-6000(6050)介绍

MPU-6000&#xff08;6050&#xff09;简介MPU-60X0是全球首例9 轴运动处理传感器。它集成了3 轴MEMS陀螺仪&#xff0c;3 轴MEMS加速度计&#xff0c;以及一个可扩展的数字运动处理器DMP&#xff08;DigitalMotion Processor&#xff09;&#xff0c;可用I2C接口连接一个数字传…

react PureComponent

这个 其实和我之前写的文章react组件优化&#xff0c;当父组件数据变化与子组件无关时&#xff0c;控制子组件不重新渲染实现的东西是一样的 只是用了一种更简洁的方式 我们还是重新来一次 创建一个react项目 然后 创建一个子组件 我这里就直接叫 subset.jsx 参考代码如下 i…

ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION

核心 Adam: 一种基低阶矩的自适应估计的随机目标函数的一阶梯度优化算法&#xff0c;该方法实现简单**&#xff0c;计算效率高&#xff0c;内存需求很少**&#xff0c;对梯度的对角线重新缩放不变&#xff0c;并且非常适合于在数据或参数方面较大问题&#xff0c;该方法也适用…

ADI demo PS工程的编译-以adrv9371x_zc706为例子

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ADI demo PS工程的编译-以adrv9371x_zc706为例子前言VITIS建工程总结前言 接《ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin》这篇。导出XSA文件&#xff0c…

VMware虚拟机搭建安装MacOS13及开发环境搭建

文章目录前言准备工作&#xff1a;安装虚拟机及MacOS系统1.安装VMware 虚拟机2. 运行解锁工具3. 安装macOS 134. 配置网络5. 安装VMware tools开发环境1. 安装xcode2. 安装HbuilderX前言 终于把macOS13虚拟机安装好了&#xff0c;比起上次安装macOS10,这次走了很多弯路。 先说…

108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 难度简单1214 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&…

春节期间商城如何做好运营

有经验的商家都知道&#xff0c;春节对于店铺来说&#xff0c;这是一个全新的起点&#xff0c;所以商家们一定要抓住新年这个过渡期的时机。那么在春节期间的运营该如何做呢&#xff1f; 首先看看春节期间会有的几个问题&#xff1a; 推广竞争会比较小&#xff0c;在这个时间…

git使用日常问题记录【按日期频繁记录,欢迎收藏】

git系列文章 文章目录2023.1.14 将gitee仓库转移到github遇到的问题1-1 add到暂存区&#xff0c;commit到仓库之后&#xff0c;不想push了&#xff1f;&#xff1f;&#xff1f;1-2 git push大文件失败解决1-3 上传多余文件&#xff0c;如何从远端仓库中删除2023.1.151-1 githu…

销售管理系统 | 数据库课设

文章目录前言项目介绍E-R图表结构系统总体框架搭建项目环境介绍创建网站主页连接数据库注册功能登录功能管理员登录功能注销登录功能个人信息后台管理查看供应商名单删除功能修改功能登记货物信息功能购买商品功能总源码教训总结前言 为了期末的数据库课设&#xff0c;这是最初…

【C++】STL - Stack - Queue - PriorityQueue使用和模拟实现

&#x1f431;作者&#xff1a;傻响 &#x1f431;专栏&#xff1a;《数据结构_STL》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 栈 Stack介绍 模拟实现 队列 Queue介绍 常用的函数接口介绍 模拟实现 优先级队列 Priority…

【docker18】docker容器之CAdvisor+InfluxDB+Granfana

1.原生命令 1.1操作 命令&#xff1a; docke stats 1.2问题 通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU&#xff0c;内存以及网络流量控制等数据&#xff0c;一般的小公司够用了。 但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&am…

669. 修剪二叉搜索树

669. 修剪二叉搜索树 难度中等 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c…

SourceTree使用方法总结

SourceTree使用方法总结 SourceTree使用总结 添加仓库 mac下从url克隆&#xff1a; windows下从url克隆&#xff1a; 抓取、获取分支信息 抓取&#xff08;mac下的名字&#xff09;获取&#xff08;Windows下的名字&#xff09;指获取服务端git库的变更信息&#xff0c;比如…