【问题标题】:Weird output for weights/filters in CNNCNN 中权重/过滤器的奇怪输出
【发布时间】:2019-01-24 09:39:17
【问题描述】:

我的任务是在 cnn 层中可视化绘制的权重,现在当我传递参数 filters = 32kernel_size = (3, 3) 时,我希望使用 .get_weights() 函数输出 32 个矩阵,每个矩阵大小为 3x3(提取权重和偏差),但我得到一个非常奇怪的嵌套输出, 输出如下:

a = model.layers[0].get_weights() a[0][0][0]

array([[ 2.87332404e-02, -2.80513391e-02, **... 32 values ...**, -1.55516148e-01, -1.26494586e-01, -1.36454999e-01, 1.61165968e-02, 7.63138831e-02], [-5.21791205e-02, 3.13560963e-02, **... 32 values ...**, -7.63987377e-02, 7.28923678e-02, 8.98564830e-02, -3.02852653e-02, 4.07049060e-02], [-7.04478994e-02, 1.33816227e-02, **... 32 values ...**, -1.99537817e-02, -1.67200342e-01, 1.15980692e-02]], dtype=float32)

我想知道为什么我会得到这种奇怪的输出,以及我怎样才能得到完美形状的权重。提前致谢。

【问题讨论】:

    标签: python-3.x keras deep-learning conv-neural-network


    【解决方案1】:

    神经网络中的权重是表示输入节点和输出节点(或下一层节点)之间连接强度的值。 Conv2D 层的权重通常具有 (H, W, I, O) 的形状,其中:-

    • H 是内核高度
    • W 是内核宽度
    • I 是输入通道数
    • O 是输出通道数

    Conv2D 权重可以解释为输入通道补丁与输出过滤器/特征图中的节点之间的连接强度。这样,您将在每个输入通道和每个输出通道之间拥有形状(H,W)的权重。需要注意的是,权重在同一通道的不同补丁之间共享。

    考虑下面的 (8, 8, 1) 输入与 (2, 2) 内核和输出与 (8, 8, 1) 的卷积。该层的权重具有形状 (2, 2, 1, 1) 相同的输入可用于使用 2 (2, 2) 个过滤器生成 2 个特征图,如下所示。现在权重的形状将是 (2, 2,1, 2)。

    希望这将阐明如何解释卷积层的形状。

    【讨论】:

    • 非常感谢,它确实澄清了我的理解^_^
    • 嘿,您能否详细说明或参考我的来源以了解两层之间发生了什么?就像这是我的第一个 Conv2D 层,然后是我的第二个 Conv2D 层,这两个层之间会发生什么(过滤器如何工作)?
    【解决方案2】:

    Conv2D 层的核权重形状为(kernel_size[0], kernel_size[1], n_input_channels, filters)。所以在你的情况下

    a = model.layers[0].get_weights()
    print(a[0].shape)
    # should print (3,3,z,32) if your input has shape (x, y, z)
    

    如果您想从其中一个过滤器中打印权重,您可以这样做

    a[0][:,:,:,0]
    

    【讨论】:

    • 嘿,非常感谢您的回答,效果很好,再次感谢 :)
    • 嘿,我看到第二层与第一层不同,你能告诉我如何可视化第二层的权重以及封面后面发生的事情,所以我可以抓住权重对于所有层。
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2012-01-23
    • 2021-05-10
    相关资源
    最近更新 更多