Machine learning 在回归模型中使用Keras ImageDataGenerator

Machine learning 在回归模型中使用Keras ImageDataGenerator,machine-learning,neural-network,regression,keras,Machine Learning,Neural Network,Regression,Keras,我想使用 flow_from_directory 方法 ImageDataGenerator 为回归模型生成训练数据,其中目标值可以是介于1和-1之间的任何浮点值 flow_from_directory 具有带描述符的“class_mode”参数 类别模式:“分类”、“二进制”、“稀疏”或“无”。违约: “绝对的”。确定返回的标签数组的类型: “分类”将是2D热编码标签,“二进制”将是1D 二进制标签,“稀疏”将是1D整数标签 我应该选择哪一个值?它们似乎都不适合……目前(自2017年1月

我想使用

flow_from_directory
方法

ImageDataGenerator
为回归模型生成训练数据,其中目标值可以是介于1和-1之间的任何浮点值

flow_from_directory
具有带描述符的“class_mode”参数

类别模式:“分类”、“二进制”、“稀疏”或“无”。违约: “绝对的”。确定返回的标签数组的类型: “分类”将是2D热编码标签,“二进制”将是1D 二进制标签,“稀疏”将是1D整数标签

我应该选择哪一个值?它们似乎都不适合……

目前(自2017年1月21日起的最新版本Keras)目录中的
流只能以以下方式工作:

directory with images\
    1st label\
        1st picture from 1st label
        2nd picture from 1st label
        3rd picture from 1st label
        ...
    2nd label\
        1st picture from 2nd label
        2nd picture from 2nd label
        3rd picture from 2nd label
        ...
    ...
def regression_flow_from_directory(flow_from_directory_gen, list_of_values):
    for x, y in flow_from_directory_gen:
        yield x, list_of_values[y]
  • 您需要以以下方式构造目录:

    directory with images\
        1st label\
            1st picture from 1st label
            2nd picture from 1st label
            3rd picture from 1st label
            ...
        2nd label\
            1st picture from 2nd label
            2nd picture from 2nd label
            3rd picture from 2nd label
            ...
        ...
    
    def regression_flow_from_directory(flow_from_directory_gen, list_of_values):
        for x, y in flow_from_directory_gen:
            yield x, list_of_values[y]
    
  • 来自目录的
    flow\u
    (图片、标签)
    的格式返回固定大小的批
  • 因此,正如您所看到的,它只能用于分类案例,文档中提供的所有选项都只指定了将类提供给分类器的方式。但是,有一种巧妙的方法可以使来自目录的
    流对回归任务有用:

  • 您需要按以下方式构造目录:

    directory with images\
        1st value (e.g. -0.95423)\
            1st picture from 1st value
            2nd picture from 1st value
            3rd picture from 1st value
            ...
        2nd value (e.g. - 0.9143242)\
            1st picture from 2nd value
            2nd picture from 2nd value
            3rd picture from 2nd value
            ...
       ...
    
  • 您还需要有一个值列表<代码>列表=[第一个值,第二个值,…]
  • 。然后按照以下方式定义生成器:

    directory with images\
        1st label\
            1st picture from 1st label
            2nd picture from 1st label
            3rd picture from 1st label
            ...
        2nd label\
            1st picture from 2nd label
            2nd picture from 2nd label
            3rd picture from 2nd label
            ...
        ...
    
    def regression_flow_from_directory(flow_from_directory_gen, list_of_values):
        for x, y in flow_from_directory_gen:
            yield x, list_of_values[y]
    

    对于来自目录gen的
    流来说,使用
    class\u mode='sparse'
    来实现这一点至关重要。当然,这有点麻烦,但它是有效的(我使用了这个解决方案:)

    我认为以不同的方式组织数据,使用数据帧(无需将图像移动到新位置)将允许您运行回归模型。简而言之,在数据框中创建列,其中包含每个图像的文件路径和目标值。这允许生成器保持回归值和图像的正确同步,即使在每个历元洗牌数据时也是如此

    下面是一个示例,演示如何将图像与二项式目标、多项式目标和回归目标链接,以显示“目标就是目标就是目标”,并且只有模型可能会更改:

    df['path'] = df.object_id.apply(file_path_from_db_id)
    df
    
           object_id   bi  multi                                    path     target
    index                                                               
    0         461756  dog  white    /path/to/imgs/756/61/blah_461756.png   0.166831
    1        1161756  cat  black   /path/to/imgs/756/61/blah_1161756.png   0.058793
    2        3303651  dog  white   /path/to/imgs/651/03/blah_3303651.png   0.582970
    3        3367756  dog   grey   /path/to/imgs/756/67/blah_3367756.png  -0.421429
    4        3767756  dog   grey   /path/to/imgs/756/67/blah_3767756.png  -0.706608
    5        5467756  cat  black   /path/to/imgs/756/67/blah_5467756.png  -0.415115
    6        5561756  dog  white   /path/to/imgs/756/61/blah_5561756.png  -0.631041
    7       31255756  cat   grey  /path/to/imgs/756/55/blah_31255756.png  -0.148226
    8       35903651  cat  black  /path/to/imgs/651/03/blah_35903651.png  -0.785671
    9       44603651  dog  black  /path/to/imgs/651/03/blah_44603651.png  -0.538359
    10      49557622  cat  black  /path/to/imgs/622/57/blah_49557622.png  -0.295279
    11      58164756  dog   grey  /path/to/imgs/756/64/blah_58164756.png   0.407096
    12      95403651  cat  white  /path/to/imgs/651/03/blah_95403651.png   0.790274
    13      95555756  dog   grey  /path/to/imgs/756/55/blah_95555756.png   0.060669
    
    我将通过以下示例详细介绍如何做到这一点:


    我想指出的是,在公认的答案中只有一个小毛病。上述代码失败,并显示如下错误消息:

    TypeError: only integer scalar arrays can be converted to a scalar index
    
    这是因为y是一个数组。解决方法很简单:

    def regression_flow_from_directory(flow_from_directory_gen,
                list_of_values):
        for x, y in flow_from_directory_gen:
            values = [list_of_values[y[i]] for i in range(len(y))]
            yield x, values
    

    使用Keras 2.2.4,可以在

    中找到生成_值列表的方法。您可以使用“.flow_from_dataframe”解决您想要做的事情,允许您从一个目录中为回归问题流动图像。您应该将所有图像存储在一个文件夹中,并加载一个数据框,其中一列包含图像ID,另一列包含回归分数(标签),并在.flow\u from\u dataframe中设置“class\u mode='other'”

    在这里,您可以找到一个示例,其中图像位于“image_dir”中,带有图像ID和回归分数的数据帧由“train file”中的熊猫加载


    这些值存储在哪里?最初,有一个包含图片的文件夹和一个将图片映射到其目标值的列表。我愿意接受建议:-)不幸的是,keras文档没有对回归模型进行太多的扩展。事实上,为了获得想要的行为,你需要一个非常整洁的模型。对不起,我没有完全得到你的答案-我需要什么?谢谢。显然,目录中的flow_不是为了应用于回归问题而设计的,因为目标值是从文件夹结构推断出来的。我会考虑使用你的黑客-文件夹结构看起来很复杂,但它可以很容易地自动创建。