python - 如何通过 fit_generator 为 Keras 模型提供多个输入
问题描述
我正在尝试解决一个机器学习问题,它同时接受图像输入和文本输入,为此我只是使用词袋模型进行矢量化。
我使用下面的函数为模型设置了两个生成器。这主要基于 simonst 在In keras 中的回答,如何将多个输入数据与不同的 type 相匹配,这真的很有帮助。
def create_generators(x_train_feat, x_val_feat, train_batch_size, val_batch_size):
'''
Training function
'''
train_datagen = ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=0,
rotation_range=0.05,
width_shift_range=0.05,
height_shift_range=0.05,
channel_shift_range=0,
fill_mode='nearest',
cval=0,
vertical_flip=False,
rescale=1./255,
shear_range=0.,
zoom_range=0.,
horizontal_flip=False)
val_datagen = ImageDataGenerator(
rescale=1./255,
featurewise_std_normalization=False,
featurewise_center=False)
train_generator=train_datagen.flow_from_dataframe(
dataframe=subset_df_train,
directory='./',
x_col="image_path",
y_col="Category_Name",
batch_size=train_batch_size,
seed=42,
shuffle=True,
class_mode="categorical",
target_size=target_size)
validation_generator = val_datagen.flow_from_dataframe(
dataframe=subset_df_valid,
directory="./",
x_col="image_path",
y_col="Category_Name",
batch_size=val_batch_size,
seed=42,
shuffle=True,
class_mode="categorical",
target_size=target_size)
def train_feat_gen(x_train_feat, train_batch_size):
while True:
for batch in range(len(x_train_feat) // train_batch_size + 1):
if batch > max(range(len(x_train_feat) // train_batch_size)):
yield x_train_feat[batch*train_batch_size:]
else:
yield x_train_feat[batch*train_batch_size:(1+batch)*train_batch_size]
def val_feat_gen(x_val_feat, val_batch_size):
while True:
for batch in range(len(x_val_feat) // val_batch_size + 1):
if batch > max(range(len(x_val_feat) // val_batch_size)):
yield x_val_feat[batch*val_batch_size:]
else:
yield x_val_feat[batch*val_batch_size:(1+batch)*val_batch_size]
def merge_generator(gen1, gen2):
while True:
X1 = gen1.__next__()
X2 = gen2.__next__()
yield [X1[0], X2], X1[1]
final_train_gen = merge_generator(train_generator, train_feat_gen(x_train_feat, train_batch_size))
final_val_gen = merge_generator(validation_generator, val_feat_gen(x_val_feat, val_batch_size))
return (final_train_gen,final_val_gen)
final_train_gen,final_val_gen = create_generators(aux_train, aux_valid, 16, 16)
不幸的是,当我使用以下代码运行模型时,
hist = model.fit_generator(
final_train_gen,
steps_per_epoch=train_len // 16,
epochs=3,
validation_data=final_val_gen,
validation_steps=valid_len // 16)
我遇到以下错误: ValueError: All input arrays (x) should have the same number of samples。得到数组形状:[(16, 128, 128, 3), (0, 2160)]。
然而,这只发生在第二个时代。第一个火车没问题。基于 (0,2160),看起来第二个 epoch 没有正确加载批次(我的批次大小为 16)。不幸的是,由于我对上述 create_generators 函数如何将两者合并的方式没有深入了解,因此我不太确定问题出在哪里,并且非常感谢有关此方面的帮助/指导。
道歉,因为代码是实验性的,因此有点混乱,并且缺少一些底层上下文 - 我希望我已经包含了足够的信息来理解这个问题。
提前致谢。
解决方案
您可以创建一个生成器来将每个图像与其关联的文本配对。只需将图像和文本的数据框或文件传递给您的 fit_generator 函数,并根据您拥有的条件(例如 ID)处理它们以匹配它们,并生成具有特定大小的数组,匹配您所需的批次尺寸。然后,您可以在代码中生成一个元组,但现在您可以保证批量大小匹配。如果你真的想使用两个生成器,你可以看看这里: https ://github.com/keras-team/keras/issues/8130
推荐阅读
- selenium - 我正在使用 selenium 远程驱动程序 3.141.59.jar 和 guava-25.0-jre.jar 但我收到如下所述的错误
- tinymce - TinyMCE 编辑器是否支持 webp 类型的图片上传?
- joomla - 即使在完成安装后,Joomla 4.0.3 也会重新启动安装程序
- swiftui - SwiftUI NavigationLink 控制台错误(SwiftUI 在推送导航链接时遇到问题。请提交错误。)
- echarts - 连接除y轴缩放以外的echarts
- xslt - For-Each 标签不基于 XSLT 1.0 中的两个单独的详细信息部分标签打印
- c# - 用于在特定字符集后返回电子邮件列表的正则表达式(c#)
- sql - 列出公司所有年份的年销售额
- ipc - 简单的共享内存 IPC 是否需要互斥锁?
- r - 根据 r 中的相似 ID 将一个表中的值添加到另一个表中的新列