2017-04-09 91 views
2

我已经Conv2D层定义为:
如何在keras中正确地从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乘160,图片为1个通道。
我想从这个卷积图层中看到权重,但不知道如何获得它们。
这里是我现在如何这样做:

1.Call

layer.get_weights()[0] 

这returs形状的阵列(5,5,1,96)。 1是因为图像是1通道。

2.Take 5×5个滤波器由

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

非常难看,但我不知道如何简化这一点,任何意见都非常赞赏。

我不确定这些5乘5格。他们真的过滤吗?
如果没有人可以请告诉如何正确地从模型中抓取过滤器?

回答

4

我试图显示重量像这样只有前25个。我有同样的问题,你做的是这个过滤器或其他东西。它似乎不是从深层信仰网络或堆叠RBM中获得的相同过滤器。

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

和这里的训练的权重:

trained weights

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

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

如果我设置kernel_intialization =“一”然后我得到的过滤器,看起来不错,但净亏损从未有许多降低虽然试验和误差的变化:

下面是显示2D转化率重量/过滤器的代码。

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的学习率,并使用0和1之间的规范化图像,而不是通过将图像除以255.0来得到0和255。现在,卷积过滤器正在发生变化,第一卷积滤波器的输出看起来就像这样: Untrained Weights

训练有素的过滤器,你会发现与合理的学习速度改变(不是很多):Trained Convolution Filter

这里是CIFAR-10测试仪的图像七:Image 7 CIFAR-10 Car

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

如果我把最后一圈Laye的r(无中间密集层)并将其馈送给未经训练的分类器,它与根据精度对原始图像进行分类相似,但如果我训练卷积层,则最后的卷积层输出会提高分类器(随机森林)的准确性。

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

+0

感谢您的回答!这是一个非常奇怪的事情:在随机初始化的情况下权重是相似的。我正在使用为conv层推荐的glorot初始化。对我来说最困惑的问题是:我们正在训练网络,但体重相同。我们训练了什么?对此没有回答... –

+0

那么权重的第三维是什么?在'x1w = x.get_weights()[0] [:,:,0,:]'中,'[:,:,0,:]'中的0。我认为前两个变暗是内核x和y,最后一个是内核的数量 - 但我不知道第三维是什么。它似乎是前一层输出的维度,但我不明白为什么或者什么是真正意义。 – wordsforthewise

+0

0是红色通道。三个维度是红色绿色和蓝色。第一个是x第二个是y第三个是通道,最后是第n个卷积层。 – John