Как используются нейронные сети, когда количество входов может быть переменным?
все примеры, которые я видел в нейронных сетях, предназначены для фиксированного набора входных данных, который хорошо работает для изображений и данных фиксированной длины. Как вы справляетесь с данными переменной длины, такими как предложения, запросы или исходный код? Есть ли способ кодировать данные переменной длины в входы фиксированной длины и все еще получать свойства обобщения нейронных сетей?
6 ответов:
обычно вы извлекаете объекты из данных и передаете их в сеть. Не рекомендуется брать только некоторые данные и передавать их в сеть. На практике предварительная обработка и выбор правильных функций будут определять ваш успех и производительность нейронной сети. К сожалению, ИМХО требуется опыт, чтобы развить чувство для этого, и это ничего не может узнать из книги.
Подводя итог: "мусор в, мусор из"
Я был там, и я столкнулась с этой проблемой. ANN был сделан для фиксированной длины вектора объектов, а также для многих других классификаторов, таких как KNN, SVM, Bayesian и т. д. т. е. входной слой должен быть четко определен и не изменяется, это проблема дизайна. Однако некоторые исследователи предпочитают добавлять нули, чтобы заполнить недостающий пробел, я лично думаю, что это не очень хорошее решение, потому что эти нули (нереальные значения) будут влиять на веса, к которым будет сходиться сеть. кроме того, там может быть быть настоящим сигналом, оканчивающиеся нулями.
ANN не единственный классификатор, есть больше и даже лучше, такие как случайный лес. этот классификатор считается лучшим среди исследователей, он использует небольшое количество случайных объектов, создавая сотни деревьев решений с помощью начальной загрузки мешков, это может хорошо работать, количество выбранных объектов обычно составляет sqrt размера вектора объектов. эти функции являются случайными. каждое дерево решений сходится к решению, используя большинство правил наиболее вероятный класс будет выбран тогда.
другое решение заключается в использовании динамического времени деформации DTW, или даже лучше использовать скрытые Марковские модели хм.
другое решение-интерполяция, интерполировать (компенсировать пропущенные значения вдоль Малого сигнала) все малые сигналы должны быть с тем же размером, что и максимальный сигнал, методы интерполяции включают и не ограничиваются усреднением, B-сплайном, кубическим.....
другое решение-использовать функцию метод извлечения для использования лучших функций (наиболее отличительных), на этот раз сделать их фиксированного размера, эти методы включают в себя PCA, LDA и т.д.
другое решение заключается в использовании выбора объектов (обычно после извлечения объектов) простой способ выбрать лучшие объекты, которые дают лучшую точность.
вот и все на сегодня, если не из тех, кто работал для Вас, пожалуйста, свяжитесь со мной.
некоторые проблемы могут быть решены с помощью рекуррентной нейронной сети. Например, это хорошо для вычисления четности по последовательности входных данных.
The рекуррентная нейронная сеть для вычисления четности будет иметь только одну входную функцию. Биты могут быть поданы в него с течением времени. Его выход также подается обратно в скрытый слой. Это позволяет узнать четность только с двумя скрытыми единицами.
нормальная двухслойная нейронная сеть с обратной связью потребует 2 * * sequence_length скрытые единицы для представления четности. Это ограничение держит для любой архитектуры всего с 2 слоями (например, SVM).
Я предполагаю, что один из способов сделать это-добавить временную составляющую к входу (рекуррентная нейронная сеть) и передать вход в сеть кусок за раз (в основном создавая эквивалент нейронной сети лексера и парсера) это позволит входу быть довольно большим, но будет иметь недостаток, что не обязательно будет символ остановки для разделения различных последовательностей ввода друг от друга (эквивалент периода в посылках)
чтобы использовать нейронную сеть на изображениях разных размеров, сами изображения часто обрезаются и масштабируются вверх или вниз, чтобы лучше соответствовать входу сети. Я знаю, что на самом деле это не ответ на ваш вопрос, но, возможно, что-то подобное было бы возможно с другими типами ввода, используя какую-то функцию преобразования на входе?
Я не совсем уверен, но я бы сказал, что используйте максимальное количество входов (например, для слов, скажем, ни одно слово не будет длиннее 45 символов (самое длинное слово, найденное в словаре согласно Википедии), и если встречается более короткое слово, установите другие входы на символ пробела.
или с двоичными данными, установите его в 0. единственная проблема с этим подходом заключается в том, что вход, заполненный пробелами / нулями / независимо от того, сталкивается с допустимым входом полной длины (не так много проблема со словами, как и с числами).