【阿迪的深度学习之路】卷积神经网络扫盲

 

Dropout

Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

参考 深度学习中Dropout原理解析:https://cloud.tencent.com/developer/news/246964

 

什么是过拟合?

在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。

 

函数说明:

tf.nn.dropout(
    x,
    keep_prob,
    noise_shape=None,
    seed=None,
    name=None
)

参数说明:

x:指输入,输入tensor

keep_prob: float类型,每个元素被保留下来的概率,设置神经元被选中的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5

noise_shape  : 一个1维的int32张量,代表了随机产生“保留/丢弃”标志的shape。

seed : 整形变量,随机数种子。

name:指定该操作的名字

 

dropout必须设置概率keep_prob,并且keep_prob也是一个占位符,跟输入是一样的

keep_prob = tf.placeholder(tf.float32)

train的时候才是dropout起作用的时候,test的时候不应该让dropout起作用

学习率

在Tensorflow中,为解决设定学习率(learning rate)问题,提供了指数衰减法来解决。

通过tf.train.exponential_decay函数实现指数衰减学习率。

步骤:

1.首先使用较大学习率(目的:为快速得到一个比较优的解);

 2.然后通过迭代逐步减小学习率(目的:为使模型在训练后期更加稳定);

函数说明:

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

参数说明:

earning_rate:初始学习率

global_step:用于衰减计算的全局步骤。 一定不为负数。喂入一次 BACTH_SIZE 计为一次 global_step

decay_steps:衰减速度,一定不能为负数,每间隔decay_steps次更新一次learning_rate值

decay_rate:衰减系数,衰减速率,其具体意义参看函数计算方程(对应α^t中的α)。

staircase:若 ‘ True ’ ,则学习率衰减呈 ‘ 离散间隔 ’ (discrete intervals),具体地讲,`global_step / decay_steps`是整数除法,衰减学习率( the decayed learning rate )遵循阶梯函数;若为 ’ False ‘ ,则更新学习率的值是一个连续的过程,每步都会更新学习率。

返回值:

与初始学习率 ‘ learning_rate ’ 相同的标量 ’ Tensor ‘ 。

 

梯度下降

 

梯度下降法可分为:

1、批量梯度下降:遍历全部数据集算一次损失函数,计算量大,计算速度慢,不支持在线学习。

2、随机梯度下降(stochastic gradient descent):每处理一个数据就算一次损失函数,该方法速度快,但是收敛性不好,可能在最优点附近晃来晃去,命中不到最优点。

3、小批量梯度下降:以上两种方法的折中方法,该方法把数据分为若干批,按批来更新参数。

 

在深度学习中,一般采用小批量梯度下降法进行训练,即每次训练在训练集中取batch_size个样本训练;

1、batch_size:批大小。

2、iteration:1个iteration等于使用batch_size个样本训练一次。

3、epoch:1个epoch等于使用训练集中的全部样本训练一次。

举例,训练集有1000个样本,batchsize=10,那么,训练完整个样本集需要:100次iteration,1次epoch。

一次epoch 总处理数量 = iterations次数 * batch_size大小

池化

池化的作用:

1、对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征;

2、Translation Invariance, 表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就使网络的鲁棒性增强了,有一定抗扰动的作用

函数说明:

tf.nn.max_pool(
  value,
  ksize,
  strides,
  padding,
  name=None
)

参数说明:

value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

padding:和卷积类似,可以取'VALID' 或者'SAME'

返回值:

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式。

参考 【TensorFlow】tf.nn.max_pool实现池化操作:https://blog.csdn.net/mao_xiao_feng/article/details/53453926

 

卷积

函数说明:

tf.nn.conv2d(
  input,
  filter,
  strides,
  padding,
  use_cudnn_on_gpu=None,
  name=None
)

参数说明:

input: 指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

filter: 相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式(后面会介绍)

use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

返回值:

结果返回一个Tensor,这个输出,就是我们常说的feature map

参考 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?https://blog.csdn.net/mao_xiao_feng/article/details/78004522

 

tf.truncated_normal

函数说明:

tf.truncated_normal(
  shape,
  mean=0.0,
  stddev=1.0,
  dtype=tf.float32,
  seed=None,
  name=None
)

参数说明:

shape: 一维的张量,也是输出的张量。

mean: 正态分布的均值。

stddev: 正态分布的标准差。

dtype: 输出的类型。

seed: 一个整数,当设置之后,每次生成的随机数都一样。

name: 操作的名字。

 

从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。这是一个截断的产生正太分布的函数,就是说产生正太分布的值如果与均值的差值大于两倍的标准差,那就重新生成。和一般的正太分布的产生随机数据比起来,这个函数产生的随机数与均值的差距不会超过两倍的标准差,但是一般的别的函数是可能的。生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。 

 

tf.Variable

通过创建Variable类的实例向graph中添加变量。

 

tf.constant

函数说明:

tf.constant(value,dtype=None,shape=None,name=’Const’) 

创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。 
如果是一个数,那么这个常亮中所有值的按该数来赋值。 
如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。

 

tf.summary.histogram

将张量分布情况以直方图的形式在TensorBoard直方图仪表板上显示.

 

tf.summary.scalar

tf.summary.scalar(name,tensor,collections=None,family=None)

 

参数说明:

name:生成节点的名字,也会作为TensorBoard中的系列的名字。

tensor:包含一个值的实数Tensor。

collection:图的集合键值的可选列表。新的求和op被添加到这个集合中。缺省为[GraphKeys.SUMMARIES]

family:可选项;设置时用作求和标签名称的前缀,这影响着TensorBoard所显示的标签名。

返回值:一个字符串类型的标量张量,包含一个Summaryprotobuf

返回错误:ValueErrortensor有错误的类型或shape。

函数求出的Summary中有一个包含输入tensor的Tensor.proto

 

tf.nn.l2_loss

函数说明:

tf.nn.l2_loss(
    t,
    name=None
)

参数说明:

t:一个张量(tensor),类型可以为:half, bfloat16, float32, float64

name:op的一个名字,即为这个操作取个名字

作用:不使用sqrt计算张量的L2范数的一半

返回值:一个tensor,数据类型和t相同,是一个标量

计算公式:output = sum(t**2)/2,简单的可以理解成张量中的每一个元素进行平方,然后求和,最后乘一个1/2

 

正则化

在《Deep Learning》书中定义正则化为“对学习算法的修改——旨在减少泛化误差而不是训练误差”,《统计学习方法》中认为正则化是选择模型的一种方法。我个人比较倾向于后一种解释。在上一篇博客也提到了,模型可以看成是一个高维函数,当模型参数确定了,这个函数也就确定了。对于不同的模型参数,能得到千千万万个不同的模型,我们将这所有的可能得到的模型称之为假设空间。理想情况下,我们希望真实数据的生成过程也包括在这个假设空间中,然后我们只需要通过训练将代表该生成过程的一组模型参数找出来即可。然而,真实数据的生成过程几乎肯定在假设空间之外,我们做的事无非是从已有的假设空间中通过训练找到一个泛化能力优秀的拟合模型(即尽量匹配真实数据生成过程)。正则化可以帮助我们从假设空间中找到这样一个模型:训练误差较低,而且模型复杂度也较小。所以正则化是一种选择模型的方法。


正则化的作用是选择经验风险与模型复杂度同时较小的模型。在实际深度学习场景中我们几乎总是会发现,最好的拟合模型(从最小化泛化误差的意义上)是一个适当正则化的大型模型。

参考 小结深度学习中的正则化(超详细分析):https://blog.csdn.net/qq_16137569/article/details/81584165

 

卷积

 函数说明:

tf.nn.conv2d(
  input,
  filter,
  strides,
  padding,
  use_cudnn_on_gpu=None,
  name=None
)

参数说明:

input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式(后面会介绍)

use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true

返回值:

结果返回一个Tensor,这个输出,就是我们常说的feature map,shape仍然是[batch, height, width, channels]这种形式。

参考 TF-卷积函数 tf.nn.conv2d 介绍https://www.cnblogs.com/qggg/p/6832342.html

 

激活函数

函数说明:

tf.nn.relu(features, name = None)

 

  这个函数的作用是计算激活函数 relu,即 max(features, 0)。即将大于0的数保持不变,小于0的数置为0。

 

tf.reshape

函数说明:

tf.reshape(tensor,shape,name=None)

 

参数说明:

第1个参数为被调整维度的张量。

第2个参数为要调整为的形状。

返回值:

返回一个shape形状的新tensor

注意shape里最多有一个维度的值可以填写为-1,表示自动计算此维度。

 

tf.multiply

函数说明:

 tf.multiply(x, y, name=None) 

 

参数说明: 
x: 一个类型为:half, float32, float64, uint8, int8, uint16, int16, int32, int64, complex64, complex128的张量。 
y: 一个类型跟张量x相同的张量。  
返回值:x * y element-wise.  

注意: 
(1)multiply这个函数实现的是元素级别的相乘,也就是两个相乘的数元素各自相乘,而不是矩阵乘法,注意和tf.matmul区别。 
(2)两个相乘的数必须有相同的数据类型,不然就会报错。

 

tf.matmul

函数说明:

 tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None) 

 

参数说明: 
a: 一个类型为 float16, float32, float64, int32, complex64, complex128 且张量秩 > 1 的张量。 
b: 一个类型跟张量a相同的张量。 
transpose_a: 如果为真, a则在进行乘法计算前进行转置。 
transpose_b: 如果为真, b则在进行乘法计算前进行转置。 
adjoint_a: 如果为真, a则在进行乘法计算前进行共轭和转置。 
adjoint_b: 如果为真, b则在进行乘法计算前进行共轭和转置。 
a_is_sparse: 如果为真, a会被处理为稀疏矩阵。 
b_is_sparse: 如果为真, b会被处理为稀疏矩阵。 
name: 操作的名字(可选参数) 
返回值: 一个跟张量a和张量b类型一样的张量且最内部矩阵是a和b中的相应矩阵的乘积。 


注意: 
(1)输入必须是矩阵(或者是张量秩 >2的张量,表示成批的矩阵),并且其在转置之后有相匹配的矩阵尺寸。 
(2)两个矩阵必须都是同样的类型,支持的类型如下:float16, float32, float64, int32, complex64, complex128。 

 

注意: 在TensorFlow的世界里,变量的定义和初始化是分开的,所有关于图变量的赋值和计算都要通过tf.Session的run来进行。想要将所有图变量进行集体初始化时应该使用tf.global_variables_initializer。

 

softmax交叉熵

函数说明:

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

 

参数说明:

第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes

第二个参数labels:实际的标签,大小同上

 

这个函数的功能就是计算labels和logits之间的交叉熵(cross entropy)。

 

参考:(理解这部分非常重要)

卷积神经网络系列之softmax,softmax loss和cross entropy的讲解:https://blog.csdn.net/u014380165/article/details/77284921

对tf.nn.softmax的理解:https://blog.csdn.net/wgj99991111/article/details/83586508

 

tf.reduce_mean

tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

 

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

 

优化器

优化器类别:

梯度下降法(Gradient Descent)
1. 标准梯度下降法(GD)
2. 批量梯度下降法(BGD)
3. 随机梯度下降法(SGD)

动量优化法
1. Momentum
2. NAG

自适应学习率优化算法
1.AdaGrad算法
2.RMSProp算法
3.AdaDelta算法
4.Adam算法

参考 机器学习-各种优化器Optimizer的总结与比较:https://blog.csdn.net/weixin_40170902/article/details/80092628

 

常用的3个优化器:

tf.train.GradientDescentOptimizer.__init__(
    learning_rate,
    use_locking=False,
    name='GradientDescent'
)
tf.train.AdamOptimizer.__init__(
    learning_rate=0.001, 
    beta1=0.9, 
    beta2=0.999, 
    epsilon=1e-08, 
    use_locking=False, 
    name='Adam'
)
tf.train.MomentumOptimizer.__init__(
    learning_rate,
    momentum,
    use_locking=False,
    name='Momentum',
    use_nesterov=False
)

 

tf.train.Optimizer.minimize(
  loss,
  global_step=None,
  var_list=None,
  gate_gradients=1,
  aggregation_method=None,
  colocate_gradients_with_ops=False,
  name=None,
  grad_loss=None
)

 

tf.add_to_collection

tf.add_to_collection(‘list_name’, element)

将元素element添加到列表list_name中

 

numpy.argmax

numpy.argmax(a, axis=None, out=None)

返回沿轴axis最大值的索引。

 

参数说明:

a : array_like 数组
axis : int, 可选
默认情况下,索引的是平铺的数组,否则沿指定的轴。
out : array, 可选
如果提供,结果以合适的形状和类型被插入到此数组中。
Returns: index_array : ndarray of ints
索引数组。它具有与a.shape相同的形状,其中axis被移除。

 

=======================================================

注:所有内容都来自互联网,仅作整理供学习交流,感谢网友

posted @ 2019-06-12 22:56  赤热之冰  阅读(104)  评论(0)    收藏  举报