keras如何管理卷积层的权重?

时间:2020-02-02 16:44:15

标签: python tensorflow keras neural-network conv-neural-network

我正在使用MNIST数据集,并且正在使用keras训练卷积神经网络。 关于权重矩阵,我有些不了解。

输入层具有28x28 = 784个神经元。然后我用:

Conv2D(32,kernel_size=(7,7),stride=(3,3),use_bias=False)
Conv2D(64,kernel_size=(5,5),stride=(2,2),use_bias=False)
Flatten()
Dense(200,use_bias=False)
Dense(150,use_bias=False)
Dense(10,use_bias=False,softmax)

训练模型并放入W = model.get_weights()之后,我为每个i打印W [i] .shape并获得:

(7,7,1,32)
(5,5,32,64)
(256,200)
(200,150)
(150,10)

据我了解,这意味着对于第一个隐藏层,有32个8x8 = 64的图像(因为(28-7)/ 3 + 1 = 8),因此在第一个隐藏层中有64x32 = 2048个神经元隐藏层。

下一部分是使我困惑的部分。由于下一个卷积的核大小为(5,5),步幅为(2,2),并使用64个滤镜,这是否意味着我们将64个卷积应用于在第一个隐藏层中获得的每个8x8图像?这将提供大小为2x2的64x32 = 2048个图像,第二个隐藏层中将有2048x4 = 8192个神经元。但是下一层的权重矩阵是形状(256,200)。它不应该是形状(8192,200)吗?这是怎么回事?

1 个答案:

答案 0 :(得分:2)

我认为这种解释会有所帮助。 用于计算输出特征的通用公式是

N_out = ([N_input + 2*padding - kernal_size]/stride) + 1

对于第一个转化层

N_out = ([28 + 2(0) - 7])/3)+1
N_out = 8

您将获得具有32个滤镜的8x8图像

对于第二个转化层

N_out = ([8 + 2(0) - 5])/2)+1
N_out = 2.5

您会看到输出大小为2.5,因为未指定填充,所以tensorflow使用默认填充为“ VALID”。check this link for source

现在让我们看看如果您对跨步为2的5X5内核的8x8图像使用有效填充,会发生什么情况。 这是ASCII艺术

1 2 3 4 5 6 7 8
|_______|          <--- 1 st window
    |_______|      <--- 2 nd window
        |________  <--- 3rd window will drop(since valid padding)

因此,您在第二层(即256)之后获得了具有64个通道的2x2图像。

例如,

from keras import layers

m = Sequential()
m.add(Conv2D(32,kernel_size=(7,7),strides=(3,3),use_bias=False,input_shape=(28,28,1)))
m.add(Conv2D(64,kernel_size=(5,5),strides=(2,2),use_bias=False))
m.add(Flatten())
m.add(Dense(200,use_bias=False))
m.add(Dense(150,use_bias=False))
m.add(Dense(10,use_bias=False,activation='softmax'))

for layer in m.layers: 
    print(layer.output_shape)

输出

(None, 8, 8, 32)
(None, 2, 2, 64)
(None, 256)
(None, 200)
(None, 150)
(None, 10)