将CNN滤波器权重可视化为张量流中的numpy数组

时间:2017-11-28 16:05:26

标签: python numpy tensorflow conv-neural-network

我已经训练了一个2层卷积神经网络层CNN来对64通道EEG数据集进行分类。该模型具有良好的训练,验证和测试精度。现在我想看看模型为每个通道(特征)学习的权重,我设法导出并将过滤器权重保存为numpy数组。 当我读取并显示我的过滤器权重时,每个过滤器内部有两个数组,一个有10个值,另一个有11个值。我在第1层有32个过滤器,在第2层有64个。所有过滤器都是这样的。

  

(数组([2,3,1,2,8,2,2,1,1,3]),数组([ - 0.17596437,-0.14086468,-0.10576499,-0.0706653,-0.03556561,          -0.00046591,0.03463378,0.06973347,0.10483316,0.13993285,           0.17503254))

我无法解释这与我的64个频道有关,因为我有兴趣知道每个频道学到的重量。我的减肥方法是对的吗?,如果正确我如何与64个功能相匹配?,因为我有第一个数组中有10个值,同一个过滤器的第二个数组中有11个值。

我的第一和第二卷积层看起来像这样

#weight and bias the first convolution layer
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])

#first convolution and pooling 
h_conv1 = tf.nn.relu(conv2d(x_iput, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

#weight and bias of the second convolution layer
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])

#second convolution and pooling 
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

在训练我的模型之后,这就是我如何保存卷积层1的权重

with tf.variable_scope('conv1', reuse=True) as scope_conv:
    Conv1_weights = W_conv1.eval()

    with open("conv1.weights.npz", "wb") as outfile:
       np.save(outfile, Conv1_weights)

为了保存重量,我遵循here

中的问题

1 个答案:

答案 0 :(得分:1)

我提取了功能图重量而不是过滤器,并且能够提取每个通道学习的权重。第一个卷积层中的特征映射在汇集之前具有所有通道,因此我使用了第一个卷积层的特征映射。我还尝试用较少的通道重新训练我的模型,这些通道具有最高的重量并且仍然具有高精度。