【问题标题】:Getting the filters values from CNN layers从 CNN 层获取过滤器值
【发布时间】:2019-08-16 08:26:42
【问题描述】:

我有以下型号(例如)

input_img = Input(shape=(224,224,1)) # size of the input image
x = Conv2D(64, (3, 3), strides=(1, 1), activation='relu', padding='same')(input_img)

我的自动编码器模型中有好几层这样的层。我对第一层的过滤器特别感兴趣。有 64 个过滤器,每个大小为 3x3。

为了获取过滤器,我尝试使用以下代码:

x.layers[0].get_weights()[0]

但我收到如下错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-166-96506292d6d7> in <module>()
      4 x = Conv2D(64, (3, 3), strides=(1, 1), activation='relu', padding='same')(input_img)
      5 
----> 6 x.layers[0].get_weights()[0]

AttributeError: 'Tensor' object has no attribute 'layers'

我没有使用顺序模型。在几个这样的层之后,我的模型将使用以下命令形成。

 model = Model()

我是 CNN 的新手,我什至不知道 get_weights 函数是否可以帮助我获得过滤器值。如何获取过滤器的值?

【问题讨论】:

    标签: python tensorflow conv-neural-network keras-layer autoencoder


    【解决方案1】:

    目前,您的代码正在对层定义本身调用layers 函数。

    首先需要编译模型,然后可以使用模型上的layers函数来检索特定层的权重。

    在你的情况下:

    weights = model.layers[1].get_weights()
    

    将为您提供第一个卷积层的权重集

    编译模型后可以使用的:

    model = Model(inputs=input_img, output=b)
    

    b 指的是模型中的最后一层。

    【讨论】:

    • 卷积层可以通过 get_weights 调用中的索引 [1] 访问,因为第一个元素现在将是您的输入层
    • 它给了我一个错误 IndexError: list index out of range。另外,我想在第一层获取过滤器以在这些过滤器上应用几何平移。我认为编译后这是不可能的。你怎么看?
    • 正如评论中提到的,在输入层上调用函数会给你这个错误,因为输入层没有权重。
    • 不确定我是否理解您评论的第二部分。您是否尝试在模型中创建一个层,该层是第一个卷积层的“几何平移”(您必须澄清这一点)?你确实意识到模型最初是用随机权重编译的,首先需要训练?因为我认为没有理由将转换应用于包含随机权重的过滤器
    • 我是在按照您在答案中显示的相同方式编译模型后完成的,但仍然出现错误。
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2011-12-19
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多