深度学习技巧与窍门

简介: 本文是根据自身构建深度学习模型总结而来,适合有一定深度学习基础的读者阅读。

       本文是根据自身构建深度学习模型总结而来,可能读起来比较干巴,但干货确实不少。闲话少叙,直接进入相关内容。
0

首先,为什么只是微调模型?

       类似于卷积神经网络(CNN)的深度学习模型一般而言都有大量的参数,我们训练构建的模型实际上就是为了得到比较好的网络参数值,整个调参过程需要花费大量的硬件和时间资源。因此,很多研究者在改进模型时采用的方法是在专家设计和构建的模型基础上进行深入研究,一般情况下,专家会开源构建的模型结构和原理,有些会给出相应训练好的模型参数,可供其它研究人员直接使用,比如迁移学习等。

深度学习技巧

       可以通过以下几种方法来改善训练模型的拟合时间和准确性:

  • 1.研究理想的预训练结构了解迁移学习的好处,或浏览一些高效CNN模型结构。此外,可以考虑其它看起来不太明显的领域,共享潜在的相似特征。
  • 2.使用一个小的学习率:由于预先训练的权重通常比随机初始化的权重要好,所以修改参数时应该更细致些!参数的选择取决于学习环境和预训练的效果,但需要检查各个Epoch的错误以清楚收敛过程。
  • 3.使用dropout:与用于回归模型的Ridge和LASSO正则化一样,所有模型都没有优化的alpha或dropout。dropout是一个超参数,表明每次训练时丢弃的神经元概率,其设置取决于具体问题,并且必须经过实验测试。一般开始时设置得比较大,随后跨数量级的形式搜索其最优设置值。
  • 4.限制权重大小:可以限制某些层权重的最大范数(绝对值)以使得模型更加泛化。
  • 5.不要修改第一层:神经网络的第一个隐藏层倾向于捕捉通用和可解释的特征,例如形状、曲线等。因此,在应用迁移学习时,一般不会对经典模型的第一层进行修改,并且专注于优化其它层或添加隐藏层。
  • 6.修改输出层:将模型默认值替换为适合的新激活函数和输出大小。但是,不要将自己局限于最明显的解决方案,即只改变激活函数和最后输出层的节点数。虽然MNIST数据集可能看起来像是需要10个输出类别,但一些数字有共同的变化,相关结果表明输出层设置为输出12-16个类别可以更好地解决这些变体并提高模型性能!

Keras中的技巧

       以下是如何修改dropout和限制MNIST数据集的权重大小:

# dropout in input and hidden layers
# weight constraint imposed on hidden layers
# ensures the max norm of the weights does not exceed 5
model = Sequential()
model.add(Dropout(0.2, input_shape=(784,))) # dropout on the inputs
# this helps mimic noise or missing data
model.add(Dense(128, input_dim=784, kernel_initializer='normal', activation='relu', kernel_constraint=maxnorm(5)))
model.add(Dropout(0.5))
model.add(Dense(128, kernel_initializer='normal', activation='tanh', kernel_constraint=maxnorm(5)))
model.add(Dropout(0.5))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

Dropout最佳实践:

  • 使用小的dropout概率,一般为20%~50%,对于输入建议使用20%。概率太低会导致收获甚微,太高导致训练不好;
  • 在输入层和隐藏层上都使用dropout,这已被证明可以提高深度学习模型的性能;
  • 使用衰减大的学习速率和大的动量;
  • 限制权重,大的学习速率可能导致梯度爆炸,相关论文表明,对网络权重施加约束可以改善结果。
  • 使用大型网络。在较大的网络中使用dropout可能会获得更好的性能,从而使模型更有机会学习独立表示。
           下面是Keras中修改最后一层的例子,将MNIST的10类修改为14类:
from keras.layers.core import Activation, Dense
model.layers.pop() # defaults to last
model.outputs = [model.layers[-1].output]
model.layers[-1].outbound_nodes = []
model.add(Dense(14, activation='softmax')) 

       以及如何冻结前五层权重的示例:

for layer in model.layers[:5]:
    layer.trainable = False

       或者,可以将该层的学习率设置为零,然后使用像Adadelta或Adam这样的参数自适应学习算法。

预训练网络库资源

Keras

TensorFlow

Torch

Caffe

在Jupyter中查看TensorBoard图

       了解模型的外观通常是很重要的。如果使用的是Keras工具,搭建出来的模型会很抽象,并且不允许深入分析模型的各个部分。幸运的是,下面的代码可以直接用Python直观地看到构建的模型(代码太长,见原文):

from IPython.display import clear_output, Image, display, HTML
def strip_consts(graph_def, max_const_size=32):
    """Strip large constant values from graph_def."""
    strip_def = tf.GraphDef()
    for n0 in graph_def.node:
        n = strip_def.node.add() 
        n.MergeFrom(n0)
        if n.op == 'Const':
            tensor = n.attr['value'].tensor
            size = len(tensor.tensor_content)
            if size > max_const_size:
                tensor.tensor_content = bytes("<stripped %d bytes>"%size, 'utf-8')
    return strip_def ..

用Keras可视化模型

       以下代码将绘制模型的图形并将其保存为png文件:

from keras.utils.visualize_util import plot
plot(model, to_file='model.png')

       plot有两个参数可供选择:

  • show_shapes(默认为False)控制输出形状是否显示在图形中;
  • show_layer_names(默认为True)控制图层中是否显示图层名称;
           也可以直接获取pydot.Graph对象并自己渲染它,例如在ipython notebook中显示它:
from IPython.display import SVG
from keras.utils.visualize_util import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))

       以上即为个人的全部建模经验,读者如果有不同意见或有其它优方法的话可以留言探讨。

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

作者信息

Jonathan Balaban,数据科学家
个人主页:https://www.linkedin.com/in/jbalaban/
本文由阿里云云栖社区组织翻译。
文章原标题《Deep Learning Tips and Tricks》,译者:海棠,审校:Uncle_LLD。
文章为简译,更为详细的内容,请查看原文

相关文章
|
9月前
|
机器学习/深度学习 自然语言处理 算法
深度学习算法:从模仿到创造
深度学习是一种受到生物学启发的机器学习方法,其目标是通过构建多层神经网络来模拟人脑的工作原理。它在过去几十年来取得了巨大的进展,并在图像识别、语音识别、自然语言处理等领域取得了突破性的成果。 深度学习的核心思想是模仿人脑的神经网络。人脑中的神经元通过连接起来形成庞大的神经网络,用来处理感知、思维和决策等任务。深度学习的神经网络也是由许多层次的神经元组成,每一层都能够从上一层中学习到更加抽象的特征表示。通过训练数据,深度学习模型能够自动学习到最优的特征表示,并用于解决各种复杂的任务。
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
131 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
4月前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奥秘:探索神经网络的黑匣子
【10月更文挑战第6天】在人工智能的浪潮中,深度学习以其卓越的性能成为焦点。本文旨在揭开深度学习神秘的面纱,通过直观易懂的语言和实际代码示例,引领读者步入神经网络的世界。我们将一同探索数据如何转化为智能,理解模型训练的内在机制,并见证深度学习如何在多个领域大放异彩。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
6月前
|
机器学习/深度学习 自然语言处理 数据安全/隐私保护
深度学习中的艺术与科学:探索神经网络的奥秘
本文将带您走进深度学习的奇妙世界,一探神经网络背后的科学原理和艺术创造。我们将从基础概念出发,逐步深入到模型训练的技巧,以及如何应对过拟合等常见问题。通过实例分析,我们将展示深度学习技术在图像识别和自然语言处理等领域的应用,并讨论其在未来科技发展中的潜在影响。让我们一同解锁深度学习的力量,发现它如何塑造我们的数字世界。
|
4月前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习之自适应控制器设计
人工智能基于深度学习的自适应控制器设计在自动化系统、机器人控制、工业制造、无人驾驶等领域中有着广泛应用。自适应控制器借助深度学习模型的强大特征提取和学习能力,能够在未知或动态变化的环境中对系统进行实时调节,从而提升系统的响应速度、稳定性和控制精度。
105 1
|
6月前
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习的奥秘:探索神经网络背后的科学
【8月更文挑战第26天】 在本文中,我们将一起揭开深度学习神秘的面纱,深入理解神经网络如何模仿人脑处理信息。通过浅显易懂的语言和生动的比喻,本文将带你从基础概念出发,逐步深入了解深度学习的核心机制和应用实例,让你对这一前沿技术有一个全面而深刻的认识。
188 62
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的艺术:探索神经网络的奥秘
【9月更文挑战第2天】 在人工智能的宏伟画卷中,深度学习以其独特的魅力和强大的能力占据了中心舞台。本文将深入浅出地探讨深度学习的核心——神经网络,揭示其如何模拟人脑处理信息的方式,以及它在图像识别、自然语言处理等领域的应用。我们将从基础概念出发,逐步深入到网络结构的设计思想,最后探讨深度学习面临的挑战与未来发展方向。通过本文,读者将获得对深度学习基本原理的理解,并激发进一步探索这一领域的好奇心。
57 1
|
机器学习/深度学习 算法 数据挖掘
深度学习实践篇 第十一章:imgaug
简要介绍imgaug和基础用法。
217 0
|
机器学习/深度学习 并行计算 PyTorch
深度学习实践篇 第九章:DDP
简要介绍了DDP的使用。
383 0
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习实践篇 第八章:torchscript
简要介绍torchscript的使用方法。
244 0