Conv2D:如何获取每个过滤器的值
Conv2D: How can I get the values of each filter
我的模特:
classifier = Sequential()
# Convolutional + MaxPooling -> 1
classifier.add(Conv2D(32, (3,3), input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)))
convout1 = Activation('relu')
classifier.add(convout1)
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Dropout(0.25))
我是运行下面的代码获取权重
classifier.layers[0].get_weights()[0]
它return是一个3x3x3x32
的数组。不应该是return3x3
的32个矩阵吗?
不,return 值的形状正确。您没有考虑的是,32 个过滤器中的每一个在空间维度上都是 3x3,并且具有三个通道,与输入相同。这意味着每个过滤器也适用于通道维度。您所期望的仅在对单通道图像进行 2D 卷积的情况下有效。
权重形状正确,因为卷积滤波器应用于整个 3D 输入体积,并且不同通道的参数不共享(尽管它们在空间上是共享的)。图片来自 CS231n class:
是的,输出体积是通过对深度体积的卷积求和得到的,但是每个通道中的参数不同。
在你的情况下,通道是 RGB(因为 input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)
),空间过滤器大小是 3x3
,并且有 32
过滤器。因此,结果形状为 3x3x3x32
,每个过滤器的形状为 3x3x3
.
我的模特:
classifier = Sequential()
# Convolutional + MaxPooling -> 1
classifier.add(Conv2D(32, (3,3), input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)))
convout1 = Activation('relu')
classifier.add(convout1)
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Dropout(0.25))
我是运行下面的代码获取权重
classifier.layers[0].get_weights()[0]
它return是一个3x3x3x32
的数组。不应该是return3x3
的32个矩阵吗?
不,return 值的形状正确。您没有考虑的是,32 个过滤器中的每一个在空间维度上都是 3x3,并且具有三个通道,与输入相同。这意味着每个过滤器也适用于通道维度。您所期望的仅在对单通道图像进行 2D 卷积的情况下有效。
权重形状正确,因为卷积滤波器应用于整个 3D 输入体积,并且不同通道的参数不共享(尽管它们在空间上是共享的)。图片来自 CS231n class:
是的,输出体积是通过对深度体积的卷积求和得到的,但是每个通道中的参数不同。
在你的情况下,通道是 RGB(因为 input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)
),空间过滤器大小是 3x3
,并且有 32
过滤器。因此,结果形状为 3x3x3x32
,每个过滤器的形状为 3x3x3
.