如何从kera中的Conv2D正确获取图层权重?

时间:2017-04-09 10:56:04

标签: keras convolution keras-layer

我将Conv2D图层定义为:

Conv2D(96, kernel_size=(5, 5),
             activation='relu',
             input_shape=(image_rows, image_cols, 1),
             kernel_initializer=initializers.glorot_normal(seed),
             bias_initializer=initializers.glorot_uniform(seed),
             padding='same',
             name='conv_1')

这是我网络中的第一层。
输入尺寸为64 x 160,图像为1通道。
我试图从这个卷积层可视化权重,但不知道如何获得它们。
以下是我现在这样做的方式:

1.Call

layer.get_weights()[0]

这会形成一系列形状(5,5,1,96)。 1是因为图像是1通道。

2.通过

取5个过滤器
layer.get_weights()[0][:,:,:,j][:,:,0]

非常难看但我不确定如何简化这一点,任何评论都非常感激。

我不确定这些5乘5个方格。他们实际过滤了吗?
如果没有,请告诉我们如何正确地从模型中抓取过滤器?

2 个答案:

答案 0 :(得分:12)

我试图只显示前25个权重。我有同样的问题,你做的是这个过滤器或其他东西。它似乎与源自深度信念网络或堆叠RBM的过滤器相同。

以下是未经训练的可视化权重:untrained weights

以下是训练有素的重量:

trained weights

奇怪的是训练后没有变化!如果你比较它们是相同的。

然后DBN RBM过滤顶部的第1层和底部的第2层: DBM RBM filters

如果我设置kernel_intialization ="那些"然后我得到了看起来不错的过滤器但是,尽管有许多试验和错误更改,净损失从未减少: enter image description here

以下是显示2D Conv权重/过滤器的代码。

  ann = Sequential()
  x = Conv2D(filters=64,kernel_size=(5,5),input_shape=(32,32,3))
  ann.add(x)
  ann.add(Activation("relu"))

...

  x1w = x.get_weights()[0][:,:,0,:]
  for i in range(1,26):
      plt.subplot(5,5,i)
      plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray")
  plt.show()

  ann.fit(Xtrain, ytrain_indicator, epochs=5, batch_size=32)

  x1w = x.get_weights()[0][:,:,0,:]
  for i in range(1,26):
      plt.subplot(5,5,i)
      plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray")
  plt.show()

--------------------------- UPDATE ------------------- -----

所以我再次尝试了它,学习率为0.01而不是1e-6,并通过将图像除以255.0来使用归一化在0和1而不是0和255之间的图像。现在卷积滤波器正在改变,第一个卷积滤波器的输出如下: Untrained Weights

您注意到的经过培训的过滤器会以合理的学习率进行更改(不是很多):Trained Convolution Filter

以下是CIFAR-10测试集的第七个图像:Image 7 CIFAR-10 Car

这是第一个卷积层的输出: Convolution Layer Output

如果我采用最后一个卷积层(中间没有密集层)并将其提供给未经训练的分类器,则类似于根据准确度对原始图像进行分类,但如果我训练卷积层,则最后一个卷积层输出会增加分类器的准确性(随机森林)。

所以我得出结论,卷积层确实是过滤器和权重。

答案 1 :(得分:0)

在layer.get_weights()[0] [:,:,:,:]中,[:,:,:,:]中的尺寸是权重的x位置,权重的y位置,第n个输入到相应的conv层(来自上一层,请注意,如果尝试获取第一conv层的权重,则此数字为1,因为只有一个输入被驱动到第一conv层),并且第k个过滤器或内核相应的层。因此,可以将layer.get_weights()[0]返回的数组形状解释为仅将一个输入驱动到该图层,并生成96个5x5大小的过滤器。如果您想访问其中一个过滤器,则可以输入第六个过滤器 打印(layer.get_weights()[0] [:,:,:,6] .squeeze())。 但是,如果您需要第二转换层的滤镜(请参见下面的模型图像链接),请注意对于32个输入图像或矩阵,您将拥有64个滤镜。如果要获取其中任何一个的权重,例如为第8个输入图像生成的第4个滤镜的权重,则应输入 打印(layer.get_weights()[0] [:,:,8,4] .squeeze())。 enter image description here