【问题标题】:Neural networks - input values神经网络 - 输入值
【发布时间】:2010-10-13 17:51:51
【问题描述】:

我有一个可能是微不足道的问题,但在我看过的任何地方都没有描述。我正在研究神经网络,我所看到的任何地方都有一些理论和一些简单的例子,其中一些 0 和 1 作为输入。我想知道:我是否必须只将一个值作为一个神经元的输入值,或者它可以是一个向量,比如说,3 个值(例如 RGB 颜色)?

【问题讨论】:

    标签: neural-network


    【解决方案1】:

    通常,单个神经元的输入是介于 0 和 1 之间的值。该约定不仅是为了便于实现,而且因为将输入值归一化到相同的范围可确保每个输入具有相似的权重。 (如果您有一些具有 8 位颜色且像素值介于 0 和 7 之间的图像,以及一些具有 16 位颜色且像素值介于 0 和 255 之间的图像,那么您可能不想仅仅因为数值为更高。同样,您可能希望图像具有相同的尺寸。)

    就使用像素值作为输入而言,尝试收集比其像素更高级别的图像表示是很常见的 (more info)。例如,给定一个 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 face detection 了解更多信息。

    [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 颜色模型并提取色调分量,并可能使用饱和度和亮度。嗯……

      【讨论】:

        【解决方案3】:

        上述答案在技术上是正确的,但不能解释简单的事实:从不需要将数字向量提供给单个神经元的情况。

        从实际的角度来看,这是因为(如早期解决方案之一所示)您可以只为向量中的每个数字设置一个神经元,然后将所有这些作为单个神经元的输入。这应该会让你在训练后得到你想要的行为,因为第二层神经元可以有效地利用整个向量。

        从数学的角度来看,编码理论有一个基本定理,即任何数字向量都可以表示为单个数字。因此,如果您真的不想要额外的神经元层,您可以简单地将 RGB 值编码为单个数字并将其输入到神经元。不过,这种编码功能可能会使大多数学习问题变得更加困难,所以我怀疑这种解决方案在大多数情况下是否值得。

        总结一下:人工神经网络在没有给输入单元一个向量的情况下使用,但不会因此而失去计算能力。

        【讨论】:

          【解决方案4】:

          只要你相应地编写你的内部函数,它可以是任何你想要的。

          您提到的示例使用 [0;1] 作为其域,但您可以使用 R、R² 或任何您想要的,只要您在神经元中使用的函数是在此域上定义的。

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

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

          您可以在on Wikipedia 获得非常详细的信息(包括您的问题的答案)。

          【讨论】:

          • 但如果一个数据集与另一个数据集保持关联,则应该将它们提供给不同的神经元,不是吗?或者它可能是一个向量的输入?
          • 是的,它可以是一个向量输入; R3 表示一个 3 成员向量(嗯,简单地说)
          • 好吧,我明白了或者一个神经元用于包含这 3 种颜色的输入?还是我自己选?
          • 我想我会使用一个神经元数组(每个像素 1 个),每个神经元获取三个 RGB 向量(每个图像的相同坐标像素一个)作为输入值。
          • 感谢您的帮助!最后一个问题 - 这是否意味着我必须有一个函数将我的 R^n 值更改为输入神经元的 R 值?
          【解决方案5】:

          通常,单个神经元将多个实数作为其输入并输出一个实数,通常通过将 sigmoid 函数应用于实数之和(缩放,然后加上或减去一个常数偏移)来计算。

          如果您想输入两个 RGB 向量(2 x 3 实数),您需要决定如何组合这些值。如果将所有元素加在一起并应用 sigmoid 函数,则相当于获得了六个实数“平”。另一方面,如果您分别处理 R 元素、G 元素和 B 元素(例如,将这些对相加或相减),则实际上您拥有三个独立的神经元。

          所以简而言之,不,单个神经元不接受向量值。

          【讨论】:

          • 所以在您描述的情况下,您有 3 个输入神经元,每个神经元获得一个由三个值组成的值,例如三个 Rs?
          • 啊,在上面的例子中实际上只有两个 R,但是是的,一种方法是每个元素专用一个神经元。
          【解决方案6】:

          在处理多维数据时,我相信据说两层神经网络可以提供更好的结果。

          在你的情况下:

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

          如您所见,N4 神经元可以处理 3 个条目。

          [0..1] 间隔是一种约定,但在 imo 中是一个很好的间隔。这样,您可以轻松编写一组可以采用任意数量条目的通用神经元类(我有模板 C++ 类,其中条目数作为模板参数个人)。因此,您只需编写一次神经元的逻辑代码,然后就可以玩弄网络的结构和/或神经元内的功能组合。

          【讨论】:

          • 问题是我有一组图像的像素,我有一些(3?)一个视图的后续图像,它们给我一些(3?)一个像素的不同颜色。每种颜色由 3 个值组成。问题是 - 待续
          • 问题是我应该为每个图像的每个像素的每个 r 和 g 和 b 设计一个输入神经元,还是我可以将颜色(r、g、b 值)作为一个神经元的输入,或者可能是 3 种后续颜色?
          • 问题是你有很多选择。究竟是什么问题?如果它对每个像素都是本地的(即,解决方案仅取决于同一像素的三种连续颜色),那么您只需要一个神经网络即可输入数据(...)
          • (...) 逐个像素。现在,应该如何配置神经网络?对此没有真正的答案。你是否应该有 3 个像我在帖子中那样的子网络,而不是将它们的结果累积到另一个神经元中?最后你应该有 9 个入口神经元和一个累加器吗? (...)
          • 不,这是关于识别运动,所以它取决于一个像素的颜色变化以及我猜它对他的邻居的影响
          猜你喜欢
          • 2012-10-05
          • 1970-01-01
          • 2020-08-10
          • 2020-12-28
          • 2012-03-29
          • 2012-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多