Как последовательно передавать данные из вектора для обучения нейронной сети?
Есть данные в виде одномерного массива из произвольного количества элементов типа float.
Нейронная сеть имеет 10 входных нейронов. Данные для обучения должны подаваться последовательно по 10 значений из массива. Сначала с 1 по 10 элемент, потом со 2 по 11, потом с 3 по 12 и т.д. Без перемешивания.
Можно, конечно, нарезать двумерный массив с соответствующими данными и подавать строчками, но это не рационально, если начальные данные измеряются гигабайтами.
Какие есть варианты реализации данной задачи?
Сеть рекуррентная? Или обычная? И почему это нарезать двумерный массив - нерационально? При нормальной реализации массива (а не через списки) разницы нет, так как порядок элементов в памяти один и тот же.
Vindicar, какая разница какая сеть, если вопрос в способе передачи данных средствами PyTorch при обучении. Вопрос находится в рамках между загрузкой данных с диска и передачей их во входные нейроны. Что до или после - роли не играет.
так как порядок элементов в памяти один и тот же.
При чём здесь порядок, если речь про объём. Вы же не будете утверждать, что массив Х и массив [Х-1, 10] займут одинаковый объём памяти. Или я что-то не знаю?
Вы либо не читали, что я написал и ответили лишь бы ответить, либо я как-то недостаточно разжевал.
Мне не нужно, чтобы из массива данные брались с 1 по 10, потом с 11 по 20. Мне нужно, чтобы вторая "порция" была со 2 по 11.
С чего вы взяли, что вторая порция будет с 11 по 20? __get_item__ это ВАША функция, вы же можете написать, что следующий вызов возвратит со 2 по 11? Никогда не переписывайте подсказку, делайте функцию под себя.
Александр Скуснов, а так можно? я считал она жёстко привязана к библиотеке и параметрам. Я знаком с программированием, но не с питоном конкретно. Есть какая-то ссылка на описание на русском как это можно реализовать?
создаём класс на основе dataset, в объект на основе этого класса загружаются наши данные для обучения и потом это всё используется через стандартный dataloader, который сам обращается к нашему getitem. Я правильно понял?
Честно говоря, я сам не питонист, больше читаю, чем пишу.
Вы сделайте пример на очень коротких данных, чтобы проверить логику работы, а уж потом переходите к гигабайтам.
Гигабайты в виде одномерного массива в памяти?
Если оно в памяти то какие проблемы, пишешь что то типа mas[pos:pos+size] и получаешь подмассив
это сработает и с numpy массивами
если в файле, то вычисляешь позицию нужного элемента, делаешь туда file.seek и читаешь (чтобы легко было вычислять позицию, пиши фиксированными блоками на строку, дополняя пробелами ну или бинарными форматами)
Подозреваю вы предлагаете способ брать диапазон значений из массива, но это можно использовать, если у вас есть цикл. А если вы знакомы с библиотеками для обучения нс, то знаете, что там формально циклов нет. В конкретном случае, есть тензор с обучающими данными, тензор с правильными ответами, модель сети и команда "сделать красиво". Поэтому и вопрос как правильно подать данные. что бы не "плодить сущности".
И чем вас так удивили гигабайты в массиве? Поток данных за период. Он может быть и "толще", если использовать несколько параметров.