2017-03-10 08:54:21 LIYUAN123ZHOUHUI 阅读数 2712
  • TensorFlow实战进阶:手把手教你做图像识别应用

    TensorFlow实战教程,图像识别应用示例教程,该课程特邀请AI100 阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解TensorFlow实现工业级图像识别应用的详细过程。具体内容包括:TensorFlow基础和模型选择,TensorFlow训练和验证模型,调参、模型上线和部署。

    8810 人正在学习 去看看 AI100讲师

超参数(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 阅读数 127
  • TensorFlow实战进阶:手把手教你做图像识别应用

    TensorFlow实战教程,图像识别应用示例教程,该课程特邀请AI100 阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解TensorFlow实现工业级图像识别应用的详细过程。具体内容包括:TensorFlow基础和模型选择,TensorFlow训练和验证模型,调参、模型上线和部署。

    8810 人正在学习 去看看 AI100讲师

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 阅读数 124
  • TensorFlow实战进阶:手把手教你做图像识别应用

    TensorFlow实战教程,图像识别应用示例教程,该课程特邀请AI100 阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解TensorFlow实现工业级图像识别应用的详细过程。具体内容包括:TensorFlow基础和模型选择,TensorFlow训练和验证模型,调参、模型上线和部署。

    8810 人正在学习 去看看 AI100讲师

调参经验

  • 模型选择

通常我会使用一个简单的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

 

  • 其他提示

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

 

2019-06-19 11:56:13 u012384285 阅读数 370
  • TensorFlow实战进阶:手把手教你做图像识别应用

    TensorFlow实战教程,图像识别应用示例教程,该课程特邀请AI100 阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解TensorFlow实现工业级图像识别应用的详细过程。具体内容包括:TensorFlow基础和模型选择,TensorFlow训练和验证模型,调参、模型上线和部署。

    8810 人正在学习 去看看 AI100讲师

不同类型的网络,具体的调参方案不尽相同,有一些比较通用的思路记录如下:

  1. 样本尽量随机,避免学习偏差

  2. 样本要归一化,为什么需要归一化?参考

    • 避免数值问题(精度)
    • 更快的收敛,尤其是梯度下降法,方便初始化解,同时学习率的设置也更方便合理 == 确实会加速收敛和迭代的过程;借图侵删
      在这里插入图片描述
    • 样本的特征量纲可能不一致,需要统一
    • 常用的 sigmoid 函数,在绝对值较大时容易出现饱和

    怎样归一化? ref

    1. 简单缩放 == min-max标准化
    2. 逐样本均值消减 == 减去所有样本的均值-去除直流分量?!
    3. 特征标准化 == 标准差标准化/z-score 标准化;调整到符合正态分布 0-1
  3. 激活函数的选择,介绍略;参考 & 参考2

    • 只说 sigmoid 容易饱和,出现梯度消失;relu 可以稀疏,很常用,可能出现死神经元或者梯度爆炸上不封顶;LeakyRelu 优化死神经元问题;softmax 用于输出层计算概率
    • 似乎并没有一个非常严格的思路或者理论来解释什么样的情况下应该用哪种激活函数;不过 参考2 的介绍感觉还是高大上一些。sigmoid 适合用于表达概率,如 RNN LSTM 等里面的gate;relu 的解空间 < tanh < sigmoid,解空间越大搜索解就越慢,所以通用 relu
  4. batch size 的选择 参考

    • 相比于 GD(梯度下降)、SGD(随机梯度下降),Minibatch GD 有更好的优势;比 GD 计算量低,比 SGD 更快,也防止震荡
    • 如何选择:batch 的上限受制于 GPU 的显存,小的 batch 效率太低训练慢;然而 batch size并非越大越好,参考中示意图表示,不同大小的 batch 表示每一步模型 ff 需要拟合的样本数,最终导致不同的拟合结果,所以 size 会影响模型的训练结果;同时给出了通过调节不同的 batch size 可以看到有时候模型会卡在鞍点,有时则能快速收敛;借图侵删
      在这里插入图片描述
    • 具体操作,不同的任务会有一些经验值可以借鉴,参考经验值,然后尝试放大 2*2 或者 缩小 0.5*0.5来对比训练的效果,看看是否会有更优的训练结果
  5. 学习速率很重要 参考

    • 通常不同的学习速率会很大程度上影响模型的收敛结果和效率;往往模型刚开始训练的时候学习率需要稍微大一些,帮助模型快速收敛,而在迭代了一定的次数之后,梯度也会慢慢降低,搜索极小值的过程需要学习率较低;借图侵删在这里插入图片描述
    • 常用的策略:指数衰减学习率,将学习率设定为与训练的迭代次数相关,迭代次数越多,学习率衰减的越多;常用的一些参数更新策略包括 AdaGrad/RMSProp/Adam 等等都包含了优化学习率的思路,可具体去了解;
    • 尽量可视化学习和收敛的过程,这样便于理解训练过程并改进。
  6. 权重初始化 参考 & 参考2

    • 好的初始化至关重要,常用的几种初始化的方式有 a 全0初始化;每层神经元学到的东西一样,难收敛; b 随机初始化,通常会满足一定的分布,比如0-1正态分布; c Xavier 初始化,尽可能让输入和输出服从相同的分布,todo,假设了使用 sigmoid 激活函数,对 Relu 不太适用;d He 初始化(何恺明提出),假设用 Relu 激活函数,效果比较好。e BN,对输出枪型归一化
  7. 如何选择随机梯度下降的算法

  8. Dropout 的放置位置和比例确定 参考

    • 确定是否需要 dropout? 通常如果过拟合严重,可以考虑加入 dropout 层,如果不能收敛则是其他问题;如果样本较少,可以加 dropout,增加稀疏性(通常我们需要特征之间的区分度越大越好,如果样本较多,则不用太担心,如果样本较少,则可以通过增加特征的稀疏度来提高区分度)。
    • 通常输入层较少使用,如果用也就设置接近1 的比例,用于增强样本随机性
    • 在隐藏层一般取0.3-0.6,可以先用0.5试,因为0.5能产生的组合最多;然后进行调节;全连接层类似。
  9. early stop

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