我想用类似于使用Keras的完全卷积网络论文(https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf)。我有一个网络,最终将特征映射展平,并通过多个密集层运行它们。我想从像这样的网络中加载权重到其中密集层被等值卷积替换的权重。如何将密集层转换为Keras中的等价卷积层?
Keras自带的VGG16网络可以作为一个例子,其中最后一个MaxPooling2D()的7x7x512输出变平坦,然后进入密集(4096)层。在这种情况下,密集(4096)将被替换为7x7x4096卷积。
我的真实网络略有不同,有一个GlobalAveragePooling2D()层,而不是MaxPooling2D()和平铺()。 GlobalAveragePooling2D()的输出是一个二维张量,不需要额外将其平滑,因此包括第一层的所有密集层都会被1x1卷积代替。
我已经看到了这个问题:Python keras how to transform a dense layer into a convolutional layer,似乎如果不相同非常相似。麻烦的是我无法得到建议的解决方案,因为(a)我使用TensorFlow作为后端,所以权重重排/过滤器“旋转”是不正确的,(b)我无法确定了解如何加载权重。将旧的权重文件加载到model.load_weights(by_name=True)
的新网络不起作用,因为名称不匹配(即使它们的尺寸不同)。
应该重新安排使用TensorFlow时是什么呢?
如何加载重量?我是否创建每个模型中的一个,在两者上调用model.load_weights()以加载相同的权重,然后复制需要重新排列的一些额外权重?