【问题标题】:Keras: Create a custom generator for two input model using flow_from _directory() functionKeras:使用 flow_from _directory() 函数为两个输入模型创建自定义生成器
【发布时间】:2020-01-15 17:37:15
【问题描述】:

我试图用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...

我做错了什么?

【问题讨论】:

    标签: python keras neural-network generator conv-neural-network


    【解决方案1】:

    试试这个:

    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')
    

    【讨论】:

    • 我也是这样。我得到以下错误。 InvalidArgumentError:不兼容的形状:[20,3] 与 [20,4096] [[node gradient_tape/categorical_crossentropy/mul/BroadcastGradientArgs(定义在 :1)]] [Op:__inference_train_function_4028] 函数调用栈:train_function
    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2019-08-15
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2021-03-20
    相关资源
    最近更新 更多