首页 文章

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

提问于
浏览
9

我将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乘5过滤器

layer.get_weights()[0][:,:,:,j][:,:,0]

非常难看,但我不知道如何简化这一点,任何评论都非常感激 .

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

2 回答

  • 0

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

    这是未经训练的可视化重量:
    untrained weights

    这是经过训练的重量:

    trained weights

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

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

    如果我设置kernel_intialization = "ones"然后我得到看起来不错的过滤器但是虽然有许多试验和错误更改但净损失从未减少:
    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

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

    所以我会得出结论,卷积层确实是滤波器和权重 .

  • 11

    在layer.get_weights()[0] [:,:,:,]中,[:,:,:,]中的维度是权重的x位置,权重的y位置,第n个输入到相应的转换层(来自前一层,请注意,如果您尝试获取第一个转换层的权重,则此数字为1,因为只有一个输入被驱动到第一个转换层)和相应层中的第k个过滤器或内核, 分别 . 因此,layer.get_weights()[0]返回的数组形状可以解释为只有一个输入被驱动到该层,并且生成了具有5x5大小的96个过滤器 . 如果你想要到达其中一个过滤器,你可以输入,比如说第6个过滤器打印(layer.get_weights()[0] [:,:,:6] .squeeze()) . 但是,如果您需要第二个转换层的过滤器(请参阅下面附带的模型图像链接),请注意32个输入图像或矩阵中的每一个,您将有64个过滤器 . 如果你想获得其中任何一个的权重,例如为第8个输入图像生成的第4个滤镜的权重,那么你应该输入print(layer.get_weights()[0] [:,:,8,4] .squeeze ()) . enter image description here

相关问题