我想在 ImageNet 上使用具有预训练权重的 Inception-v3 来获取不仅仅是 3 通道 RGB 图像但具有更多通道的输入,使得维度为(224, 224, x!=3),然后将一组自定义的权重分配给下面的 Conv2D 层。我试图更改输入层和后续的 Conv2D 层,使其满足我的需求,但我找不到这样做的结构化方法。
我尝试使用以下命令构建自定义 Conv2d 张量Conv2D(...)(输入)并将其分配给 Inception 的相应层,但这会失败,因为它需要实际层,而上述指令会产生一个张量。重要的是,Conv2D(...)(输入) and Inception.layers[1].output产生正确的相同输出(应该是这样,因为我只想更改输入维度和权重),问题是如何将新的 Conv2D 输入输出映射包装为层并在 Inception 中替换它?
我可以尝试破解这个问题,但一般来说,我想知道是否有一种快速而优雅的方法可以在具有自定义规范的预训练模型中重新分配某些层。
谢谢你!
编辑:
有效的方法是将这些行插入 Keras 的 inception_v3.py 的第 394 行,禁用 3 个以上通道输入的异常,然后只需使用所需的输入调用构造函数。 (注意Original 调用原始 InceptionV3 构造函数)
Code:
original_model = Original(weights='imagenet', include_top=False, input_shape=(299, 299, 3))
weights = model.get_weights()
original_weights = original_model.get_weights()
for i in range(1, len(original_weights)):
weights[i] = original_weights[i]
averaged_weights = np.mean(weights[0], axis=2)[:, :, None, :]
replicated_weights = np.repeat(averaged_weights, 20, axis=2)
weights[0] = replicated_weights
然后我可以打电话
InceptionV3(weights='imagenet', include_top=False, input_shape=(299, 299, 20))
这项工作并给出了预期的结果,但看起来很老套。