【发布时间】: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