【问题标题】:Keras: How to use a generator with variable input sizesKeras:如何使用具有可变输入大小的生成器
【发布时间】:2019-10-12 05:48:30
【问题描述】:

我有一个大型数据集和大量增强,因此我依赖keras.utils.Sequence 生成器并让 Keras 进行多处理。因此,当涉及到可变输入大小时,我无法选择使用简单的model.fit(...) 命令。此外,由于我的具体问题,调整图像大小或填充图像不是一个好主意。

由于 BatchNormalization Layers 的原因,选择 1 的批大小也不是很方便。

我有可变图像大小,并为我的问题创建了一个玩具示例:

from keras.applications.vgg16 import VGG16 as model
from keras.utils import Sequence
import numpy as np
from keras.layers import Input, Flatten, Dense, GlobalAveragePooling2D
from keras.models import Model

CLASSES = 10
class ExampleGenerator(Sequence):

    def __init__(self,dataset_length=100,batch_size=8):
        self.dataset_length = dataset_length
        self.batch_size = batch_size

    def __len__(self):
        return int(np.ceil(self.dataset_length / float(self.batch_size)))

    def __getitem__(self,idx):

        # create random targets
        Y_batch = np.random.randint(0,2,size=(self.batch_size,CLASSES))
        X = []

        for i in range(self.batch_size):


            # create a random image with a random size

            width = np.random.randint(64,256)
            height = np.random.randint(64,256)
            img = np.random.rand(width,height,3)
            X.append(img)

        X_batch = np.array(X)
        return X_batch,Y_batch


gen = ExampleGenerator()
input_tensor = Input(shape=(None, None, 3))

base_model = model(input_tensor=input_tensor,weights=None, include_top=False)

output = base_model.output

x = GlobalAveragePooling2D()(output)
x = Dense(512)(x)
predictions = Dense(CLASSES)(x)


model = Model(inputs=base_model.input, outputs=predictions)

model.compile(optimizer='adam', loss='categorical_crossentropy')

model.fit_generator(gen)

请注意,此示例仅用于重现我的问题。

脚本执行会提示如下错误信息:

ValueError:检查输入时出错:预期 input_2 有 4 尺寸,但得到形状为 (8, 1) 的数组

这当然是由于 __getitem__ 返回的 numpy 数组只有 batch_size 作为固定大小。

当列表 X 未转换为 numpy 数组时,会出现不同的错误:

ValueError:检查模型输入时出错:Numpy 数组列表 您传递给模型的大小不是模型预期的大小。 预计会看到 1 个数组,但得到了以下 8 个数组 数组:

那么,如何使用 keras 生成器获得可变的输入大小?

感谢您的帮助

【问题讨论】:

    标签: python numpy keras generator


    【解决方案1】:

    尝试使用

    X_batch = np.asarray(X)
    

    【讨论】:

      【解决方案2】:

      对于可变大小的图像,您不能使用大于 1 的 batch_size。如果您使用可变大小的图像并且希望发送大于 1 的批量大小,那么您应该修复模型输入的尺寸并添加一些填充以在生成器中达到该固定大小。

      【讨论】:

      • 你有任何来自 keras 的资料吗?有点难以相信框架会受到这样的限制。因为批次为 1,Batchnorm 层会受到影响,并且图像的调整大小或填充会导致图像损坏
      • 由于您使用的是 GlobalAveragePooling2D() ,您可以使用内置的 keras 生成器和可变大小的图像。但它使用一些更具体的“最近”插值方法调整图像大小。要使用自定义生成器,您必须编写一些东西来调整图像大小以进行批处理。
      猜你喜欢
      • 1970-01-01
      • 2019-10-26
      • 2018-10-24
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2019-10-13
      相关资源
      最近更新 更多