卷积神经网络中的权重如何表示?

数据挖掘 神经网络 卷积神经网络
2021-09-26 06:41:40

我一直在尝试按照一些在线指南开发卷积神经网络 但是,我遇到的大多数指南都忽略了一个重要细节,即如何以编程方式表示 CNN 中的权重。

据我了解,在“常规”神经网络中,连接的权重是一个数值,对其进行调整以减少误差;然后使用反向传播来进一步更新权重,从而减少误差等。

然而,在 CNN 中,输入是一个数字数组(图像)和这些数字的子集(滤波器),通过将滤波器像素乘以原始像素来计算平均误差。

那么,图像的每个过滤器(内核或特征图)是否有一个权重神经元?或者是一个单一的权重神经元由所有平均误差的总和来表示,这是通过在感受野上卷积滤波器计算的,这样你最终有一个值,那就是整个图像的总误差?

2个回答

在卷积层中,权重表示为滤波器的乘法因子。


例如,如果我们有绿色的输入二维矩阵

在此处输入图像描述

使用卷积滤波器

在此处输入图像描述

卷积滤波器中的每个矩阵元素都是正在训练的权重。这些权重将影响提取的卷积特征

在此处输入图像描述

根据得到的特征,我们得到预测的输出,我们可以使用反向传播来训练卷积滤波器中的权重,如您在此处看到的那样。

在@JahKnows 理论答案的基础上,这里是权重在Conv2D行动中的样子。

from keras import *
from keras.layers.convolutional import Conv2D

model = Sequential()
model.add(Conv2D(12, kernel_size=3, input_shape=(25, 25, 1)))
#just initialized, not fit to any data.
>>> weights[0].shape
'(3, 3, 1, 12)'

所以一个 3x3 矩阵(9 个数组),其中每个数组都是一个(1x12)向量

  • 前 2 个维度:看起来像内核大小;(3,3)。
  • 最后2个尺寸:1*12;其中 12 是单位,1 是来自 input_shape 的通道,也就是颜色。

加上 12 个偏置神经元:

  • 看起来还有一个单独的weights[1]12x1 用于偏置,它会逐渐进入其他 12x1 中的每一个。
>>> weights[0]
array([[[[-0.22489263,  0.11462553,  0.1275196 ,  0.19356592,
          -0.06204098,  0.10875972, -0.09088454,  0.12002607,
           0.14580582, -0.10627564,  0.04845475,  0.16762014]],

        [[-0.00685272, -0.144605  ,  0.00162746, -0.17116429,
          -0.13180375, -0.13356137,  0.02543293,  0.09918924,
           0.19696428, -0.01112208, -0.17443556,  0.105253  ]],

        [[ 0.04283331,  0.1003729 , -0.21573427, -0.08311893,
          -0.0144719 ,  0.10843249, -0.1036434 ,  0.1704862 ,
           0.22398098, -0.2159951 ,  0.13356568, -0.13963732]]],


       [[[-0.00911894,  0.12489821, -0.1453647 ,  0.14670904,
           0.17318939, -0.16027464, -0.11050612, -0.19118567,
           0.06857748,  0.18323778, -0.22046578,  0.05927287]],

        [[-0.00602703, -0.18062721,  0.15344848, -0.15143515,
          -0.07210657,  0.177676  , -0.06143558, -0.17020151,
          -0.02092001,  0.19398673, -0.20247248,  0.17286496]],

        [[ 0.22057424,  0.10987107,  0.00975977,  0.00445287,
           0.09941946,  0.03192849, -0.19070472, -0.10779155,
           0.13622199, -0.11289301, -0.06379397,  0.06102996]]],


       [[[-0.11758636,  0.16921164, -0.151184  , -0.06386189,
           0.1991932 , -0.21000272, -0.12173925, -0.03071272,
           0.16692607, -0.12708151,  0.08756261,  0.178169  ]],

        [[-0.05779965, -0.10117687,  0.20407595, -0.21241538,
          -0.16404435, -0.0826612 ,  0.02122533,  0.1947081 ,
          -0.09203622,  0.08905725,  0.09665458, -0.06724563]],

        [[-0.22078277, -0.0093862 ,  0.02477093, -0.0090203 ,
           0.21535213, -0.16004324, -0.0708347 , -0.02972263,
           0.11906733,  0.05814315, -0.02641977, -0.09178646]]]],
      dtype=float32)



>>> weights[1]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
```