入门 | 深度学习模型的简单优化技巧

2023-05-30 0 360

原副标题:进阶 | 广度自学数学模型的单纯强化基本功 Liziertoward data science 译者:Jo

原副标题:进阶 | 广度自学数学模型的单纯强化基本功

Liziertoward data science

译者:Jonathan Balaban

电脑之心校对

参予:DAT160、刘晓坤

责任编辑如是说了两个广度自学数学模型的单纯强化基本功,主要包括北迁自学、dropout、自学率修正等,并展现了怎样用 Keras 同时实现。

下列是我与同僚和小学生就怎样强化广度数学模型展开的谈话、最新消息和辩论会的全文。假如你辨认出了有声望的基本功,请撷取。

具体来说,为何要改良数学模型?

像传递函数数学模型(CNN)这种的广度自学数学模型具备大批的模块;事实上,他们能初始化那些超模块,即使它原先在数学模型中并没被强化。你能分层搜寻那些超模块的最优化值,但须要大批硬体排序和天数。所以,两个或者说的统计数据生物学家能满足用户于揣测那些基本模块吗?

改良数学模型的最佳方法之一是基于在你的领域展开过深入研究的专家的设计和体系结构,他们通常拥有强大的硬体可供使用。而且,他们经常慷慨地开源建模架构和原理。

广度自学技术

下列是一些通过预训练数学模型来改善拟合天数和准确性的方法:

研究理想的预训练体系架构:了解北迁自学的好处,或了解一些功能强大的 CNN 体系架构。考虑那些看起来不太适合但具备潜在共享特性的领域。

使用较小的自学率:由于预训练的权重通常优于随机初始化的权重,因此修改要更为精细!你在此处的选择取决于自学环境和预训练的表现,但请检查各个时期的误差,以了解距离收敛还要多久。

使用 dropout:与回归数学模型的 Ridge 和 LASSO 正则化一样,没适用于所有数学模型的强化 alpha 或 dropout。这是一个超模块,取决于具体问题,必须展开测试。从更大的变化开始——用更大的分层搜寻跨越两个数量级,如 np.logspace() 所能提供的那样——然后像上面的自学率一样下降。

限制权重大小:能限制某些层的权重的最大范数(绝对值),以泛化他们的数学模型。

不要动前几层:数学模型的前两个隐藏层通常用于捕获通用和可解释的特征,如形状、曲线或跨域的相互作用。他们应该经常把那些放在一边,把重点放在进一步强化元潜在级别的特征上。这可能意味着添加隐藏层,这种他们就不须要匆忙处理了!

修改输出层:使用适合你的领域的新激活函数和输出大小替换数学模型默认值。不过,不要把自己局限于最明显的解决方案。尽管 MNIST 看起来似乎须要 10 个输出类,但有些数字有共同的变量,允许 12-16 个类可能会更好地解决那些变量,并提高数学模型性能!与上面提到的提示一样,广度自学数学模型应该随着他们接近输出而不断修改和定制。

Keras 中的技术

在 Keras 中修改 MNIST 的 dropout 和限制权重大小的方法如下:

# 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 datamodel.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 最佳实践

使用 20-50 % 的 dropout,建议输入 20%。太低,影响能忽略;太高,可能欠拟合。

在输入层和隐藏层上使用 dropout。这已被证明能提高广度自学的性能。

使用伴有衰减的较大的自学速率,以及较大的动量。

限制权重!较大的自学速率会导致梯度爆炸。通过对网络权值施加约束(如大小为 5 的最大范数正则化)能改善结果。

使用更大的网络。在较大的网络上使用 dropout 可能会获得更好的性能,从而使数学模型有更多的机会自学独立的表征。

下面是 Keras 中的最终层修改示例,其中包含 14 个 MNIST 类:

fromkeras.layers.coreimport

Activation, Dense

model.layers.pop() # defaults to lastmodel.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。这有点复杂,在其他平台(如 Caffe)中同时实现得更好。

预训练网络库

Keras

Kaggle 列表:https://www.kaggle.com/gaborfodor/keras-pretrained-models

Keras 应用:https://keras.io/applications/

OpenCV 示例:https://www.learnopencv.com/keras-tutorial-fine-tuning-using-pre-trained-models/

TensorFlow

VGG16:https://www.learnopencv.com/keras-tutorial-fine-tuning-using-pre-trained-models/

Inceptiom V3:https://github.com/tensorflow/models/blob/master/inception/README.md#how-to-fine-tune-a-pre-trained-model-on-a-new-task

ResNet:https://github.com/tensorflow/models/blob/master/inception/README.md#how-to-fine-tune-a-pre-trained-model-on-a-new-task

Torch

LoadCaffe:https://github.com/szagoruyko/loadcaffe

Caffe

Model Zoo:https://github.com/BVLC/caffe/wiki/Model-Zoo

在 Jupyter 中查看你的 TensorBoard 图

数学模型的可视化通常很重要。假如你用 Keras 编写数学模型,它的抽象很好,但不允许你深入到数学模型的各个部分展开更细致的分析。幸运的是,下面的代码能让他们直接使用 Python 可视化数学模型:

# From: http://nbviewer.jupyter.org/github/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb# Helper functions for TF Graph visualizationfrom 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(” ” %size,utf-8

)

   return

strip_def

def rename_nodes(graph_def, rename_func):

   res_def = tf.GraphDef()

   for n0 in

graph_def.node:

       n = res_def.node.add()

       n.MergeFrom(n0)

       n.name = rename_func(n.name)

       for i, s in

enumerate(n.input):

           n.input[i] = rename_func(s) if s[0]!=^ else ^+rename_func(s[1

:])

   return

res_def

def show_graph(graph_def, max_const_size=32):    “””Visualize TensorFlow graph.”””    if hasattr(graph_def, as_graph_def

):

graph_def = graph_def.as_graph_def()

   strip_def = strip_consts(graph_def, max_const_size=max_const_size)

   code =

“””

“””
.format(data=repr(str(strip_def)), id=graph

+str(np.random.rand()))

   iframe =

“””

   “””
.format(code.replace(,

))

   display(HTML(iframe))

# Visualizing the network graph. Be sure expand the “mixed” nodes to see their# internal structure. We are going to visualize “Conv2D” nodes.

graph_def = tf.get_default_graph().as_graph_def()

tmp_def = rename_nodes(graph_def, lambda s:“/”.join(s.split(_,1

)))

show_graph(tmp_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

fromkeras.utils.visualize_utilimport

model_to_dot

SVG(model_to_dot(model).create(prog=dot, format=svg

))

原文链接:https://towardsdatascience.com/deep-learning-tips-and-tricks-1ef708ec5f53

责任编辑为电脑之心校对,

✄————————————————

加入电脑之心(全职记者/实习生):[email protected]

投稿或寻求报道:content@jiqizhixin.com

广告&商务合作:[email protected]

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务