神经网络 - 输入值

26

我有一个问题可能很琐碎,但我查看的任何地方都没有描述。我正在学习神经网络,无论我看哪里,都有一些理论和一些使用0和1作为输入的琐碎例子。我想知道:我必须为一个神经元仅放入一个值作为输入值,还是可以是一个向量,比如三个值(例如RGB颜色)?

6个回答

12
上面的答案在技术上是正确的,但没有解释一个简单的事实:从来没有一种情况需要将向量传递给单个神经元。
从实际角度来看,这是因为(正如早些时候的一个解决方案所示),您可以为向量中的每个数字都添加一个神经元,然后将所有这些神经元作为单个神经元的输入。训练后,第二层的神经元可以有效地利用整个向量,从而实现所需的行为。
从数学角度来看,编码理论有一个基本定理,即任何数字向量都可以表示为一个单一的数字。因此,如果您真的不想要额外的神经元层,您可以将RGB值编码为单个数字,并将其输入到神经元中。尽管如此,这个编码函数可能会使大多数学习问题更加困难,因此我怀疑这种解决方案在大多数情况下不值得尝试。
总之:人工神经网络可以在没有将向量传递给输入单元的情况下使用,但并不会因此失去计算能力。

8
处理多维数据时,我相信使用两层神经网络可以获得更好的结果。
在您的情况下:
R[0..1] => (N1)----\
                    \
G[0..1] => (N2)-----(N4) => Result[0..1]
                    /
B[0..1] => (N3)----/

如您所见,N4神经元可以处理3个输入。
[0..1]区间是一种惯例,但我认为是一个很好的惯例。这样,您可以轻松编写一组通用的神经元类,可以接受任意数量的输入(我个人使用模板C++类作为输入数量的模板参数)。因此,您只需编写一次神经元的逻辑,然后就可以玩弄网络结构和/或神经元中函数的组合。

1
问题是,我应该为每个像素的每个r、g和b设计一个输入神经元,还是可以将颜色(r、g、b值)作为一个神经元的输入,或者可能是3个连续的颜色? - agnieszka
问题在于你有很多选择。确切的问题是什么?如果它只是每个像素本地的(即,解决方案仅取决于同一像素的三个连续颜色),那么你只需要一个神经网络,其中输入数据即可。(...) - Julian Aubourg
不,这是关于识别运动的,因此它取决于一个像素颜色的变化以及它与邻居之间的关系。 - agnieszka
我只是想找出是否有一种方法可以将向量(例如颜色)作为一个输入值放入一个单输入神经元中,还是我必须为一个神经元放置一个值,因为我仍然不理解。 - agnieszka
(...) 你真正需要做的是将问题分解为子问题。在我看来,你需要使用相同像素的3个连续颜色来确定“某些东西”:这是网络Net1。然后,也许你需要考虑邻居的影响。(...) - Julian Aubourg
显示剩余7条评论

4
通常,单个神经元的输入值在0到1之间。这种惯例不仅是为了实现方便,而且是因为将输入值归一化到相同的范围可以确保每个输入具有类似的权重。(如果您有一些像素值介于0和7之间的8位颜色图像和一些像素值介于0和255之间的16位颜色图像,您可能不会希望仅仅因为数字值更高而偏爱24位颜色图像。同样,您可能希望您的图像具有相同的尺寸。)
就使用像素值作为输入而言,通常会尝试收集比其像素更高级别的图像表示(更多信息)。例如,给定一个5×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

使用归一化到可见光谱的光波长作为输入。

网络上有一些近似的方程式。 搜索RGB到波长转换 或者 使用HSL颜色模型并提取色相分量,可能也要使用饱和度和亮度。嗯...


2
通常一个神经元会接收多个实数作为输入,并输出一个实数,通常计算方法是将这些实数相加(先进行缩放),然后应用sigmoid函数得到的结果再加上或减去一个常量偏移量。
如果你想输入两个RGB向量(2 x 3 实数),你需要决定如何组合这些值。如果你将所有元素相加并应用sigmoid函数,则相当于输入了六个“平坦”的实数。另一方面,如果你分别处理R元素、G元素和B元素,例如对成对的元素求和或相减,那么实际上就有了三个独立的神经元。
因此,简而言之,单个神经元不能接收向量值作为输入。

所以在您描述的情况下,您有3个输入神经元,每个神经元都会得到一个由三个值组成的值,例如三个R? - agnieszka
啊,在上面的例子中实际上只有两个 R,但是是的,一种方法是为每个元素分配一个神经元。 - Antti Huima

1

它可以是你想要的任何东西,只要你根据自己的内部函数编写即可。

你提到的例子使用[0;1]作为它们的定义域,但是你可以使用R、R²或者任何你想要的定义域,只要你在神经元中使用的函数在这个定义域上被定义。

在你的情况下,你可以在R3上定义你的函数,以允许处理RGB值。

一个简单的例子:使用(x1,y1,z1),(x2,y2,z2)->(ax1+x2,by1+y2,cz1+z2)作为你的函数,将两种颜色转换为一种颜色,其中a、b和c是你在学习阶段确定的学习系数。

非常详细的信息(包括你问题的答案)可以在维基百科上找到。


但是,如果一个数据集与另一个数据集保持关联,它们应该提供给不同的神经元,是吗?还是可以作为一个向量的输入? - agnieszka
是的,它可以是一个向量输入;R3表示一个由三个元素组成的向量(嗯,简单来说)。 - Brann
嗯,我明白了:D我的意思是,如果您在连续的三个图像中有一个像素的3种颜色,并且您知道这些颜色之间的差异会影响结果,那么您应该为这3种颜色拥有3个神经元,还是为包含这3种颜色的输入拥有一个神经元?还是由我来选择? - agnieszka
我想我会使用神经元数组(每个像素一个),每个神经元都会获得三个RGB向量(每个图像相同坐标像素的一个)作为输入值。 - Brann
谢谢,这很有帮助!最后一个问题 - 这是否意味着我必须拥有一个将我的R ^ n值更改为输入神经元的R值的函数? - agnieszka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接