python - Keras:使用 flow_from _directory() 函数为两个输入模型创建自定义生成器
问题描述
我试图用 来训练我的连体网络fit_generator()
,我从这个答案中学到了:Keras: How to use fit_generator with multiple inputs,最好的方法是创建自己的生成器来产生多个数据点,我的问题是我用函数检索我的数据,flow_from_directory()
我不知道这是否可能。
这是我为我的问题重新调整生成器的尝试:
from keras.models import load_model
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
model = load_model("siamese_model.h5")
train_datagen = ImageDataGenerator(rescale = 1./255)
def generator():
t1 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical',shuffle = True)
t2 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical', shuffle = True)
while True:
d1,y = t1.next()
d2 = t2.next()
yield ([d1[0], d2[0]],y)
model.compile(loss = 'categorical_crossentropy',optimizer= optimizers.RMSprop(lr=2e-5),metrics=['acc'])
history = model.fit_generator(generator(),
steps_per_epoch = 10,
epochs = 5)
我的代码给了我与我尝试在没有自定义生成器的情况下拟合模型时完全相同的错误:
ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[[[0.14509805, 0.15686275, 0.16862746],
[0.14509805, 0.15686275, 0.16862746],
[0.14509805, 0.15686275, 0.16862746],
...,
[0.14117648, 0.15294118, 0.16862746...
我究竟做错了什么?
解决方案
试试这个:
while True:
d1 = t1.next()
d2 = t2.next()
yield ([d1[0], d2[0]], d1[1])
此外,您的输入将以不同的方式随机播放,因此如果您将它们按特定顺序放入文件夹中,它们将丢失链接。
我会建议 :
t1 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical', shuffle = False, seed='13')
t2 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical', shuffle = False, seed='13')
或使用相同的种子进行随机播放
t1 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical', shuffle = True, seed='13')
t2 = train_datagen.flow_from_directory(base_dir,target_size = (150, 150), batch_size = 20, class_mode = 'categorical', shuffle = True, seed='13')
推荐阅读
- javascript - 使用画布创建弧形文本
- android - 如何用间距为字符串的空格加下划线
- laravel-5 - Laravel 5 队列
- node.js - UnhandledPromiseRejectionWarning:错误:协议错误(Network.setCookies):目标已关闭 - 无法设置 cookie
- android - 什么是idea文件夹的codeStyles中的codeStyleConfig xml文件?
- unix - 寻找匹配的'}'时出现意外的EOF
- vb.net - 如何编辑此消息框?
- scala - 使用 spark dataframe 列值作为另一列的别名
- javascript - 在 Java Script 中将日期格式从一种格式更改为另一种格式
- android - 未检测到在 Onesignal NotificationExtenderService 中将待定意图设置为 Builder