TensorFlow神经网络优化策略学习

在神经网络模型优化的过程中,会遇到许多问题,比如如何设置学习率的问题,我们可通过指数衰减的方式让模型在训练初期快速接近较优解,在训练后期稳定进入最优解区域;针对过拟合问题,通过正则化的方法加以应对;滑动平均模型可以让最终得到的模型在未知数据上表现的更加健壮。

一、学习率的设置

学习率设置既不能过大,也不能过小。TensorFlow提供了一种更加灵活的学习率设置方法——指数衰减法。该方法实现了指数衰减学习率,先使用较大的学习率来快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率,使得模型在训练后期更加稳定,缓慢平滑得达到最优值。

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)

该函数会指数级减小学习率,实现每轮实际优化时的衰减后的学习率decayed_learning_rate = learning_rate * decay_rate ^ (global_step /decay_steps),learning_rate为设定的出事学习率,decay_rate为衰减系数,decay_steps为衰减速度。如下图,参数staircase=False时,学习率变化趋势为浅色部分;staircase=True时为深色部分,使得学习率变化为阶梯函数(staircase function),这种设置的常用应用场景是每完整地过完一遍训练数据,学习率就减小一次。

使用示例:learning_rate =tf.train.exponential_decay(starter_learning_rate, global_step, 100000, 0.96,staircase=True)。

二、过拟合问题

1. 过拟合问题及其解决方法

所谓过拟合问题,指的是当一个模型过于复杂后,它可以很好地记忆每一个训练数据中随机噪声的部分而忘记了要去学习训练数据中通用的趋势。

为了避免过拟合问题,常用的方法是正则化(Regularization),思想是在损失函数中加入刻画模型复杂程度的指标,将优化目标定义为J(θ)+λR(w) ,其中R(w)刻画的是模型的复杂程度,包括了权重项w不包括偏置项b,λ表示模型复杂损失在总损失中的比例。一般来说模型复杂度只由权重w决定。常用的刻画模型复杂度的函数R(w)有两种,一种是L1正则化:

另一种是L2正则化:

无论哪种正则化方式,基本思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪音。区别:L1正则化会让参数变得更稀疏,L2则不会,所谓参数变得更稀疏是指会有更多的参数变为0,可达到类似特征选取的功能。实践中,也可以将L1正则化和L2正则化同时使用:

2. 过拟合问题的TensorFlow解决方案

loss =tf.reduce_mean(tf.square(y_ - y) + tf.contrib.layers.l2_regularizer(lambda)(w)

以上就是一个含L2正则化项的损失函数。第一部分是均方误差损失函数,第二部分就是正则化项。lambda参数表示正则化项的权重,也就是J(θ)+λR(w)中的λ,w为需要计算正则化损失的参数。tf.contrib.layers.l2_regularize()函数可以计算给定参数的L2正则化项,类似地,tf.contrib.layers.l1_regularizer()可以就是那给定参数的L1正则化项。

# 比较L1正则化和L2正则化函数的作用效果
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
  # 0.5*(|1|+|-2|+|-3|+|4|=5.0)
  print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0
  # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow会将L2正则化项除以2使得求导的结果更简洁
  print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5

当神经网络的参数增多以后,上面的定义损失函数的方式会导致loss的定义式很长,可读性差,另外当网络结构复杂后定义网络结构的部分和计算损失函数的部分可能不在同一个函数中,通过变量方式计算损失函数就不方便了。为解决此问题,可以使用TensorFlow中提供的集合(collection)。具体实现见代码部分。

tf.add_to_collection()将变量加入至指定集合中;tf.get_collection()返回一个列表,存储着这个集合中的元素。

三、滑动平均模型

另一个使模型在测试数据上更健壮(robust)滑动平均模型。在采用随机梯度下降算法训练神经网络时,使用滑动平均模型在很多应用中可提高最终模型在测试数据上的表现,GradientDescent和Momentum方式的训练都能够从ExponentialMovingAverage方法中获益。

在TensorFlow中提供的tf.train.ExponentialMovingAverage是一个类class,来实现滑动平均模型。初始化tf.train.ExponentialMovingAverage类对象时,须指定衰减率decay和用于动态控制衰减率的参数num_updates。tf.train.ExponentialMovingAverage对每一个变量维护一个影子变量(shadow variable),该影子变量的初始值就是相应变量的初始值,每次变量更新时,shadow_variable =decay * shadow_variable + (1 - decay) * variable。从公式中可看出,decay决定了模型更新的速度,decay越大模型越趋于稳定,实际应用中decay一般设置为接近1的数。num_updates默认是None,若设置了,则衰减率按min(decay, (1 +num_updates) / (10 + num_updates))计算。

tf.train.ExponentialMovingAverage对象的apply方法返回一个对var_list进行更新滑动平均的操作,var_list必须是list的Variable或Tensor,该操作执行会更新var_list的影子变量shadowvariable。average方法可获取滑动平均后变量的取值。

四、代码呈现

1. 复杂神经网络结构权重L2正则化方法

import tensorflow as tf 

'''''
# 比较L1正则化和L2正则化函数的作用效果
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
  # 0.5*(|1|+|-2|+|-3|+|4|=5.0)
  print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0
  # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow会将L2正则化项除以2使得求导的结果更简洁
  print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5
''' 

# 复杂神经网络结构权重L2正则化方法
# 定义各层的权重,并将该权重的L2正则化项加入至名称为‘losses'的集合
def get_weight(shape, lambda1):
  var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
  tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var))
  return var 

x = tf.placeholder(tf.float32, (None, 2))
y_ = tf.placeholder(tf.float32, (None, 1)) 

layer_dimension = [2,10,5,3,1] # 定义了神经网络每层的节点数
n_layers = len(layer_dimension) 

current_layer = x # 将当前层设置为输入层
in_dimension = layer_dimension[0] 

# 通过循环生成一个5层全连接的神经网络结构
for i in range(1,n_layers):
  out_dimension = layer_dimension[i]
  weight = get_weight([in_dimension,out_dimension], 0.003)
  bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))
  current_layer = tf.nn.relu(tf.matmul(current_layer, weight) + bias)
  in_dimension = layer_dimension[i] 

mse_loss = tf.reduce_mean(tf.square(y_ - current_layer))
tf.add_to_collection('losses', mse_loss)
loss = tf.add_n(tf.get_collection('losses')) # 包含所有参数正则化项的损失函数

2. tf.train.ExponentialMovingAverage使用样例

import tensorflow as tf 

# tf.train.ExponentialMovingAverage使用样例
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False) # 此处step模拟神经网络迭代的轮数
# 定义一个滑动平均的类对象,初始化衰减率decay=0.99,用于动态控制衰减率的参数num_updates
ema = tf.train.ExponentialMovingAverage(0.99, num_updates=step) 

# apply方法返回一个对var_list进行更新滑动平均的操作,var_list必须是list的Variable或Tensor
# 该操作执行会更新var_list的影子变量shadow variable
maintain_averages_op = ema.apply(var_list=[v1]) 

with tf.Session() as sess:
  init_op = tf.global_variables_initializer()
  sess.run(init_op)
  # average方法可获取滑动平均后变量的取值
  print(sess.run([v1, ema.average(v1)])) # [0.0, 0.0] 

  sess.run(tf.assign(v1, 5))
  # min{0.99, (1+step)(10+step)=0.1}=0.1
  # 更新v1的滑动平均值为 0.1*0.0+0.9*5=4.5
  sess.run(maintain_averages_op)
  print(sess.run([v1, ema.average(v1)])) # [5.0, 4.5] 

  sess.run(tf.assign(step, 10000))
  sess.run(tf.assign(v1, 10))
  # min{0.99, (1+step)(10+step)=0.999}=0.99
  # 更新v1的滑动平均值为 0.99*4.5+0.01*10=4.555
  sess.run(maintain_averages_op)
  print(sess.run([v1, ema.average(v1)])) # [10.0, 4.5549998] 

  # 更新v1的滑动平均值为 0.99*4.555+0.01*10=4.60945
  sess.run(maintain_averages_op)
  print(sess.run([v1, ema.average(v1)])) # [10.0, 4.6094499]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • TensorFlow深度学习之卷积神经网络CNN
  • TensorFlow实现卷积神经网络CNN
  • TensorFlow搭建神经网络最佳实践
  • Tensorflow实现卷积神经网络用于人脸关键点识别
  • 利用TensorFlow训练简单的二分类神经网络模型的方法
  • TensorFlow实现RNN循环神经网络
  • tensorflow入门之训练简单的神经网络方法
  • TensorFlow 实战之实现卷积神经网络的实例讲解
  • tensorflow建立一个简单的神经网络的方法
(0)

相关推荐

  • 利用TensorFlow训练简单的二分类神经网络模型的方法

    利用TensorFlow实现<神经网络与机器学习>一书中4.7模式分类练习 具体问题是将如下图所示双月牙数据集分类. 使用到的工具: python3.5    tensorflow1.2.1   numpy   matplotlib 1.产生双月环数据集 def produceData(r,w,d,num): r1 = r-w/2 r2 = r+w/2 #上半圆 theta1 = np.random.uniform(0, np.pi ,num) X_Col1 = np.random.unifo

  • tensorflow入门之训练简单的神经网络方法

    这几天开始学tensorflow,先来做一下学习记录 一.神经网络解决问题步骤: 1.提取问题中实体的特征向量作为神经网络的输入.也就是说要对数据集进行特征工程,然后知道每个样本的特征维度,以此来定义输入神经元的个数. 2.定义神经网络的结构,并定义如何从神经网络的输入得到输出.也就是说定义输入层,隐藏层以及输出层. 3.通过训练数据来调整神经网络中的参数取值,这是训练神经网络的过程.一般来说要定义模型的损失函数,以及参数优化的方法,如交叉熵损失函数和梯度下降法调优等. 4.利用训练好的模型预测

  • TensorFlow 实战之实现卷积神经网络的实例讲解

    本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.相关性概念 1.卷积神经网络(ConvolutionNeural Network,CNN) 19世纪60年代科学家最早提出感受野(ReceptiveField).当时通过对猫视觉皮层细胞研究,科学家发现每一个视觉神经元只会处理一小块区域的视觉图像,即感受野.20世纪80年代,日本科学家提出神经认知机(Neocognitron)的概念,被视为卷积神经网络最初

  • TensorFlow搭建神经网络最佳实践

    一.TensorFLow完整样例 在MNIST数据集上,搭建一个简单神经网络结构,一个包含ReLU单元的非线性化处理的两层神经网络.在训练神经网络的时候,使用带指数衰减的学习率设置.使用正则化来避免过拟合.使用滑动平均模型来使得最终的模型更加健壮. 程序将计算神经网络前向传播的部分单独定义一个函数inference,训练部分定义一个train函数,再定义一个主函数main. 完整程序: #!/usr/bin/env python3 # -*- coding: utf-8 -*- ""&

  • TensorFlow深度学习之卷积神经网络CNN

    一.卷积神经网络的概述 卷积神经网络(ConvolutionalNeural Network,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等.CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程.在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因此

  • tensorflow建立一个简单的神经网络的方法

    本笔记目的是通过tensorflow实现一个两层的神经网络.目的是实现一个二次函数的拟合. 如何添加一层网络 代码如下: def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer Weights = tf.Variable(tf.random_normal([in_size, out_size])) bia

  • Tensorflow实现卷积神经网络用于人脸关键点识别

    今年来人工智能的概念越来越火,AlphaGo以4:1击败李世石更是起到推波助澜的作用.作为一个开挖掘机的菜鸟,深深感到不学习一下deep learning早晚要被淘汰. 既然要开始学,当然是搭一个深度神经网络跑几个数据集感受一下作为入门最直观了.自己写代码实现的话debug的过程和运行效率都会很忧伤,我也不知道怎么调用GPU- 所以还是站在巨人的肩膀上,用现成的框架吧.粗略了解一下,现在比较知名的有caffe.mxnet.tensorflow等等.选哪个呢?对我来说选择的标准就两个,第一要容易安

  • TensorFlow实现卷积神经网络CNN

    一.卷积神经网络CNN简介 卷积神经网络(ConvolutionalNeuralNetwork,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等.CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程.在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因

  • TensorFlow实现RNN循环神经网络

    RNN(recurrent neural Network)循环神经网络 主要用于自然语言处理(nature language processing,NLP) RNN主要用途是处理和预测序列数据 RNN广泛的用于 语音识别.语言模型.机器翻译 RNN的来源就是为了刻画一个序列当前的输出与之前的信息影响后面节点的输出 RNN 是包含循环的网络,允许信息的持久化. RNN会记忆之前的信息,并利用之前的信息影响后面节点的输出. RNN的隐藏层之间的节点是有相连的,隐藏层的输入不仅仅包括输入层的输出,还包

  • TensorFlow神经网络优化策略学习

    在神经网络模型优化的过程中,会遇到许多问题,比如如何设置学习率的问题,我们可通过指数衰减的方式让模型在训练初期快速接近较优解,在训练后期稳定进入最优解区域:针对过拟合问题,通过正则化的方法加以应对:滑动平均模型可以让最终得到的模型在未知数据上表现的更加健壮. 一.学习率的设置 学习率设置既不能过大,也不能过小.TensorFlow提供了一种更加灵活的学习率设置方法--指数衰减法.该方法实现了指数衰减学习率,先使用较大的学习率来快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率,使得模型在训

  • python深度学习TensorFlow神经网络模型的保存和读取

    目录 之前的笔记里实现了softmax回归分类.简单的含有一个隐层的神经网络.卷积神经网络等等,但是这些代码在训练完成之后就直接退出了,并没有将训练得到的模型保存下来方便下次直接使用.为了让训练结果可以复用,需要将训练好的神经网络模型持久化,这就是这篇笔记里要写的东西. TensorFlow提供了一个非常简单的API,即tf.train.Saver类来保存和还原一个神经网络模型. 下面代码给出了保存TensorFlow模型的方法: import tensorflow as tf # 声明两个变量

  • 关于Tensorflow分布式并行策略

    tensorFlow中主要包括了三种不同的并行策略,其分别是数据并行.模型并行.模型计算流水线并行,具体参考Tenssorflow白皮书,在接下来分别简单介绍三种并行策略的原理. 数据并行 一个简单的加速训练的技术是并行地计算梯度,然后更新相应的参数.数据并行又可以根据其更新参数的方式分为同步数据并行和异步数据并行,同步的数据并行方式如图所示,tensorflow图有着很多的部分图模型计算副本,单一的客户端线程驱动整个训练图,来自不同的设备的数据需要进行同步更新.这种方式在实现时,主要的限制就是

  • tensorflow构建BP神经网络的方法

    之前的一篇博客专门介绍了神经网络的搭建,是在python环境下基于numpy搭建的,之前的numpy版两层神经网络,不能支持增加神经网络的层数.最近看了一个介绍tensorflow的视频,介绍了关于tensorflow的构建神经网络的方法,特此记录. tensorflow的构建封装的更加完善,可以任意加入中间层,只要注意好维度即可,不过numpy版的神经网络代码经过适当地改动也可以做到这一点,这里最重要的思想就是层的模型的分离. import tensorflow as tf import nu

  • win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法

    避坑1:RTX30系列显卡不支持cuda11.0以下版本,具体上限版本可自行查阅: 方法一,在cmd中输入nvidia-smi查看 方法二: 由此可以看出本电脑最高适配cuda11.2.1版本: 注意需要版本适配,这里我们选择TensorFlow-gpu = 2.5,cuda=11.2.1,cudnn=8.1,python3.7 接下来可以下载cudn和cundnn: 官网:https://developer.nvidia.com/cuda-toolkit-archive 下载对应版本exe文件

  • 来谈谈搜索引擎优化策略

    为什么有的网站能在搜索引擎上排名很好,而有的却连找到找不到呢?这个秘密何在呢?正如免费搜索引擎上的指导方针所说,有五个因素你是必须铭记于心的: 1. 你网站的内容与主题. 2. 每页的关键字数. 3. 关键字放置的位置. 4. 点击量. 5. 链接数量.  1. 搜索引擎优化策略:网站内容 网站的实际内容是你网络优化策略的一个重要的因素.如果你想你的网站能在搜索结果中排得靠前,在你的网站中必须有实际的内容.搜索引擎的蜘蛛基本上是一个瞎子.他们只能对你网页内容进行判断你网站的质量,而不能从图片.f

  • Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)

    anaconda 集成了很多科学计算中所需要的包,如numpy,scipy等等,具体查看anaconda中已经预先安装配置好的包有哪些,可以通过cmd命令,输入conda list 查看,如下图所示: 但是,因为实际需求,我们会需要导入列表中没有的第三方包,如gemsim,在anaconda中,我们可以参考以下步骤安装所需要的第三方包:         1.启动anaconda 命令窗口: 开始 > 所有程序 > anaconda >anaconda prompt    2.安装gens

随机推荐