Есть ли способ изменить топологию нейронной сети в DL4J без необходимости переучивать ее? - PullRequest
0 голосов
/ 27 мая 2018

Мне нужно внести изменения в существующую модель deeplearning4j (DL4J), которая уже была обучена.Сеть состоит из входного уровня, одного LSTM Graves и одного выходного уровня RNN.

Мой вопрос таков: возможно ли добавить один или несколько необученных нейронов в слой LSTM без необходимости перестраивать модель из нового конфига (что, я бы предположил, потребовало его переобучения)?Я хотел бы сделать что-то вроде добавления одного или нескольких нейронов к существующему слою или добавления целого слоя (необученного) к обученной модели.

Возможно ли это?Я не мог найти никаких ссылок на это, но я видел людей, делающих это на других языках / фреймворках, поэтому мне интересно, могу ли я сделать это и в DL4J.

Кстати, я знаю, что это необычночто делать.Пожалуйста, игнорируйте тот факт, что это испортит обученную сеть, мне просто нужно знать, смогу ли я это сделать и как это сделать.:)

Любые указатели помогут!

Спасибо!

Эдуардо

1 Ответ

0 голосов
/ 27 мая 2018

Для этого вы должны использовать api обучения обучения.Смотрите наши примеры здесь.https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-spark-examples/dl4j-spark/src/main/java/org/deeplearning4j/transferlearning/vgg16/TransferLearning.md

Документы ниже:

API обучения перевода DL4J

Обзор

API обучения перевода DL4J позволяет пользователям:

  • Изменение архитектуры существующей модели
  • Точная настройка обучающей конфигурации существующей модели.
  • Сохранение параметров указанного слоя постоянными во время обучения, также называемых «замороженными»

Удержание определенных слоев в сети замороженными, и обучение фактически равнозначно обучению на преобразованной версии входных данных, причем преобразованная версия представляет собой промежуточные выходные данные на границе замороженных слоев.«Извлечение признаков» из входных данных, и в этом документе оно будет называться «подделкой».

Помощник по обучению переводу

Передний проход для «подстановки» входных данных в целом,Отдельные сети могут занимать много времени. DL4J также предоставляет класс TransferLearningHelper со следующими возможностямиities.

  • Подделать входной набор данных для сохранения для будущего использования
  • Подогнать модель с замороженными слоями с помощью улучшенного набора данных
  • Вывод из модели с заданными замороженными слояминастраиваемый ввод.

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

Показатькод

В этом примере будет использоваться VGG16 для классификации изображений, относящихся к пяти категориям цветов.Набор данных будет автоматически загружен из http://download.tensorflow.org/example_images/flower_photos.tgz

I. Импорт VGG16

TrainedModelHelper modelImportHelper = new TrainedModelHelper(TrainedModels.VGG16); ComputationGraph org.deeplearning4j.transferlearning.vgg16 = modelImportHelper.loadModel();

II.Настройте точную настройку

FineTuneConfiguration fineTuneConf = new FineTuneConfiguration.Builder() .learningRate(5e-5) .updater(Updater.NESTEROVS) .seed(seed) .build();

III.Создание новых моделей на основе VGG16 A. Модификация только последнего слоя с сохранением остальных элементов

Последний слой VGG16 выполняет регрессию softmax для 1000 классов в ImageNet.Мы модифицируем самый последний слой, чтобы давать прогнозы для пяти классов, сохраняя другие слои замороженными.

ComputationGraph vgg16Transfer = new TransferLearning.GraphBuilder(org.deeplearning4j.transferlearning.vgg16) .fineTuneConfiguration(fineTuneConf) .setFeatureExtractor(“fc2”) .removeVertexKeepConnections("predictions") .addLayer(“predictions”, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .nIn(4096).nOut(numClasses) .weightInit(WeightInit.Xavier) .activation(Activation.SOFTMAX).build(), ”fc2") .build(); После всего лишь тридцати итераций, что в данном случае представляет собой 450 изображений, модель достигает точности> 75% на тестовом наборе данных.Это довольно примечательно, учитывая сложность обучения классификатора изображения с нуля.

B. Присоединение новых слоев к узкому месту (block5_pool)

Здесь мы держим все, кроме трех последних плотных слоев, замороженными и прикрепляем к ним новые плотные слои,Обратите внимание, что основной целью здесь является демонстрация использования API, вторичного к тому, что может дать лучшие результаты.

ComputationGraph vgg16Transfer = new TransferLearning.GraphBuilder(org.deeplearning4j.transferlearning.vgg16) .fineTuneConfiguration(fineTuneConf) .setFeatureExtractor("block5_pool") .nOutReplace("fc2",1024, WeightInit.XAVIER) .removeVertexAndConnections("predictions") .addLayer(“fc3",new DenseLayer.Builder() .activation(Activation.RELU) .nIn(1024).nOut(256).build(),"fc2") .addLayer(“newpredictions”,new OutputLayer .Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .activation(Activation.SOFTMAX) .nIn(256).nOut(numClasses).build(),”fc3") .setOutputs("newpredictions") .build();

C. Точная настройка слоев из ранее сохраненной модели

Скажем, мыспасли нашу модель от (B) и теперь хотим позволить слоям «block_5» тренироваться.

ComputationGraph vgg16FineTune = new TransferLearning.GraphBuilder(vgg16Transfer) .fineTuneConfiguration(fineTuneConf) .setFeatureExtractor(“block4_pool”) .build();

IV.Сохранение «ориентированных» наборов данных и обучение с ними.

Мы используем API помощника по переводному обучению.Обратите внимание, что это замораживает слои модели, переданной в.

Вот как вы получаете избранную версию набора данных в указанном слое «fc2».

TransferLearningHelper transferLearningHelper = new TransferLearningHelper(org.deeplearning4j.transferlearning.vgg16, “fc2”); while(trainIter.hasNext()) { DataSet currentFeaturized = transferLearningHelper.featurize(trainIter.next()); saveToDisk(currentFeaturized,trainDataSaved,true); trainDataSaved++; } Вот как вы можетеподходит с признакам набора данных.vgg16Transfer - это настройка модели в (A) раздела III. TransferLearningHelper transferLearningHelper = new TransferLearningHelper(vgg16Transfer); while (trainIter.hasNext()) { transferLearningHelper.fitFeaturized(trainIter.next()); }

Примечание:

  • Конструктор TransferLearning возвращает новый экземпляр модели dl4j.

Имейте в виду, что это вторая модель, которая оставляет оригинальную нетронутой.Для большой сети необходимо учитывать требования к памяти и соответствующим образом скорректировать пространство кучи JVM.

  • Обученный помощник модели импортирует модели из Keras без применения конфигурации обучения.

Поэтому последний лежалer (как видно при печати сводки) - это плотный слой, а не выходной слой с функцией потерь.Поэтому, чтобы изменить nOut выходного слоя, мы удаляем вершину слоя, сохраняя ее соединения и добавляем обратно в новый выходной слой с тем же именем, другим nOut, подходящей функцией потерь и т. Д. И т. Д.

  • Изменение nOuts в слое / вершине изменит nIn слоев / вершин, в которые он разворачивается.

При изменении nOut пользователи могут указать схему инициализации веса или распределение для слоя, а также отдельную схему инициализации веса или распределение для слоев, на которые он разветвляется.

  • Конфигурации замороженных слоев не сохраняются при записи модели на диск.

Другими словами, модель с замороженными слоями при сериализации и обратном чтении не будет иметь замороженных слоев.Ожидается, что для продолжения обучения с постоянными конкретными уровнями пользователь должен пройти через помощника по обучению переводу или API обучения по переносу.Есть два способа «заморозить» слои в модели dl4j.

- On a copy: With the transfer learning API which will return a new model with the relevant frozen layers
- In place: With the transfer learning helper API which will apply the frozen layers to the given model.
  • Конфигурации FineTune будут выборочно обновлять параметры обучения.

Например, если указана скорость обучения, эта скорость обучения будет применяться ко всем незамерзшим / обучаемым слоям в модели.Однако вновь добавленные слои могут переопределить эту скорость обучения, указав свои собственные скорости обучения в построителе слоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...