【问题标题】:How to change the input size in test time in Keras?如何在 Keras 中更改测试时的输入大小?
【发布时间】:2018-02-17 02:02:00
【问题描述】:

我在 Keras 中使用 Input_shape(256,256,4) 训练了一个 CNN 模型。但是我想将输入大小更改为(512,512,4),以减少测试大图像时的测试时间。

我手动更改 .json 文件中的输入形状,并使用

model = model_from_json(json file)

,然后使用

model=load_weights(weights file)

我得到了错误:

ValueError: 检查时出错:预期 input_9 的形状为 (None, 512, 512, 4),但得到的数组的形状为 (1, 256, 256, 4)

我使用了两种不同类型的权重文件,一种由Modelcheckpoint() 保存,一种由model.save_weights() 保存。但是错误也出现了。

有人可以帮助我吗?提前致谢。

【问题讨论】:

  • 你保存的模型基本上是Input_shape(256,256,4),所以在测试时你必须保持大小不变​​。
  • 您可以制作一个接受可变大小输入的模型,但在某些情况下这是不可能的。你的模特看起来怎么样?
  • 只有具有特定配置的全卷积网络(例如没有 BN)才能转换为接受可变大小的图像。
  • 什么是BN? (但是是的,这是真的,只有完全卷积的模型才能处理可变大小的输入)。
  • 但是通过错误信息中的文字,他们成功更改了尺寸,但尝试使用小图像。

标签: machine-learning keras conv-neural-network


【解决方案1】:

根据您收到的错误消息,更改尺寸没有任何问题。

但是您定义了一个静态形状(512,512,4)。这是您的模型所期望的大小,尽管它是一个完全卷积的模型并且支持不同的大小。

基于this link,您应该能够使用None 在此类模型中定义可变尺寸。所以,你应该使用input_shape=(None,None,4),而不是(512,512,4)

这样,模型不会期望静态尺寸。但只有完全卷积的模型才能接受两种不同尺寸的完全相同的权重。 (例如,密集层无法做到这一点)

不过,对于训练/测试,您应该按大小分隔批次,因为 numpy 数组不支持可变形状。您可以使用this answer 来实现。

【讨论】:

  • 模型是FCN模型,只有Conv层和BatchNorm层,没有全连接层。因此,权重不应该像 caffe 那样与输入大小相关。
  • 好的,我已经了解了更多信息并更新了我的答案。我认为您无法使用None 定义形状。我知道卷积模型可以针对不同的形状重新定义,但我不知道单个模型可以处理多种形状。
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2021-05-04
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多