在Keras中实现超网络的最直接方法是什么?也就是说,网络的某个分支在哪里为另一分支创建权重?特别是,我想进行模板匹配,将模板输入CNN腿,该腿为在主图像上操作的腿生成卷积核。我不确定的部分是我的CNN层是从外部馈入砝码的,但是渐变仍然可以正确地流过以进行训练。
答案 0 :(得分:1)
对于举重腿,只需像使用Keras一样创建一个规则的网络即可。
确保其输出的形状像(spatial_kernel_size1, spatial_kernel_size2, input_channels, output_channels)
使用功能性API,您可以创建一些权重,例如:
inputs = Input((imgSize1, imgSize2, imgChannels))
w1 = Conv2D(desired_channels, ....)(inputs)
w2 = Conv2D(desired_channels2, ....)(inputs or w1)
....
您应该在此处应用某种类型的缓冲池,因为您的输出将具有很大的尺寸,并且您可能希望使用较小尺寸的过滤器,例如3、5等。
w1 = GlobalAveragePooling2D()(w1) #maybe GlobalMaxPooling2D
w2 = GlobalAveragePooling2D()(w2)
如果您使用固定的图像尺寸,则还可以使用其他类型的合并或展平和密集等。
确保将重物重塑为正确的形状。
w1 = Reshape((size1,size2,input_channels, output_channels))(w1)
w2 = Reshape((sizeA, sizeB, input_channels2, output_channels2))(w2)
....
您可以根据自己的喜好选择频道数量
现在,这条支线将仅使用“不可训练的”卷积,它们可以直接在后端找到并在Lambda
层中使用:
out1 = Lambda(lambda x: K.conv2d(x[0], x[1]))([inputs,w1])
out2 = Lambda(lambda x: K.conv2d(x[0], x[1]))([out1,w2])
现在,您将如何交错图层,多少权重等,这也是您应该针对自己进行优化的内容。
创建模型:
model = Model(inputs, out2)
您也可以将此腿的输出作为体重生成器腿的输入:
w3 = Conv2D(filters, ...)(out2)
w3 = GlobalAveragePooling2D()(w3)
w3 = Reshape((sizeI, sizeII, inputC, outputC))(w3)
out3 = Lambda(lambda x: K.conv2d(x[0], x[1]))([out2,w3])