Нейронные сети - входные значения

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


person agnieszka    schedule 16.03.2009    source источник


Ответы (6)


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

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

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

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

person zergylord    schedule 30.06.2011

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

В твоем случае:

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

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

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

person Julian Aubourg    schedule 16.03.2009
comment
проблема в том, что у меня есть набор пикселей изображения, у меня есть несколько (3?) последующих изображений одного представления, которые дают мне несколько (3?) разных цветов одного пикселя. каждый цвет состоит из 3-х значений. вопрос - продолжение следует - person agnieszka; 17.03.2009
comment
вопрос в том, должен ли я создавать один входной нейрон для каждого r, g и b для каждого пикселя для каждого изображения, или я могу поместить цвет (значение r, g, b) в качестве входных данных для одного нейрона, или, возможно, 3 последующих цвета? - person agnieszka; 17.03.2009
comment
Дело в том, что здесь у вас много вариантов. В чем именно проблема? Если он локален для каждого пикселя (т.е. решение зависит только от трех последовательных цветов одного и того же пикселя), тогда вам понадобится только одна нейронная сеть, в которую вы будете вводить свои данные (...) - person Julian Aubourg; 17.03.2009
comment
(...) пиксель за пикселем. Теперь, как следует настроить нейронную сеть? На это нет настоящего ответа. Должны ли вы иметь 3 подсети, подобные той, что есть в моем посте, чем накапливать их результат в другом нейроне? Стоит ли в итоге иметь 9 входных нейронов и один кумулятор? (...) - person Julian Aubourg; 17.03.2009
comment
нет, речь идет о распознавании движения, поэтому это зависит от изменения цвета одного пикселя и его восприятия его соседями, я думаю - person agnieszka; 17.03.2009
comment
(...) или вам нужен только один нейрон, который будет принимать все 9 значений одновременно? (что, кстати, на самом деле не было бы сетью, так сказать). Все зависит от вашей проблемы, и универсального решения не существует, потому что каждая проблема индивидуальна. (...) - person Julian Aubourg; 17.03.2009
comment
Я просто пытаюсь выяснить, есть ли вообще способ поместить вектор, такой как цвет, в качестве входного значения для ОДНОГО входного нейрона, или мне нужно указать одно значение для одного нейрона, потому что я все еще не понимаю его - person agnieszka; 17.03.2009
comment
(...) вам действительно нужно разбить проблему на подзадачи. Мне кажется, нужно что-то определять, используя 3 последовательных цвета одного и того же пикселя: это сеть Net1. А потом, может быть, нужно учесть соседей (...) - person Julian Aubourg; 17.03.2009
comment
(...) с другой сетью, которая примет результат Net1 в качестве входных данных (Net2). - person Julian Aubourg; 17.03.2009
comment
И снова нейрон может принимать столько записей, сколько вы хотите, как сказал Бранн. Все дело в том, какая у вас в этом функция. Если он может принимать в качестве входных данных несколько значений, значит, у вас есть нейрон с несколькими входами. - person Julian Aubourg; 17.03.2009
comment
Итак, если мой нейрон в первом слое принимает цвет, может ли он создавать цвет в качестве вывода для нейрона во втором слое? - person agnieszka; 17.03.2009
comment
Я бы не рекомендовал трехмерный вывод для нейрона. Я бы предпочел, чтобы вы вводили нейроны (Layer1) с одним выходом, который выдается на каждые 3 нейрона Layer2. Затем вы можете использовать 3 выхода Layer2 в качестве результирующего цвета. - person Julian Aubourg; 17.03.2009

Как правило, входными данными для одного нейрона является значение от 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 значения к входному вектору для каждого пикселя - по одному для каждого цвета. Это должно предоставить вам один входной вектор для каждого изображения и один вход для каждого нейрона. Затем векторы необходимо будет нормализовать перед запуском по сети.

person tpbarron    schedule 24.12.2014

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

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

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

person Antti Huima    schedule 17.03.2009
comment
Итак, в описанной вами ситуации у вас есть 3 входных нейрона, каждый из которых получает значение, состоящее из трех значений, например три Rs? - person agnieszka; 17.03.2009
comment
Ах, там, где на самом деле только два R в приведенном выше примере, но да, один из способов - выделить один нейрон на один элемент. - person Antti Huima; 17.03.2009

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

В сети есть несколько приблизительных уравнений. Найдите преобразование RGB в длину волны или используйте цветовую модель HSL и извлеките компонент оттенка и, возможно, также используйте насыщенность и яркость. Хорошо...

person loa_in_    schedule 02.06.2013

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

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

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

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

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

person Brann    schedule 16.03.2009
comment
но если один набор данных остается во взаимосвязи с другим набором данных, они должны быть предоставлены разным нейронам, не так ли? или это может быть вход одного вектора? - person agnieszka; 17.03.2009
comment
да, это может быть один векторный ввод; R3 означает трехчленный вектор (ну, тривиально говоря) - person Brann; 17.03.2009
comment
ну да, я понимаю: D я имею в виду, если у вас есть 3 цвета одного пикселя в 3 последующих изображениях, и вы знаете, что различия между этими цветами влияют на результат, если у вас есть 3 нейрона для этих 3 цветов или один нейрон для входа, содержащего эти 3 цвета? или я выбираю? - person agnieszka; 17.03.2009
comment
Думаю, я бы использовал массив нейронов (1 на пиксель), при этом каждый нейрон получал бы три вектора RGB (по одному на один и тот же координатный пиксель каждого изображения) в качестве входных значений. - person Brann; 17.03.2009
comment
спасибо, что было полезно! последний вопрос - означает ли это, что у меня должна быть функция, которая изменяет мое значение R ^ n на значение R для входного нейрона? - person agnieszka; 17.03.2009