TensorFlow神经网络模型构建主要涉及如下几块:神经元函数、卷积函数、池化函数、分类函数、优化方法。下面分别对这几块进行展开说明:
神经元函数及优化方法
神经网络之所以能解决非线性问题
(如语音、图像识别等),本质上就是激活函数加入了非线性
因素,弥补了线性模型的表达力,把“激活的神经元的特征
”通过函数保留并映射到下一层
。
激活函数不
会更改输入数据的维度
(输入和输出的维度是相同的)。TensorFlow中有如下激活函数,输入均为需要计算的x(Tensor)
,输出均为与x数据类型
相同的张量(Tensor
)。常见的激活函数有Sigmoid,Tanh,ReLU、softplus。
1、Sigmoid函数使用方法
import tensorflow as tf
data=tf.constant([[1.0,2.0],[1.0,2.0],[1.0,2.0]])
with tf.compat.v1.Session() as sess:print(sess.run(tf.sigmoid(data)))
运行结果是如下:
Sigmoid函数的优点
在于它的输出映射在(0,1)
内,单调连续
,非常适合于用作输出层,并且求导
比较容易。缺点在于其软饱和性
。
软饱和性
:指激活函数 h ( x ) h(x) h(x)在取值趋于无穷大
时,它的一阶导数趋于0
。
硬饱和性
:指当 ∣ x ∣ > c |x|>c ∣x∣>c时,其中c为常数, f ′ ( x ) = 0 f^{'}(x)=0 f′(x)=0。
一旦落入软饱和区, f ′ ( x ) f^{'}(x) f′(x)就会变得接近于0,容易产生梯度消失。
梯度消失指在更新模型参数时采用链式求导法则
反向求导
,越往前
梯度越小
。
最终的结果是达到一定深度后梯度对于模型的更新就没有任何贡献。
2、ReLU函数使用方法
ReLU函数定义为 f ( x ) = m a x ( x , 0 ) f(x)=max(x,0) f(x)=max(x,0)。softplus函数定义为 f ( x ) = l o g ( 1 + e x p ( x ) ) f(x)=log(1+exp(x)) f(x)=log(1+exp(x)),可以看作是ReLU函数的平滑版本。Relu和softplus函数代码示例及图形如下:
import numpy as np
import matplotlib.pyplot as plt
def relu_tugrp():x=np.arange(-100, 100, 1)softplus=np.log(1+np.exp(x))relu=np.maximum(0,x)plt.subplot(221)plt.plot(x,softplus,label='softplus')#显示图像的labelplt.legend()#创建一个子图plt.subplot(222)plt.plot(x,relu,label='relu')#显示图像的labelplt.legend()#画网格线plt.grid(True)relu_tugrp()
使用TensorFlow中的relu、reluu6、crelu、softplus函数示例如下:
import tensorflow as tf
data=tf.constant([[-1.0,2.0],[1.0,-2.0],[1.0,2.0]])
with tf.compat.v1.Session() as sess:print(sess.run(tf.nn.relu(data)))print(sess.run(tf.nn.softplus(data)))print(sess.run(tf.nn.relu6(data)))print(sess.run(tf.nn.crelu(data)))
3、dropout函数使用方法
一个神经元将以概率keep_prob
决定是否被抑制。如果被抑制
,则该神经元的输出为0
;如果不被抑制,那么该神经元的输出值将被放大到原来的 1 k e e p p r o b \frac{1}{keep_prob} keepprob1倍。
在默认情况下,每个神经元是否被抑制是相互独立
的。但是否被抑制可以通过noise_shape
来调节。当noise_shape[i]==shape(x)[i]
时,x中的元素是相互独立的。如果shape(x)=[k,l,m,n]
,x中的维度顺序分别为批、行、列和通道
;如果noise_shape(x)=[k,l,m,n]
,那么每个批和通道相互独立,行与列相互关联,要么都是0,要么都是原来的值。示例代码:
import tensorflow as tf
data=tf.constant([[-1.0,2.0,3.0,4.0]])
with tf.compat.v1.Session() as sess:print(sess.run(tf.nn.dropout(data,0.5,noise_shape=[1,4])))print(sess.run(tf.nn.dropout(data,0.5,noise_shape=[1,1])))