【发布时间】:2017-04-30 20:53:35
【问题描述】:
我想使用 Keras 做一些类似于完全卷积网络论文 (https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf) 的事情。我有一个网络,它最终将特征图展平并通过几个密集层运行它们。我想将这样的网络中的权重加载到其中密集层被等效卷积替换的网络中。
可以以 Keras 自带的 VGG16 网络为例,其中最后一个 MaxPooling2D() 的 7x7x512 输出被展平,然后进入 Dense(4096) 层。在这种情况下,密集(4096)将被替换为 7x7x4096 卷积。
我的真实网络略有不同,有一个 GlobalAveragePooling2D() 层而不是 MaxPooling2D() 和 Flatten()。 GlobalAveragePooling2D() 的输出是一个 2D 张量,不需要额外展平它,因此包括第一个的所有密集层都将替换为 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() 以加载相同的权重,然后复制一些需要重新排列的额外权重?
【问题讨论】:
标签: python neural-network keras conv-neural-network