【问题标题】:Kerras the definition of a model changes when the input tensor of the model is the output of another model当模型的输入张量是另一个模型的输出时,Kerras 模型的定义会发生变化
【发布时间】:2018-04-10 09:55:38
【问题描述】:

我需要提供model1的输出作为model2的输入。

A=keras.layers.Input(batch_shape=(3,500,500,3))
B=keras.layers.Conv2D(filters=3, kernel_size=3)(A)
model1=keras.models.Model(A,B)
C=keras.layers.Conv2D(filters=3, kernel_size=3)(B)
model2=keras.applications.vgg19.VGG19(input_tensor=B, weights='imagenet', include_top=False, pooling='avg')
#Error: You are trying to load a weight file containing 16 layers into a model with 17 layers.

如错误信息所示,keras 未能正确实现 vgg net。

一个 vgg19 网络包含 23 层(没有顶部)。但是如果输入张量是另一个模型的输出,层数就会发生变化。

vgg19_normal=keras.applications.vgg19.VGG19(input_tensor=A, weights=None, include_top=False, pooling='avg')
len(vgg19_normal.layers)
#23

vgg19_abnormal=keras.applications.vgg19.VGG19(input_tensor=B, weights=None, include_top=False, pooling='avg')
#input tensor B is the output of model1
len(vgg19_abnormal.layers)
#24

所以keras抱怨层数不相等。

【问题讨论】:

  • 我认为您正在尝试做的事情存在一个根本问题:C 的形状为 (3, 496, 496, 8),与 VGG19 的预期不兼容。 VGG19 的输入形状应该正好有 3 个通道。
  • 好的,我已经编辑了我的帖子,但问题仍然存在。
  • 这似乎与github.com/keras-team/keras/issues/7013有关,但尚未解决。

标签: tensorflow keras


【解决方案1】:

我还是有些疑惑,比如我不明白C 是干什么用的。无论如何,这是我目前的想法:

A=keras.layers.Input(batch_shape=(3,500,500,3))
B=keras.layers.Conv2D(filters=3, kernel_size=3)(A)
model1=keras.models.Model(A,B)
C=keras.layers.Conv2D(filters=3, kernel_size=3)(B)
vgg19=keras.applications.vgg19.VGG19(weights='imagenet', include_top=False, pooling='avg')(model1.output)
model2=keras.models.Model(inputs=A, outputs=vgg19)

model2 的结果拓扑是

为了生成这张图片,我使用了keras.utils.plot_model

【讨论】:

  • 为了让我的问题更清楚,我再次编辑了我的帖子。确实,我的问题可以通过在不指定输入张量的情况下加载 vgg 权重来解决,但我认为权重加载问题是一个 bug。
  • model2 已从您的问题中消失。试着更清楚你想做什么。关于您提到的错误,我认为在 Github 上讨论更好,但它可能根本不是错误。您只需要以正确的方式构建计算图。
  • 对了,你回复里的图是怎么画的?
猜你喜欢
  • 2017-11-21
  • 2020-10-25
  • 2020-05-28
  • 2018-05-20
  • 2017-09-23
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多