【问题标题】:Setting filter weights of a convolutional layer设置卷积层的过滤器权重
【发布时间】:2026-01-20 13:15:01
【问题描述】:

我正在从事一个涉及动态过滤器的语义分割项目,以学习多尺度表示。

为了创建这些过滤器,我使用了 Unet 主干网络并从瓶颈层提取特征图。 特征图的大小为 H x W X 512,其中 H 是特征图的高度,W 是宽度,512 是通道数(图)。

这些特征被传递到 1x1 卷积以将过滤器的数量减少到 H X W X 128,并且这些特征也被传递到自适应池化层以将 H X W X 512 减少到 k x k x 512,其中 k 是过滤器的大小(i.例如 5)。 然后过滤器也通过一个 1 x 1 卷积将其减小到 128。

这给了我一个特征图 f = H x W x 128 和一个大小为 k x k x 128 的过滤器内核 g。

现在我想将 f 与 g 进行卷积,并在 keras 中尝试了以下操作:

conv = Conv2D(128, kernel_size = 5, kernel_initializer = g, trainable = False)(f)

不幸的是,这不起作用,我只是收到一条错误消息:

"无法解释初始化标识符:Tensor("strided_slice:0", shape = (5,5,128), dtype = float32)"

现在我想知道我做错了什么?

另外不得不提的是,平均池化/1x1 conv后输出tnesor的形状是(?, 5, 5, 128),在哪里?是批量大小。 获取内核我尝试过类似的东西:

g = g[0,:,:,:]

感谢您的建议,

干杯,

迈克尔

【问题讨论】:

    标签: tensorflow keras deep-learning


    【解决方案1】:

    Conv2D 的构造函数的 kernel_initializer 参数不需要内核,而是需要初始化内核的函数。你可以在documentation阅读更多内容

    如果你只想在没有可训练权重的情况下执行卷积,最好使用 tensorflow 原生函数 tf.nn.conv2d

    conv = tf.nn.conv2d(f,g,strides=[1,1,1,1],padding='VALID')
    

    【讨论】:

    • 这正是我想要的!谢谢:-)