2016-09-12 9 views
0

Я начинаю в тензорном потоке, и у меня есть один вопрос, связанный с контрольной точкой сохранения и восстановления в сверточных нейронных сетях. Я пытаюсь создать CNN для классификации лиц. Мой вопрос:Сохранить и восстановить в CNN

Если это возможно, когда я добавляю новый класс в свой набор данных для частичной подготовки? Поэтому я просто хочу переучивать новый класс, чтобы переучивать сеть дыр. возможно ли восстановить вес и предвзятость от предыдущего обучения и обучить только новый класс?

я использую для экономии

saver = tf.train.Saver(tf.all_variables()) 
save = saver.save(session, "/home/owner//tensorflownew_models.ckpt") 

print("Model saved in file: %s" % save) 

ответ

1

Ваш вопрос имеет несколько аспектов. Давайте посмотрим на каждый в деталях:

  • Можно ли восстановить веса и смещения от предыдущей тренировки? Да. Вы можете создать tf.train.Saver в своей новой программе и использовать его для загрузки значений переменных со старой контрольной точки. Если вы хотите загрузить некоторые из переменных из старой модели, вы можете указать подмножество переменных, которые вы хотите восстановить в аргументе var_list, на tf.train.Saver constructor. Если переменные в вашей новой модели имеют разные имена, вам может потребоваться указать отображение значения ключа, как описано в this answer.

  • Возможно ли добавить класс в сеть? Да, хотя это немного сложно (и могут быть другие способы сделать это). Я предполагаю, что в вашей сети есть классификатор softmax, который включает линейный слой (умножение матрицы на весовую матрицу размером m * C, а затем добавление вектора смещений длины C). Чтобы добавить класс, вы можете создать матрицу размером m * C+1 и вектор длиной C+1, а затем инициализировать первые строки C из этих существующих весов, используя tf.Variable.scatter_assign(). This question касается одной и той же темы.

  • Можно ли частично обучать? Да. Я предполагаю, что вы имеете в виду «обучать только некоторые слои, сохраняя при этом другие слои постоянными». Вы можете сделать это как MMN suggests, передав явный список переменных для оптимизации при вызове tf.train.Optimizer.minimize(). Например, если вы добавляли класс, как указано выше, вы можете переучивать только веса и смещения softmax и удерживать фильтры слоев свертки постоянными. Посмотрите на tutorial on transfer learning с предварительно обученной моделью для создания идей.

0

Sure. Вы можете использовать параметр var_list в tf.train.Optimizer.minimize() для управления весами, которые вы хотите оптимизировать. Если вы не включили переменные, которые вы восстановили (или в настоящее время прошли обучение), они не должны меняться.

+0

@ ММН может вы указали больше, пожалуйста, или если есть какой-либо учебник о том или ссылке – mido

+0

[ссылка] (https://www.tensorflow.org/versions/r0.10/api_docs/python/train. html) TF немного сложнее привыкнуть, но в основном обучение - это просто обновление весов в переменных с использованием функции потерь и backprop. По умолчанию, train() обновит все задействованные переменные, но если вы предварительно подготовили или восстановили некоторые веса, вы можете избежать их переподготовки, просто исключив их из параметра var_list на вашем этапе обучения. – MMN

Смежные вопросы