【问题标题】:Multiple inputs feature to train neural network用于训练神经网络的多输入特征
【发布时间】:2021-02-12 10:47:24
【问题描述】:

我正在从事一个项目,其中我有 3 个特征 x1、x2、x3,它们是文件夹中存在的图像,用于训练神经网络。我正在使用 kerasImageDataGenerator.flow_from_directory(),它提供以下输出:

Found 78200 images belonging to 46 classes.
Found 78200 images belonging to 46 classes.
Found 78200 images belonging to 46 classes. 
Found 13800 images belonging to 46 classes.

最后一个属于测试数据。 例如,我的数据的文件结构如下所示:

├── trainingf1
│   ├── Class1
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg
│   ├── Class2
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg
├── trainingf2
│   ├── Class1
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg
│   ├── Class2
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg
├── trainingf3
│   ├── Class1
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg
│   ├── Class2
│   │   ├── IMG_1.jpg
│   │   ├── etc.jpg

然后将这 3 个特征传递给 CNN,然后将最终输出连接起来并传递给神经网络。

现在我正在构建模型,我知道在传递目录迭代器时会出错,但我找不到相同的解决方案。

为了构建模型,我正在使用:

model.fit(x=[trainGeneratorf1, trainGeneratorf2, trainGeneratorf3],
    epochs = 25,
    steps_per_epoch = 2444,
    validation_data = validation_generator,
    validation_steps = 432, 
    batch_size=8)

错误是:Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.keras.preprocessing.image.DirectoryIterator'>"}), <class 'NoneType'>

任何人都有任何解决方案,以便我可以使用目录迭代器并将其作为多个功能传递。

仅供参考,我使用的是功能 API,而不是顺序 API。

【问题讨论】:

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


    【解决方案1】:

    您不能将倍数生成器传递给fit 方法。生成器应该以正确的格式生成数据。在您的情况下,这将是以下形状的嵌套元组:

    ((img1, img2, img3), (label1, label2, label3)) 
    

    很难修改 ImageGenerator 返回的 DirectoryIterator,但您可以将其转换为 tf.data.Dataset 并使用 zipmap 的组合来获得所需的结果。这不是最有效的方法,但应该可以。

    这是一个包含两个数据集的示例:

    generator1 = ImageDataGenerator().flow_from_directory("path/to/images/1")
    generator2 = ImageDataGenerator().flow_from_directory("path/to/images/2")
    
    ds1 = tf.data.Dataset.from_generator(generator1.__iter__, (tf.float32, tf.float32))
    ds2 = tf.data.Dataset.from_generator(generator2.__iter__, (tf.float32, tf.float32))
    
    ds_combined = tf.data.Dataset.zip((ds1,ds2)) # output will be ((img1, label1), (img2, label2))
    ds_rearranged = ds_combined.map(lambda ds1,ds2: ((ds1[0],ds2[0]),(ds1[1],ds2[1])))
    

    然后用数据集调用fit

    model.fit(ds_rearranged)
    

    【讨论】:

    • 现在它给出了以下错误:AttributeError Traceback (most recent call last) <ipython-input-8-4c183b55a799> in <module> 1 model.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"]) 2 ----> 3 res=model.fit_generator( 4 ds_rearranged, 5 epochs = 25, ~/miniconda3/lib/python3.8/site-packages/tensorflow/python/util/deprecation.py in new_func(*args, **kwargs) AttributeError: 'tuple' object has no attribute 'shape'
    • 你能添加你的模型定义吗?
    • ds_rearrangedMapDatasetfit 方法需要一个 numpy 数组或张量。我正在尝试改变它,但一切都顺理成章。
    • fit 方法接受一个 tf.data.Dataset。如果您共享模型定义,我可以为您提供帮助,我需要检查您如何定义输入。如果您不想共享完整模型,请共享简化示例
    • 这是我的模型的果酱板链接以及我正在尝试做的事情 [jamboard.google.com/d/….功能 f1、f2、f3(.png 格式)存在于一个目录中,分为 46 个类(文件夹),我在上面显示了它们的结构。但主要问题是我应该如何处理数据以使其适合fit 模型。
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2013-11-18
    • 2023-03-28
    • 2014-06-23
    • 2011-04-07
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多