我想在ImageNet上使用具有预训练权重的Inception-v3来获取不仅仅是3通道RGB图像但具有更多通道的输入,使得尺寸为(224,224,x!= 3),然后分配自我为以下Conv2D图层定义的权重集 . 我试图改变输入层和后续的Conv2D层,使其符合我的需要,但我找不到这样做的结构化方法 .

我尝试使用 Conv2D(...)(input) 构建自定义Conv2d张量并将其分配给相应的Inception层,但这会失败,因为它需要实际层,而上述指令会产生张量 . 尽管如此, Conv2D(...)(Input)Inception.layers[1].output 产生了正确的相同输出(它应该是因为我只想更改输入尺寸和权重),问题是如何将新的Conv2D输入输出映射包装为一个层并替换它在Inception?

我可以尝试通过这种方式进行黑客攻击,但通常我想知道是否有一种快速而优雅的方式来重新分配那些具有自定义规格的预训练模型中的某些层 .

谢谢!

编辑:有效的是在Keras的inception_v3.py的第394行插入这些行,禁用超过3个通道输入的异常,然后只需使用所需的输入调用构造函数 . (注意 Original calls the original InceptionV3 constructor

码:

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))

这项工作并给出了理想的结果,但似乎非常hacky .