我正在从事一个涉及动态过滤器的语义分割项目,以学习多尺度表示。
要创建这些过滤器,我使用Unet主干并从瓶颈层提取特征图。 特征图的大小为H xW X 512,其中H是特征图的高度,W是宽度,而512是通道(图)的数量。
这些特征被传递给1x1卷积以减少到HXWX 128的过滤器数量,特征也被传递给自适应池化层以将HXWX 512减小到kxkx 512,其中k是过滤器的大小(i。例如5)。 然后,还通过1 x 1卷积对滤镜进行馈送,以将其减少到128。
这给了我一个特征图f = H xW 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)“
现在Iam想知道Iam做错了什么吗?
此外,我不得不提到平均合并/ 1x1 conv后输出tnesor的形状是(?,5,5,128),其中?是批量大小。 得到的内核我尝试过类似的东西:
g = g[0,:,:,:]
谢谢您的建议,
欢呼
迈克尔
答案 0 :(得分:0)
Conv2D
的构造函数的kernel_initializer自变量不期望使用内核,而需要初始化内核的函数。您可以在documentation
如果您只想在没有可训练权重的情况下进行卷积,那么最好使用tensorflow本机函数tf.nn.conv2d
:
conv = tf.nn.conv2d(f,g,strides=[1,1,1,1],padding='VALID')