我将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个方格。他们实际过滤了吗?
如果没有,请告诉我们如何正确地从模型中抓取过滤器?
答案 0 :(得分:12)
我试图只显示前25个权重。我有同样的问题,你做的是这个过滤器或其他东西。它似乎与源自深度信念网络或堆叠RBM的过滤器相同。
以下是训练有素的重量:
奇怪的是训练后没有变化!如果你比较它们是相同的。
如果我设置kernel_intialization ="那些"然后我得到了看起来不错的过滤器但是,尽管有许多试验和错误更改,净损失从未减少:
以下是显示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之间的图像。现在卷积滤波器正在改变,第一个卷积滤波器的输出如下:
您注意到的经过培训的过滤器会以合理的学习率进行更改(不是很多):
如果我采用最后一个卷积层(中间没有密集层)并将其提供给未经训练的分类器,则类似于根据准确度对原始图像进行分类,但如果我训练卷积层,则最后一个卷积层输出会增加分类器的准确性(随机森林)。
所以我得出结论,卷积层确实是过滤器和权重。
答案 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