如何在keras中正确地从Conv2D获取图层权重?
我已经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格。他们真的过滤吗?
如果没有人可以请告诉如何正确地从模型中抓取过滤器?
我试图显示重量像这样只有前25个。我有同样的问题,你做的是这个过滤器或其他东西。它似乎不是从深层信仰网络或堆叠RBM中获得的相同过滤器。
和这里的训练的权重:
奇怪的是有训练后没有任何变化!如果你比较它们,它们是相同的。
如果我设置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。现在,卷积过滤器正在发生变化,第一卷积滤波器的输出看起来就像这样:
训练有素的过滤器,你会发现与合理的学习速度改变(不是很多):
如果我把最后一圈Laye的r(无中间密集层)并将其馈送给未经训练的分类器,它与根据精度对原始图像进行分类相似,但如果我训练卷积层,则最后的卷积层输出会提高分类器(随机森林)的准确性。
所以我会得出结论卷积层确实是过滤器以及权重。
感谢您的回答!这是一个非常奇怪的事情:在随机初始化的情况下权重是相似的。我正在使用为conv层推荐的glorot初始化。对我来说最困惑的问题是:我们正在训练网络,但体重相同。我们训练了什么?对此没有回答... –
那么权重的第三维是什么?在'x1w = x.get_weights()[0] [:,:,0,:]'中,'[:,:,0,:]'中的0。我认为前两个变暗是内核x和y,最后一个是内核的数量 - 但我不知道第三维是什么。它似乎是前一层输出的维度,但我不明白为什么或者什么是真正意义。 – wordsforthewise
0是红色通道。三个维度是红色绿色和蓝色。第一个是x第二个是y第三个是通道,最后是第n个卷积层。 – John