У меня есть вопрос, который может быть тривиальным, но я нигде не описал его. Я изучаю нейронные сети, и везде, куда я смотрю, есть немного теории и какой-то тривиальный пример с некоторыми нулями и единицами в качестве входных данных. Мне интересно: нужно ли мне вводить только одно значение в качестве входного значения для одного нейрона или это может быть вектор, скажем, из трех значений (например, цвет RGB)?
Нейронные сети - входные значения
Ответы (6)
Приведенные выше ответы технически верны, но не объясняют простой истины: никогда не бывает ситуации, когда вам нужно было бы передать вектор чисел одному нейрону.
С практической точки зрения это связано с тем, что (как показало одно из предыдущих решений) вы можете просто иметь нейрон для каждого числа в векторе, а затем все они будут входными данными для одного нейрона. Это должно дать вам желаемое поведение после тренировки, поскольку нейрон второго слоя может эффективно использовать весь вектор.
С математической точки зрения существует фундаментальная теорема теории кодирования, которая гласит, что любой вектор чисел может быть представлен как одно число. Таким образом, если вам действительно не нужен дополнительный слой нейронов, вы можете просто закодировать значения RGB в одно число и ввести его в нейрон. Хотя эта функция кодирования, вероятно, усложнит большинство проблем с обучением, поэтому я сомневаюсь, что это решение того стоит в большинстве случаев.
Подводя итог: искусственные нейронные сети используются без передачи вектора входному блоку, но из-за этого не теряют вычислительной мощности.
Я считаю, что при работе с многомерными данными двухслойная нейронная сеть дает лучший результат.
В твоем случае:
R[0..1] => (N1)----\
\
G[0..1] => (N2)-----(N4) => Result[0..1]
/
B[0..1] => (N3)----/
Как видите, нейрон N4 может обрабатывать 3 записи.
Интервал [0..1] является условным, но мне кажется, он хороший. Таким образом, вы можете легко закодировать набор общих классов нейронов, которые могут принимать произвольное количество записей (у меня лично были классы шаблонов C ++ с количеством записей в качестве параметра шаблона). Итак, вы кодируете логику своих нейронов один раз, а затем играете со структурой сети и / или комбинациями функций в нейронах.
Как правило, входными данными для одного нейрона является значение от 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]
Мы могли бы использовать следующие матрицы признаков, чтобы помочь обнаружить горизонтальные, вертикальные и диагональные особенности изображений. Дополнительную информацию см. В разделе определение лица haar Face для Python.
[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 значения к входному вектору для каждого пикселя - по одному для каждого цвета. Это должно предоставить вам один входной вектор для каждого изображения и один вход для каждого нейрона. Затем векторы необходимо будет нормализовать перед запуском по сети.
Обычно один нейрон принимает в качестве входных данных несколько действительных чисел и выводит действительное число, которое обычно вычисляется как применение сигмоидной функции к сумме действительных чисел (масштабированное, а затем плюс или минус постоянное смещение).
Если вы хотите вставить, скажем, два вектора RGB (2 x 3 реала), вам нужно решить, как вы хотите объединить значения. Если вы сложите все элементы вместе и примените сигмовидную функцию, это эквивалентно получению шести реалов «плоской». С другой стороны, если вы обрабатываете элементы R, затем элементы G и элементы B по отдельности (например, суммируете или вычитаете пары), на практике вы получаете три независимых нейрона.
Короче говоря, нет, отдельный нейрон не принимает векторные значения.
Используйте в качестве входных данных длину волны света, нормализованную к видимому спектру.
В сети есть несколько приблизительных уравнений. Найдите преобразование RGB в длину волны или используйте цветовую модель HSL и извлеките компонент оттенка и, возможно, также используйте насыщенность и яркость. Хорошо...
Это может быть все, что вы хотите, если вы соответствующим образом напишете свою внутреннюю функцию.
В приведенных вами примерах в качестве домена используется [0; 1], но вы можете использовать R, R² или что угодно, если функция, которую вы используете в своих нейронах, определена в этом домене.
В вашем случае вы можете определить свои функции на R3, чтобы разрешить обработку значений RGB.
Тривиальный пример: используйте (x1, y1, z1), (x2, y2, z2) -> (ax1 + x2, by1 + y2, cz1 + z2) в качестве своей функции, чтобы преобразовать два цвета в один, ab и c - ваши коэффициенты обучения, которые вы определите на этапе обучения.
Очень подробная информация (включая ответ на ваш вопрос) доступна в Википедии.