Для этого вы должны использовать 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 будут выборочно обновлять параметры обучения.
Например, если указана скорость обучения, эта скорость обучения будет применяться ко всем незамерзшим / обучаемым слоям в модели.Однако вновь добавленные слои могут переопределить эту скорость обучения, указав свои собственные скорости обучения в построителе слоев.