如何使用Python构建Tensorflow的归一化层?

如何使用Python构建Tensorflow的归一化层?

Tensorflow是一个广泛使用的深度学习开源框架之一。其中,在神经网络优化过程中,序列数据处理比图像处理等数据类型更加困难。归一化层可用于预处理序列数据,其可以规范化输入数据的数值范围。Tensorflow中有多种归一化方式,此文将介绍如何基于Python构建Tensorflow的归一化层。

更多Python文章,请阅读:Python 教程

归一化层

归一化层是人工神经网络中一种重要的层次,其在模型训练阶段中使用平均数和标准差或缩放和移位的方式对输入数据进行规范化。归一化层的优点包括:

  • 增加学习速度
  • 预防梯度爆炸
  • 减少过拟合

TensorFlow归一化层

TensorFlow提供不同的归一化方法符合不同的模型需求。比如,tf.nn.batch_normalizationtf.contrib.layers.batch_normtf.contrib.layers.layer_norm及‘tf.contrib.layers.instance_norm’。

其中,tf.nn.batch_normalization是TensorFlow定义的标准归一化方法,可以通过tf.nn.batch_normalization类实现。为了演示如何使用此类,我们假设要在一个Tensorflow模型中对输入数据进行归一化。

首先,导入所需的模块:

import tensorflow as tf
import numpy as np

随后,假设有一个矩阵x,其形状为(m, n),需要进行归一化。先定义两个placeholder x和y,分别用于输入和处理:

x = tf.placeholder(tf.float32, shape=(None, n))
y = tf.placeholder(tf.float32, shape=(None, n))

然后,定义一个tf.nn.batch_normalization类并初始化,以规范化数据:

normalize = tf.nn.batch_normalization(x, mean = 0, variance = 1, 
                                offset = None, scale = None,
                                variance_epsilon = 0.0001)

在这里, normalize接受到归一化的值,后续可通过同样的过程进行后续数据处理。 在上述代码中:

  • x是一个输入的占位符;
  • meanvariance分别是均值mean和标准差variance,可在normalize时使用,也可以使用tf.nn.moments(x,axes)计算;
  • offsetscale分别是缩放和位移用于归一化,可用于附加线性映射到归一化的结果;
  • variance_epsilon是为了避免分母为零的情况。

对于均值和方差,我们可以按如下方式指定:

mean, variance = tf.nn.moments(x, axes = [0])

在这里,axes=[0]表示对第一个维度求标准差和方差。在此之前,必须将x输入至神经网络时,对其进行归一化:

x_norm = (x - mean) / tf.sqrt(variance + 0.0001)

现在,x_norm 是归一化后的输入,可以用在神经网络的下一层中。

归一化层的嵌入式模型

在许多深度学习的实际问题中,设计可以在小型芯片上执行的深度学习模型是至关重要的,此时归一化层的嵌入式模型就很有用处。

通过 Python 语言的自动推导,TensorFlow可以将浮点运算转换为嵌入式可执行代码,该代码可在嵌入式系统上运行,从而加快模型执行速度。对于一些嵌入式模型设计者,需要使用TensorFlow提供的嵌入式模型工具包进行归一化层的设计。

例如,对于一个最小嵌入式网络来说,在定义神经网络时,可以用如下的代码来定义一个归一化层。在这个例子中,tf.nn.local_response_normalization方法用于给每个输入的像素进行归一化:

input_layer = tf.placeholder(tf.float32, [None, 28, 28, 1])
conv1 = tf.layers.conv2d(inputs=input_layer, 
                         filters=32, 
                         kernel_size=[5, 5], 
                         padding="same", 
                         activation=tf.nn.relu)
pool1 = tf.layers.max_pooling2d(inputs=conv1, 
                                pool_size=[2, 2], 
                                strides=2)
lrn1 = tf.nn.local_response_normalization(pool1, depth_radius=5, 
                                           bias=2, alpha=1e-4, beta=0.75)

在这里,depth_radius是用于确定归一化范围的半径,bias是用于避免分母为0的修正项,alphabeta控制分母为归一化的参数。在池化后,这一层会在下一步卷积或全链接层之前先进行归一化操作,可避免某些更高层的神经元被线性激活函数饱和,从而提高模型性能。

结论

通过本文,我们了解到TensorFlow提供了多种归一化方法,本文重点关注了tf.nn.batch_normalizationtf.nn.local_response_normalization方法。对于神经网络的优化过程,归一化层是一种十分有用的方法,在机器学习及深度学习模型中的应用越来越广泛。在实际应用过程中,根据情况选择不同的归一化层方法,可以达到更好的结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程