Нейронные сети - входные значения - PullRequest
20 голосов
/ 17 марта 2009

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

Ответы [ 6 ]

10 голосов
/ 01 июля 2011

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

С практической точки зрения это потому, что (как показало одно из более ранних решений) вы можете просто иметь нейрон для каждого числа в векторе, а затем иметь все эти входные данные для одного нейрона. Это должно дать вам желаемое поведение после тренировки, так как нейрон второго слоя может эффективно использовать весь вектор.

С математической точки зрения существует фундаментальная теорема теории кодирования, которая гласит, что любой вектор чисел может быть представлен как одно число. Таким образом, если вам действительно не нужен дополнительный слой нейронов, вы можете просто закодировать значения RGB в одно число и ввести его в нейрон. Хотя эта функция кодирования, вероятно, усложнит большинство задач обучения, поэтому я сомневаюсь, что в большинстве случаев это решение будет того стоить.

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

6 голосов
/ 17 марта 2009

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

В вашем случае:

R[0..1] => (N1)----\
                    \
G[0..1] => (N2)-----(N4) => Result[0..1]
                    /
B[0..1] => (N3)----/

Как видите, нейрон N4 может обрабатывать 3 записи.

Интервал [0..1] является условным, но хорошим. Таким образом, вы можете легко кодировать набор универсальных классов нейронов, которые могут принимать произвольное количество записей (у меня были шаблоны классов C ++ с количеством записей в качестве параметра шаблона лично). Итак, вы один раз кодируете логику своих нейронов, затем играете со структурой сети и / или комбинациями функций внутри ваших нейронов.

3 голосов
/ 24 декабря 2014

Как правило, вход для одного нейрона представляет собой значение от 0 до 1. Это соглашение не только для простоты реализации, но и потому, что нормализация входных значений к одному и тому же диапазону гарантирует, что каждый вход имеет одинаковые весовые коэффициенты. (Если у вас есть несколько изображений с 8-битным цветом со значениями пикселей от 0 до 7 и некоторые изображения с 16-битным цветом со значениями пикселей от 0 до 255, вы, вероятно, не захотите отдавать предпочтение 24-битным цветным изображениям только потому, что числовые значения выше. Точно так же вы, вероятно, захотите, чтобы ваши изображения были одинакового размера.)

Что касается использования значений пикселей в качестве входных данных, очень часто пытаются собрать представление изображения более высокого уровня, чем его пиксели ( больше информации ). Например, для изображения серой шкалы 5 x 5 (нормализовано):

[1 1 1 1 1]
[0 0 1 0 0] 
[0 0 1 0 0] 
[0 0 1 0 0] 
[0 0 1 0 0]

Мы могли бы использовать следующие матрицы элементов, чтобы помочь обнаружить горизонтальные, вертикальные и диагональные элементы изображений. См. обнаружение лица python haar для получения дополнительной информации.

[1 1]  [0 0]  [1 0]  [0 1]  [1 0], [0 1]
[0 0], [1 1], [1 0], [0 1], [0 1], [1 0]

Чтобы построить входной вектор, v , для этого изображения возьмите первую матрицу объектов 2x2 и «примените» ее с поэлементным умножением к первой позиции в изображении. Применение

[1 1] (the first feature matrix) to [1 1] (the first position in the image)
[0 0]                               [0 0] 

приведет к 2, потому что 1 * 1 + 1 * 1 + 0 * 0 + 0 * 0 = 2. Добавьте 2 к обратной стороне вашего входного вектора для этого изображения. Затем переместите эту матрицу объектов на следующую позицию, одну справа, и примените ее снова, добавив результат во входной вектор. Делайте это повторно для каждой позиции матрицы объектов и для каждой из матриц объектов. Это создаст ваш входной вектор для одного изображения. Убедитесь, что вы строите векторы в одинаковом порядке для каждого изображения.

В этом случае изображение черно-белое, но с помощью значений RGB вы можете расширить алгоритм, чтобы выполнить те же вычисления, но добавить 3 значения к входному вектору для каждого пикселя - по одному для каждого цвета. Это должно обеспечить вас одним входным вектором для каждого изображения и одним входом для каждого нейрона. Затем векторы должны быть нормализованы перед запуском по сети.

2 голосов
/ 02 июня 2013

Используйте длину волны света, нормированную на видимый спектр, в качестве входных данных.

В сети есть несколько приближенных уравнений. Поиск RGB в преобразование длины волны или же используйте цветовую модель HSL и выделите компонент Hue и, возможно, также используйте Saturation и Lightness. Ну ...

2 голосов
/ 17 марта 2009

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

Если вы хотите ввести, скажем, два вектора RGB (2 x 3 реала), вам нужно решить, как вы хотите объединить значения. Если вы сложите все элементы вместе и примените сигмовидную функцию, это равносильно тому, чтобы получить в шести реалах «плоский». С другой стороны, если вы обрабатываете элементы R, затем элементы G и элементы B, все по отдельности (например, суммируйте или вычитаете пары), на практике вы получите три независимых нейрона.

Короче говоря, нет, один нейрон не принимает векторные значения.

1 голос
/ 17 марта 2009

Это может быть все, что вы хотите, если вы напишите свою внутреннюю функцию соответственно.

Упомянутые вами примеры используют [0; 1] в качестве своего домена, но вы можете использовать R, R² или что угодно, если в этом домене определена функция, которую вы используете в своих нейронах.

В вашем случае вы можете определить свои функции на R3, чтобы разрешить обработку значений RGB

Тривиальный пример: используйте (x1, y1, z1), (x2, y2, z2) -> (ax1 + x2, by1 + y2, cz1 + z2) в качестве функции для преобразования двух цветов в один, ab и c - ваши учебные ориентиры, которые вы определите на этапе обучения.

Очень подробная информация (включая ответ на ваш вопрос) доступна в Википедии .

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