2018-07-20 15:37:26 weixin_38569817 阅读数 170
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39613 人正在学习 去看看 唐宇迪
2017-03-10 08:54:21 LIYUAN123ZHOUHUI 阅读数 2651
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39613 人正在学习 去看看 唐宇迪

超参数(Hyper-Parameter)是困扰神经网络训练的问题之一,因为这些参数不可通过常规方法学习获得。

神经网络经典五大超参数:

学习率(Leraning Rate)、权值初始化(Weight Initialization)、网络层数(Layers)

单层神经元数(Units)、正则惩罚项(Regularizer|Normalization)

这五大超参数使得神经网络更像是一门实践课,而不是理论课。

懂神经网络可能只要一小时,但是调神经网络可能要几天。

https://zhuanlan.zhihu.com/p/24720954#!


英文介绍:]

http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html

知乎上的一些比较好的解答:https://www.zhihu.com/question/41631631?from=profile_question_card

https://zhuanlan.zhihu.com/p/24720954#!


没做过CNN,RNN,调过连续值DNN,以下经验仅限于CTR
1.样本要足够随机,防止大数据淹没小数据
2.样本要做归一化
3.激活函数要视样本输入选择
4.minibatch很重要,几百到几千是比较合适的(很大数据量的情况下),无论是cnn还是rnn,batch normalization都有用,不一定结果提高几个点,收敛快多了
5.learning rate很重要,可以直接用adagrad or adadelta,省去一些麻烦,然后把冲量调到0.9以上
6.权重初始化,可用高斯分布乘上一个很小的数
7.loss不降了lr就除10


调了快1年的rnn, 深刻的感受到,深度学习是一门实验科学,下面是一些炼丹心得,后面会不断补充. 有问题的地方,也请大家指正.
  1. 参数初始化,下面几种方式,随便选一个,结果基本都差不多.

    1. uniform
      W = np.random.uniform(low=-scale, high=scale, size=shape)
    2. glorot_uniform
      scale = np.sqrt(6. / (shape[0] + shape[1]))
      np.random.uniform(low=-scale, high=scale, size=shape)
    3. 高斯初始化:
      w = np.random.randn(n) / sqrt(n),n为参数数目
      激活函数为relu的话,推荐
      w = np.random.randn(n) * sqrt(2.0/n)
    4. svd ,对RNN效果比较好,可以有效提高收敛速度.
  2. 数据预处理方式

    1. zero-center ,这个挺常用的.
      X -= np.mean(X, axis = 0) # zero-center
      X /= np.std(X, axis = 0) # normalize
    2. PCA whitening,这个用的比较少.
  3. 训练技巧

    1. 要做梯度归一化,即算出来的梯度除以minibatch size
    2. clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
    3. dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd效果更好. dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:arxiv.org/abs/1409.2329
    4. adam,adadelta等,在小数据上,我这里实验的效果不如sgd,如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.
    5. 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.
    6. rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
    7. word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
    8. 尽量对数据做shuffle
    9. LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:jmlr.org/proceedings/pa, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
  4. Ensemble: 论文刷结果的终极核武器,深度学习中一般有以下几种方式

    1. 同样的参数,不同的初始化方式
    2. 不同的参数,通过cross-validation,选取最好的几组
    3. 同样的参数,模型训练的不同阶段
    4. 不同的模型,进行线性融合. 例如RNN和传统模型.
下面的网站也有一些总结:
http://blog.csdn.net/chenzhi1992/article/details/52905569


2019-03-03 15:26:44 qq_23304241 阅读数 109
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39613 人正在学习 去看看 唐宇迪

1、深度学习(deep learning)优化调参细节(trick)  https://blog.csdn.net/h4565445654/article/details/70477979

2、如何调试神经网络(深度神经网络)?https://blog.csdn.net/dcxhun3/article/details/53924524

3、深度学习调参策略https://blog.csdn.net/xiaocong1990/article/details/72585696

4、深度学习的过拟合问题https://blog.csdn.net/mrgiovanni/article/details/52167016

5、训练loss不下降原因集合https://blog.csdn.net/jacke121/article/details/79874555

2019-01-21 19:35:58 gukedream 阅读数 106
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39613 人正在学习 去看看 唐宇迪

调参经验

  • 模型选择

通常我会使用一个简单的CNN模型(这个模型一般包含5个卷积层)将数据扔进去训练跑出一个baseline,这一步工作主要是为了验证数据集的质量。如果这个模型训练结果很差就不要先调试模型,需要检查一下你的训练集数据,看看图像的质量,图像标签是否正确,模型的代码是否正确等等,否则就是在做无用功,毕竟:garbage in,garbage out

 

  • 超参数的选择

调参是项技术活,调得好CVPR,调不好下海搬砖

通常要选的超参数有卷积核大小和数目,批训练(batch size)大小,优化函数(optimizer),学习率等等,一般来说卷积核用3*3或者5*5的,batch szie 用16或者32不会过拟合,optimizer用Adam(学习率建议用论文中默认的,我试过调整Adam的学习率,效果或都没有默认的好),激活函数用relu这个应该是大家的共识吧。还有就是先跑几百个epoch看loss的变化趋势。

 

  • 数据预处理

训练数据对模型的影响是决定性的,提高训练数据的质量,就是在提高模型的准确率。

图像预处理的时候一般我会抽出部分图像观察,对图像中的噪声进行滤波,图像标签要验证一下,其他的预处理就结合实际情况来看了。一般来说,数据清洗的工作占比是多于写模型的工作(通常是7:3)。

 

  • 数据增强

数据增强已经是训练深度网络的常规操作了,这味丹药有利于增加训练数据量,减少网络过拟合程度,男女老少,居家旅行必备良药。

常用的数据增强方法包括:图像缩放图像翻转图像裁剪图像色彩的饱和度亮度和对比度变换

海康威视在ImageNet上曾经用过PCA Jittering的方法,但是由于这个方法的计算量过大,我没有在自己的训练中使用过。他们还使用了有监督的数据增强的方法,有兴趣的同学可以研究一下。

有监督的数据增强方法
  • 数据不平衡的处理

如果训练数据中各类样本数目差距较大,很有可能会导致部分类别的准确率很低,从根本上解决样本不平衡的问题就是要把样本变平衡。

一种是增加样本少的类别的图像数目,用上述的数据增强方法。

另一种就是直接将样本多的类别图像数目减少,可以说是非常简单粗暴了。

当然,也有人提出类别权重的方法,增加少样本在训练时的权重,间接地增强了图像数目。

 

  • 自己的数据生成器

一开始用框架接口,慢慢地写自己的接口。特别是当任务变得复杂,数据规模变大时,框架提供的接口不能满足你的需求,这时你需要有自己的data generation function。例如,我使用keras时需要对输入图片进行多标签任务的训练,而keras本身不包含这样的接口,所以需要自己实现一个data generation function。通过查看官方文档和相关接口实现了一个多标签数据生成器,代码如下:

# 训练集/测试集数据生成器,替换flow_from_directory()
def flow_from_2DList(directory=None, target_size=(256, 256), 
    color_mode='rgb', classes=None, class_mode='categorical', 
    batch_size=1, shuffle=True, seed=None, save_to_dir=None, 
    save_prefix='', save_format='png', follow_links=False, 
    subset=None, interpolation='nearest'):
    """   
    A DirectoryIterator yielding tuples of (x, y) 
    where x is a numpy array containing a batch of images 
    with shape (batch_size, *target_size, channels) and 
    y is a numpy array of corresponding labels.
    """
    # 每个epoch都要shuffle数据集
    random.shuffle(directory)

    # 参数初始化
    if directory is None:   # python函数的默认参数如果是list这种可变类型,
                            # 需要在函数体内进行初始化,
                            # 否则会在上次的结果后继续使用list
        directory = [ [ 99999 for x in range(4) ] for y in range(batch_size) ]

    list_len = len(directory)
    print('\nlength of directory:', list_len, '\n\n')
    print('\nbatch_size:', batch_size, '\n\n')
    step = list_len//batch_size   # 向下取整得到一个epoch需要多少个step
    print('\nsetp:',step,'\n\n')

    for i in range(step):
        # 每行一个记录读取训练/测试数据,返回(x,[y1,y2,y3])
        batch_images = []

        y_label_age = np.zeros((batch_size, 100))
        y_label_sex = np.zeros((batch_size, 2))
        y_label_sick = np.zeros((batch_size, 2))

        batch_directory = directory[i*batch_size : (i+1)*batch_size].copy()

        batch_size_num = 0 # 循环计数器

        for record in batch_directory:
            file_path = record[0]
            image = cv2.imread(file_path)
            image = cv2.resize(image, target_size)

            batch_images.append(image)

            age = record[1]
            sex = record[2]
            sick = record[3]

            # 将age,sex,sick转换成one-hot编码         
            if age != 0:
                age -= 1
            age = to_categorical(age, num_classes = 100)
   
            sex = to_categorical(sex-1, num_classes = 2)   
            sick = to_categorical(sick-1, num_classes = 2)

            y_label_age[batch_size_num,:] = age
            y_label_sex[batch_size_num,:] = sex
            y_label_sick[batch_size_num,:] = sick

            batch_size_num += 1

        batch_images = np.array(batch_images)
        y_labels = [y_label_age, y_label_sex, y_label_sick]

        data = (batch_images, y_labels)    
      
        yield data

 

  • 其他提示

        当然,具体任务不同可能某些经验不能适用,实践是检验真理的唯一标准

 

2017-04-22 23:00:10 h4565445654 阅读数 10528
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39613 人正在学习 去看看 唐宇迪

深度学习中的优化调参细节总结。


深度学习中的技巧:

  • 初始化参数尽量小一些,这样 softmax 的回归输出更加接近均匀分布,使得刚开始网络并不确信数据属于哪一类;另一方面从数值优化上看我们希望我们的参数具有一致的方差(一致的数量级),这样我们的梯度下降法下降也会更快。同时为了使每一层的激励值保持一定的方差,我们在初始化参数(不包括偏置项)的方差可以与输入神经元的平方根成反比
  • 学习率(learning rate)的设置应该随着迭代次数的增加而减小,个人比较喜欢每迭代完一次epoch也就是整个数据过一遍,然后对学习率进行变化,这样能够保证每个样本得到了公平的对待
  • 滑动平均模型,在训练的过程中不断的对参数求滑动平均这样能够更有效的保持稳定性,使其对当前参数更新不敏感。例如加动量项的随机梯度下降法就是在学习率上应用滑动平均模型。
  • 在验证集上微小的提升未必可信,一个常用的准则是增加了30个以上的正确样本,能够比较确信算法有了一定的提升
  • 如上图所示,不要太相信模型开始的学习速度,这与最终的结果基本没有什么关系。一个低的学习速率往往能得到较好的模型。
  • 在深度学习中,常用的防止过拟合的方法除了正则化,dropout和pooling之外,还有提前停止训练的方法——就是看到我们在验证集的上的正确率开始下降就停止训练。
  • 当激活函数是RELU时,我们在初始化偏置项时,为了避免过多的死亡节点(激活值为0)一般可以初始化为一个较小的正值。
  • 基于随机梯度下降的改进优化算法有很多种,在不熟悉调参的情况,建议使用Adam方法
  • 训练过程不仅要观察训练集和测试集的loss是否下降、正确率是否提高,对于参数以及激活值的分布情况也要及时观察,要有一定的波动。
  • 如果我们设计的网络不work,在训练集的正确率也很低的话,我们可以减小样本数量同时去掉正则化项,然后进行调参,如果正确率还是不高的话,就说明我们设计的网络结果可能有问题。
  • fine-tuning的时候,可以把新加层的学习率调高,重用层的学习率可以设置的相对较低。
  • 在隐藏层的激活函数,tanh往往比sigmoid表现更好。
  • 针对梯度爆炸的情况我们可以使用梯度截断来解决,尤其在RNN中由于存在相同的循环结构,导致相同参数矩阵的连乘,更加容易产生梯度爆炸。当然,使用LSTM和GRU等更加优化的模型往往是更好地选择。
  • 正则化输入,也就是让特征都保持在0均值和1方差。(注意做特征变换时请保持训练集合测试集进行了相同的变化)
  • 梯度检验:当我们的算法在训练出现问题而进行debug时,可以考虑使用近似的数值梯度和计算的梯度作比较检验梯度是否计算正确。
  • 搜索超参数时针对经典的网格搜索方法,这里有两点可以改善的地方:1)不用网格,用随机值,因为这样我们一次实验参数覆盖范围更广,尤其在参数对结果影响级别相差很大的情况下。2)不同数量级的搜索密度是不一样的,不能均分。

卷积神经网络(CNN)中的独有技巧:

  • CNN中将一个大尺寸的卷积核可以分解为多层的小尺寸卷积核或者分成多层的一维卷积。这样能够减少参数增加非线性
  • CNN中的网络设计应该是逐渐减小图像尺寸,同时增加通道数,让空间信息转化为高阶抽象的特征信息。
  • CNN中可以利用Inception方法来提取不同抽象程度的高阶特征,用ResNet的思想来加深网络的层数。
  • CNN处理图像时,常常会对原图进行旋转、裁剪、亮度、色度、饱和度等变化以增大数据集增加鲁棒性。

深度学习调参介绍

阅读数 264

深度学习调参经验

阅读数 682

没有更多推荐了,返回首页