Как создать обучающий и протестировать DataSetIterators в deeplearning4j? - PullRequest
0 голосов
/ 03 января 2019

Я строю рекуррентную нейронную сеть с deeplearning4j, и мне нужно создать обучающие и тестовые наборы данных.

Все примеры, представленные в документации и примере кода , используйте CSVSequenceRecordReader для чтения файлов CSV.

Затем создается DataSetIterator с помощью конструктора SequenceRecordReaderDataSetIterator и подается в метод MultiLayerNetwork.fit() или MultiLayerNetwork.evaluate() (в зависимости от того,итератор набора обучающих или тестовых данных).

Однако в моем случае набор данных, который у меня есть, не сохраняется в файле CSV.Я получаю к нему доступ через стороннюю библиотеку, предварительно обрабатываю ее, чтобы получить объекты List<Data> и List<Labels>.

Как я могу:

1) создать DataSetIterator из двух моих списков?

2) разделить DataSetIterator на тренировочный набор и тестовый набор?

Редактировать :

Я думаюмой вопрос слишком широк.Позвольте мне попытаться сузить его.

Я начал читать эту статью , которая использует очень простой подход для создания набора данных:

Создает два INDArrays истроит DataSet из них, используя конструктор DataSet(INDArray first, INDArray second).

Обучение данных работает с использованием network.fit(dataSet);, но я не могу оценить его во время обучения, так как метод evaluate требует итератор набора данных, а ненабор данных.

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

Я также предполагаю, что я мог бы создавать мини-пакетыиз этого большого набора данных с использованием метода batchBy(int num).Но этот метод возвращает список наборов данных, а не итератор набора данных ... iterateWithMiniBatches () действительно возвращает итератор набора данных, но когда я посмотрел на исходный файл, он возвращает ноль и устарел.Затем я попытался увидеть, есть ли реализация DataSetIterator, которую я мог бы использовать, но их много.Я попробовал BaseDataSetIterator, но он принимает не DataSet в качестве параметра конструктора, а DataSetFetcher ... Еще один слой.

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

1 Ответ

0 голосов
/ 11 января 2019

1)

MultiLayerNetwork.evaluate() принимает ListDataSetIterator в качестве параметра

Если у вас есть List<Data> object, вы можете сначала отобразить его в double[] featureVector и double[] labelVector изатем создайте ListDataSetIterator вот так

    INDArray x = Nd4j.create(featureVector, new int[]{featureVector.length/numberOfFeatures, numberOfFeatures}, 'c');
    INDArray y = Nd4j.create(labelVector, new int[]{labelVector.length/numberOfLabels, numberOfLabels}, 'c');

    final DataSet allData = new DataSet(x,y);

    final List<DataSet> list = allData.asList();

    ListDataSetIterator iterator = new ListDataSetIterator(list);

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

Затем вы можете оценить свою сеть с помощью net.evaluate(testIterator);

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