包含weightdecay的词条
weight decay
sgd
神经网络经常加入weight decay来防止过拟合,optimizer使用SGD时我们所说的weight decay通常指l2 weight decay(即,加在loss中的l2正则化)。公式1:

在梯度更新时就会加入一项权重衰减项,公式2是原始的weight dacay公式:
这符合weight decay的原始定义,在权重比较大时,因为采用相同的衰减系数w,权重的惩罚也越大(1-w)x t 。此时l2正则可以通过控制权重大小使公式与原始weight decay相同。所以在我们使用sgd时,加入weight decay通常是用l2 weight decay的方式加入。
sgd+momentum
momentum是一种梯度下降中常用的加速技术,公式3:
当此时loss加入l2正则时,l2 weight decay和weight decay不相等,即公式3和公式2的结果不同,l2 weight decay方式的权重衰减项将会受momentum中v项滑动平均影响,但是当前很多实现方式仍然使用l2 weight decay这种方式。
Adam
相比于sgd+momentum,Adam如果使用l2 weight decay将会受到更大的影响,在计算梯度时由于Adam计算步骤中减去项有除以梯度平方的累积,使得减去项偏小。不能实现weight decay的原始定义:权重越大惩罚越大。因此有 AdamW 的提出,也就是直接使用weight decay来进行实现。
深度学习 caffe flatten层怎么配置
flatten层用来扁平参数用,一般用在卷积层与全链接层之间,可以从vgg16网络中可以看出,但是在后来的网络中用GlobalAveragePooling2D代替了flatten层,可以从vgg16与inceptionV3网络对比看出。从参数的对比可以看出,显然这种改进大大的减少了参数的使用量,避免了过拟合现象。
from keras.models import Sequential
from keras.layers.core import Flatten
from keras.layers.convolutional import Convolution2D
from keras.utils.vis_utils import plot_model
model = Sequential()
model.add(Convolution2D(64,3,3,border_mode="same",input_shape=(3,32,32)))
# now:model.output_shape==(None,64,32,32)
model.add(Flatten())
# now: model.output_shape==(None,65536)
plot_model(model, to_file='Flatten.png', show_shapes=True)
扩展资料
应用
计算机视觉
香港中文大学的多媒体实验室是最早应用深度学习进行计算机视觉研究的华人团队。在世界级人工智能竞赛LFW(大规模人脸识别竞赛)上,该实验室曾力压FaceBook夺得冠军,使得人工智能在该领域的识别能力首次超越真人。
语音识别
微软研究人员通过与hinton合作,首先将RBM和DBN引入到语音识别声学模型训练中,并且在大词汇量语音识别系统中获得巨大成功,使得语音识别的错误率相对减低30%。但是,DNN还没有有效的并行快速算法,很多研究机构都是在利用大规模数据语料通过GPU平台提高DNN声学模型的训练效率。
在国际上,IBM、google等公司都快速进行了DNN语音识别的研究,并且速度飞快。
国内方面,阿里巴巴、科大讯飞、百度、中科院自动化所等公司或研究单位,也在进行深度学习在语音识别上的研究。
参考资料来源:百度百科-深度学习
MMsegmentation教程 4: 自定义模型
假设您想增加一个新的叫 MyOptimizer 的优化器,它的参数分别为 a , b , 和 c 。
您首先需要在一个文件里实现这个新的优化器,例如在 mmseg/core/optimizer/my_optimizer.py 里面:
然后增加这个模块到 mmseg/core/optimizer/__init__.py 里面,这样注册器 (registry) 将会发现这个新的模块并添加它:
之后您可以在配置文件的 optimizer 域里使用 MyOptimizer ,
如下所示,在配置文件里,优化器被 optimizer 域所定义:
为了使用您自己的优化器,域可以被修改为:
我们已经支持了 PyTorch 自带的全部优化器,唯一修改的地方是在配置文件里的 optimizer 域。例如,如果您想使用 ADAM ,尽管数值表现会掉点,还是可以如下修改:
使用者可以直接按照 PyTorch 文档教程 去设置参数。
对于优化,一些模型可能会有一些特别定义的参数,例如批归一化 (BatchNorm) 层里面的权重衰减 (weight decay)。
使用者可以通过定制优化器的构造器来微调这些细粒度的优化器参数。
MMSegmentation 里主要有2种组件:
这里我们以 MobileNet 为例,展示如何增加新的主干组件:
在 MMSegmentation 里面,对于所有的分割头,我们提供一个基类解码头 BaseDecodeHead 。
所有新建的解码头都应该继承它。这里我们以 PSPNet 为例,
展示如何开发和增加一个新的解码头组件:
首先,在 mmseg/models/decode_heads/psp_head.py 里添加一个新的解码头。
PSPNet 中实现了一个语义分割的解码头。为了实现一个解码头,我们只需要在新构造的解码头中实现如下的3个函数:
接着,使用者需要在 mmseg/models/decode_heads/__init__.py 里面添加这个模块,这样对应的注册器 (registry) 可以查找并加载它们。
PSPNet的配置文件如下所示:
假设您想添加一个新的损失函数 MyLoss 到语义分割解码器里。
为了添加一个新的损失函数,使用者需要在 mmseg/models/losses/my_loss.py 里面去实现它。
weighted_loss 可以对计算损失时的每个样本做加权。
然后使用者需要在 mmseg/models/losses/__init__.py 里面添加它:
为了使用它,修改 loss_xxx 域。之后您需要在解码头组件里修改 loss_decode 域。
loss_weight 可以被用来对不同的损失函数做加权。
如何给某一层添加L2正则化
tf.nn.l2_loss()和tf.contrib.layers.l2_regularizer(),使用示例如下:
import tensorflow as tf
weights = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32)
sess = tf.InteractiveSession()
# 计算的是所有元素的平方和再除以2
print(tf.nn.l2_loss(weights).eval())
# 等价于
print(tf.contrib.layers.l2_regularizer(1.)(weights).eval())
# output: 45.5
接下来将介绍两种方法将l2正则化项添加到损失函数后:
一、遍历trainable variables添加L2正则化项:
1.遍历可训练参数,将每个参数传入tf.nn.l2_loss()进行计算并相加起来;
2.乘以weight_decay并与base_loss相加。
weight_decay = 0.001
base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))
l2_loss = weight_decay * tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])
loss = base_loss + l2_loss
注意:该过程对每个trainable variable都进行了l2正则化,包括权值w和偏置b。有种说法是如果对偏执b进行l2正则化将会导致欠拟合,一般只需要对权值w进行正则化,所以来看第二种方法。
二、在构造网络层时传入l2正则化函数:
如下所示,在构造网络层时,将'kernel_initializer'参数设为l2正则化函数,则tensorflow会将该权重变量(卷积核)的l2正则化项加入到** tf.GraphKeys.REGULARIZATOIN_LOSSES里。
x = tf.layers.conv2d(x, 512, (3, 3),
padding='same',
activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001)
在计算loss时使用tf.get_collection()来获取tf.GraphKeys.REGULARIZATOIN_LOSSES**,然后相加即可:
base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))
l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + l2_loss, name="loss")
欢迎补充指正。
在神经网络中weight decay起到的做用是什么?momentum
在机器学习或者模式识别中,会出现overfitting,而当网络逐渐overfitting时网络权值逐渐变大,因此,为了避免出现overfitting,会给误差函数添加一个惩罚项,常用的惩罚项是所有权重的平方乘以一个衰减常量之和。其用来惩罚大的权值。
权值衰减惩罚项使得权值收敛到较小的绝对值,而惩罚大的权值。因为大的权值会使得系统出现过拟合,降低其泛化性能。
momentum是一种 参数更新方式。为了避免当某一方向梯度过大的时候,W基本就是改方向更新,从而引入了v,类似惯性的想法。当出现某方向过大的梯度时,保持一部分原来的v,再加上一个较小的梯度更新。这样的梯度下降轨迹就能抑制震荡。