如何在Keras中修改预训练模型层,如Inception-v3?

时间:2018-03-17 16:42:44

标签: python keras models

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

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

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

谢谢!

编辑: 有效的是在Keras的inception_v3.py的第394行插入这些行,禁用3个以上通道输入的异常,然后只需使用所需的输入调用构造函数。 (注意原始调用原始的InceptionV3构造函数

代码:

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

这项工作并给出了理想的结果,但看起来非常苛刻。

0 个答案:

没有答案