简单说说深层神经网络中的几种常用方法
bigegpt 2024-10-07 06:34 67 浏览
本文介绍简单说说深层神经网络中的几种常用方法,深度学习所示深层神经网络的代名词,重要特性:多层、非线性。若只通过线性变换,任意层的神经网络模型与单层神经网络模型的表达能力没有任何区别,这是线性模型的局限性。对于线性可分的问题中,线性模型可解决,但在现实生活中,绝大部分的问题都是无法线性分割的。
1、激活函数
将每一个神经元(神经网络的节点)的输出通过一个非线性函数便可使得整个神经网络的模型非线性化,这个非线性函数就是激活函数。常用非线性激活函数:tf.nn.relu、tf.sigmoid、tf.tanh;使用方法,例:tf.nn.relu(tf.matmul(x,w1)+biases1)
偏置项:可理解为数学中y=ax+b中的b,如果在分类的情况下,两点刚好在经过原点的直线上,如果没有偏置项b的话,无法划分直线将两个点分开。
2、损失函数
概念:用来评价模型的预测值Y^=f(X)与真实值Y的不一致程度,它是一个非负实值函数。通常使用L(Y,f(x))来表示,损失函数越小,模型的性能就越好。
1)经典损失函数
a)分类问题:将不同的样本分到事先定义好的类别中。常用交叉熵计算;计算方法:
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
#y_正确结果,y测试结果;y_*tf.log(tf.clip_by_value(y,1e-10,1.0))得到n*m的二维矩阵,
#n为样例的数量,m为分类的类别数量。由于交叉熵一般与softmax回归一起使用,所以tf对其进行统一封装,
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(y,y_)
b)回归问题:对具体数值的预测。常用均方差;计算方法:mse=tf.reduce_mean(tf.square(y_-y)#y_标准答案,y输出答案
2)自定义损失函数除了分类和回归还有其他问题,所以可以根据具体情况,具体写对应的损失函数。
3、神经网络优化算法
目的:使损失函数尽可能的小;
1)反向传播算法(backpropagtion):给出一个高效的方式在所有参数上使用梯度下降算法;是训练神经网络的核心算法,可以根据定义好的损失函数优化神经网络中参数的取值;
2)梯度下降算法(gradient decent):优化单个参数的取值
当要求损失函数的值为最小值时,可以根据其偏导来判断其下降方向,梯度便是偏导值;当损失函数未到最小值时,(损失函数-梯度)可变的更小,使用反向传播算法,可一直将损失函数减去其梯度,知道获得最小的损失函数;其中由于梯度可能过大,导致错过最小值,所以可在梯度的值乘以学习率。即:下一个损失函数=损失函数-梯度*学习率(其中梯度便是损失函数的偏导),下面给出一个损失函数为y=x^2的例子:
TRAINING_STEPS=5
x=tf.Variable(tf.constant(5,dtype=tf.float32),name='x')
y=tf.square(x)
train_op=tf.train.GradientDescentOptimizer(0.3).minimize(y)#实现梯度下降算法的优化器
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(TRAINING_STEPS):
sess.run(train_op)
x_value=sess.run(x)
print(i+1, x_value)
注意:梯度下降算法并不可保证优化的函数能得到全局最优解,只有损失函数为凸函数时才可保证;样例如下图
3)随机梯度下降算法(stochastic gradient decent):梯度下降算法中,由于计算的是全部训练数据上最小化最优,所以损失函数是在所有训练数据上的损失和,这样每轮迭代导致时间过长;由此问题引出随机梯度下降算法,随机优化某一条训练数据上的损失函数。该方法虽然达到时间缩短,但是会导致函数无法得到全局最优。
4)实际采用方法:梯度与随机梯度的折中--每次计算一小部分训练数据的损失函数(batch),该方法可大大减少收敛所需的迭代次数,缩短时间,同时可使收敛到的结果最优。神经网络的训练大都遵循以下过程:
batch_size=n
#读取一小部分数据作为当前训练集
x=tf.placeholder(tf.float32,shape=[None,2],name='x-input')
x=tf.placeholder(tf.float32,shape=[None,1],name='y-input')
#定义神经网络结构和优化算法
loss=...
train_step=tf.train.AdamOptimizer(0.001).minimize(loss)
with tf.Session() as sess:
#参数初始化
...
#迭代更新参数
for i in range(STEPS):
#将所有随机数据重新打乱之后再选取将会获得更好的优化效果
X=..
Y=...
sess.run(train_step,feed_dict={x:X,y:Y})
4、神经网络的进一步优化
1)学习率的设置
在梯度下降算法中,如果学习率取值过大,可能会出现数值两边震荡的情况,永远都到达不了极值,而若学习率取值过小,则会大大降低优化的速度,TensorFlow提供了学习率设置的方法--指数衰减法,更改上面的梯度例子如下:
TRAINING_STEPS=100
global_step=tf.Variable(1)#初始化为0
#def exponential_decay(learning_rate, global_step, decay_steps, decay_rate,
#staircase=False, name=None):分别为:初始学习率,经过decay_steps轮计算,学习率乘以decay_rate,staircase为T,学习率阶梯状衰减,否则,连续衰减
LEA_RATE=tf.train.exponential_decay(0.1,global_step,1,0.96,staircase=False)#获得学习率,指数衰减法,开始较大的衰减率,后来指数变小
x=tf.Variable(tf.constant(5,dtype=tf.float32),name='x')
y=tf.square(x)
train_op=tf.train.GradientDescentOptimizer(LEA_RATE).minimize(y,global_step=global_step)#实现梯度下降算法的优化器,global_step会自动加1,可当计数器用
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(TRAINING_STEPS):
sess.run(train_op)
LEA_RATE_value=sess.run(LEA_RATE)
x_value=sess.run(x)
print(i+1, i+1, x_value, LEA_RATE_value,sess.run(global_step))
2)过拟合问题
概念:当一个模型过为复杂之后,它会很好的‘记忆’每一个训练数据中随机随机噪音的部分而忘记了要去‘学习’训练数据中通用的趋势。意思就是过拟合数据中的随机噪音虽然可得到极小的损失函数,但是对位置数据可能无法做出可靠的判读。 解决方法:正则化--在损失函数中添加刻画模型复杂程度的指标。使用方法:
#lambda正则化项的权重,w需要计算正则化损失的参数,也就是边上的权重
loss=之前的损失函数+tf.contrib.layers.l2_regularizer(lambda)(w)
print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w)))#w中每个元素的绝对值之和乘0.5,所以值为5
print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w)))#w中每个元素的平方和除以2再乘0.5,结果为7.5
print(sess.run(tf.contrib.layers.l1_l2_regularizer(0.5)(w)))#w中的每个元素之和乘0.5+w中每个元素的平方和乘(1-0.5)
当神经网络的参数增多时,损失函数也将会增多,若将其写在一个定义中,可读性会很差,容易出错,所以在TensorFlow中可以用一下方法:
#losses是集合的名字1,mse_loss是加入集合的内容
tf.add_to_collection('losses', mse_loss)
#get_collection返回的是losses集合,add_n是将集合的中值求和
loss = tf.add_n(tf.get_collection('losses'))
5、滑动平均模型
作用:在使用随机梯度下降算法训练神经网络时,可只用该方法在一定程度上进行优化。使用方法如下:
v1=tf.Variable(0,dtype=tf.float32)
step=tf.Variable(0,trainable=False)
#定义一个滑动平均模型的类,初始化衰减率为0.99,控制衰减率的变量step
ema=tf.train.ExponentialMovingAverage(0.99,step)
#定义一个更新变量滑动平均的操作,并给定一个列表,每次执行这个操作时,列表更新
maintain_ave_op=ema.apply([v1])
with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
#上面的V1*衰减率+(1-衰减率)*更新变量v1,其中衰减率=min{初始化衰减率,(1+step)/(10+step)}
print(sess.run([v1,ema.average(v1)]))#结果:[0,0]
sess.run(tf.assign(v1,5))
sess.run(maintain_ave_op)
print(sess.run([v1,ema.average(v1)]))#0*min{0.99,((1+step)/(step+10))}+(1-min{0.99,((1+step)/(step+10))})*5
sess.run(tf.assign(step,10000))
sess.run(tf.assign(v1,10))
sess.run(maintain_ave_op)
print(sess.run([v1,ema.average(v1)]))
sess.run(maintain_ave_op)
print(sess.run([v1,ema.average(v1)]))
6、常用方法
tf.reduce_sum() #和tf.greater(v1,v2)#v1和v2的每个对应元素比较,若v1大于v2,则为True否则为False。
tf.where(tf.greater(v1,v2),v1,v2)#根据第一个参数的T和F来选择v1和v2,若为False则元素选V2中的值,整个函数相当于选取v1和v2中较大的数组成一个举证。
本文作者NSGUF,想要获得《TensorFlow实战》高清PDF书籍,请关注基数智能公众号jishu2017ai,回复tf,一起加入人工智能AI技术大本营。
相关推荐
- 当Frida来“敲”门(frida是什么)
-
0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...
- 服务端性能测试实战3-性能测试脚本开发
-
前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
-
今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...
- Linux和Windows下:Python Crypto模块安装方式区别
-
一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...
- Python 3 加密简介(python des加密解密)
-
Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...
- 怎样从零开始编译一个魔兽世界开源服务端Windows
-
第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...
- 附1-Conda部署安装及基本使用(conda安装教程)
-
Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...
- 如何配置全世界最小的 MySQL 服务器
-
配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...
- 如何使用Github Action来自动化编译PolarDB-PG数据库
-
随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
-
订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...
- 信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要
-
问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...
- OpenSSH 安全漏洞,修补操作一手掌握
-
1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...
- Linux:lsof命令详解(linux lsof命令详解)
-
介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...
- 幻隐说固态第一期:固态硬盘接口类别
-
前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...
- 新品轰炸 影驰SSD多款产品登Computex
-
分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...
- 一周热门
- 最近发表
-
- 当Frida来“敲”门(frida是什么)
- 服务端性能测试实战3-性能测试脚本开发
- Springboot整合Apache Ftpserver拓展功能及业务讲解(三)
- Linux和Windows下:Python Crypto模块安装方式区别
- Python 3 加密简介(python des加密解密)
- 怎样从零开始编译一个魔兽世界开源服务端Windows
- 附1-Conda部署安装及基本使用(conda安装教程)
- 如何配置全世界最小的 MySQL 服务器
- 如何使用Github Action来自动化编译PolarDB-PG数据库
- 面向NDK开发者的Android 7.0变更(ndk android.mk)
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)