От направления к науке о данных, Джонатан Балабан, составлено Heart of the Machine.
В этой статье представлено несколько простых методов оптимизации для моделей глубокого обучения, в том числе перенос обучения, отсев, корректировка скорости обучения и т. д., а также показано, как реализовать их с помощью Keras.
Ниже приводится сводка бесед, сообщений и дебатов, которые я провел с коллегами и студентами о том, как оптимизировать глубокие модели. Если вы найдете эффективную технику, пожалуйста, поделитесь ею.
Во-первых, зачем улучшать модель?
Модели глубокого обучения, такие как сверточные нейронные сети (CNN), имеют большое количество параметров; на самом деле мы можем назвать эти гиперпараметры, потому что они изначально не были оптимизированы в модели. Вы можете искать оптимальные значения этих гиперпараметров по сетке, но это требует много аппаратных вычислений и времени. Итак, может ли настоящий специалист по данным довольствоваться тем, что угадывает эти основные параметры?
Один из лучших способов улучшить ваши модели — это опираться на проекты и архитектуры экспертов, которые провели глубокие исследования в вашей области и обычно имеют в своем распоряжении мощное оборудование. Кроме того, они часто щедро предоставляют архитектуры и принципы моделирования с открытым исходным кодом.
Технология глубокого обучения
Вот несколько способов улучшить время и точность подгонки путем предварительной подготовки модели:
- Изучите идеальную архитектуру предварительного обучения: узнайте о преимуществах трансферного обучения или о некоторых мощных архитектурах CNN. Рассмотрите области, которые не кажутся подходящими, но имеют потенциально общие свойства.
- Используйте небольшую скорость обучения: поскольку предварительно обученные веса обычно лучше, чем случайно инициализированные веса, модификации более тонкие! Ваш выбор здесь зависит от среды обучения и производительности перед обучением, но проверьте ошибку по эпохам, чтобы увидеть, сколько времени потребуется для сходимости расстояния.
- Использовать отсев: как и при регуляризации Ridge и LASSO для регрессионных моделей, для всех моделей нет оптимизированной альфы или отсева. Это гиперпараметр, который необходимо тестировать в зависимости от конкретной проблемы. Начните с более крупных изменений — охватывающих порядки величин с более крупными поисками по сетке, как это может обеспечить np.logspace(), — а затем уменьшите скорость обучения, как указано выше.
- Ограничение размера веса: максимальная норма (абсолютное значение) весов определенных слоев может быть ограничена для обобщения нашей модели.
- Оставьте первые несколько слоев в покое: первые несколько скрытых слоев нейронной сети часто используются для захвата общих и интерпретируемых функций, таких как формы, кривые или взаимодействия между доменами. Мы часто должны откладывать их в сторону и сосредоточиться на дальнейшей оптимизации функций на металатентном уровне. Это может означать добавление скрытых слоев, чтобы не торопить события!
- Измените выходной слой: замените значения модели по умолчанию новой функцией активации и размером вывода, подходящим для вашего домена. Однако не ограничивайтесь самыми очевидными решениями. Хотя может показаться, что MNIST требует 10 выходных классов, некоторые числа имеют общие переменные, и разрешение 12-16 классов может лучше разрешать эти переменные и улучшать производительность модели! Как и в случае с советами, упомянутыми выше, модели глубокого обучения следует постоянно модифицировать и настраивать по мере приближения к результату.
Технологии в Керасе
Метод изменения отсева MNIST и ограничения размера веса в Keras выглядит следующим образом:
# 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'))
лучшие практики отсева
- Используйте отсев 20-50%, рекомендуется 20%. Слишком низкое значение может привести к незначительному эффекту; слишком высокое значение может привести к недостаточной подгонке.
- Используйте выпадение на входных и скрытых слоях. Было показано, что это улучшает производительность глубокого обучения.
- Используйте большую скорость обучения с затуханием и больший импульс.
- Ограничьте вес! Более высокие скорости обучения могут привести к взрывному градиенту. Результаты можно улучшить, наложив ограничения на веса сети, такие как регуляризация максимальной нормы размера 5.
- Используйте большую сеть. Использование отсева в больших сетях может повысить производительность, предоставив модели больше возможностей для изучения независимых представлений.
Вот пример окончательной модификации слоя в Keras с 14 классами MNIST:
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. Это немного сложнее и лучше реализовано на других платформах, таких как Caffe.
Предварительно обученная сетевая библиотека
Keras
- Кагглевский список:woohoo.Карта реформирована.com/Gabor Fodor/…
- Приложение Керас:Доступный RAS.IO/приложение…
- Пример OpenCV:woohoo.learn OpenCV.com/RAS-tutor…
TensorFlow
- ВГГ16:woohoo.learn OpenCV.com/RAS-tutor…
- Начало V3:GitHub.com/tensorflow/…
- Ренет:GitHub.com/tensorflow/…
Torch
- LoadCaffe:GitHub.com/С назад есть нокаут/…
Caffe
- Модельный зоопарк:GitHub.com/B VLC/Zhu Compound Curcuma/…
Просмотр графика TensorBoard в Jupyter
Визуализация модели часто важна. Если вы пишете свою модель в Keras, ее абстракция хороша, но она не позволяет вам углубляться в отдельные части модели для более детального анализа. К счастью, следующий код позволяет визуализировать модель непосредственно в Python:
# From: http://nbviewer.jupyter.org/github/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb
# Helper functions for TF Graph visualization
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
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 = """
<script>
function load() {{
document.getElementById("{id}").pbtxt = {data};
}}
</script>
<link rel="import" href="https://tensorboard.appspot.com/tf-graph-basic.build.html" onload=load()>
<div style="height:600px">
<tf-graph-basic id="{id}"></tf-graph-basic>
</div>
""".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))
iframe = """
<iframe seamless style="width:800px;height:620px;border:0" srcdoc="{}"></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:
from IPython.display import SVG
from keras.utils.visualize_util import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))
Оригинальная ссылка:к data science.com/deep - ааа, позволь тебе…