本文是根据自身构建深度学习模型总结而来,可能读起来比较干巴,但干货确实不少。闲话少叙,直接进入相关内容。
...
类似于卷积神经网络(CNN)的深度学习模型一般而言都有大量的参数,我们训练构建的模型实际上就是为了得到比较好的网络参数值,整个调参过程需要花费大量的硬件和时间资源。因此,很多研究者在改进模型时采用的方法是在专家设计和构建的模型基础上进行深入研究,一般情况下,专家会开源构建的模型结构和原理,有些会给出相应训练好的模型参数,可供其它研究人员直接使用,比如迁移学习等。
可以通过以下几种方法来改善训练模型的拟合时间和准确性:
以下是如何修改dropout和限制MNIST数据集的权重大小:
# dropout in input and hidden layers# weight constraint imposed on hidden layers# ensures the max norm of the weights does not exceed 5model = 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'))
...
下面是Keras中修改最后一层的例子,将MNIST的10类修改为14类:
from keras.layers.core import 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这样的参数自适应学习算法。
...
了解模型的外观通常是很重要的。如果使用的是Keras工具,搭建出来的模型会很抽象,并且不允许深入分析模型的各个部分。幸运的是,下面的代码可以直接用Python直观地看到构建的模型(代码太长,见原文):
from IPython.display import clear_output, Image, display, HTMLdef 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 ..
以下代码将绘制模型的图形并将其保存为png文件:
from keras.utils.visualize_util import plot
plot(model, to_file='model.png')
plot有两个参数可供选择:
from IPython.display import SVGfrom keras.utils.visualize_util import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))
以上即为个人的全部建模经验,读者如果有不同意见或有其它优方法的话可以留言探讨。