首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将遗留的ML管道迁移到TFX

将遗留的ML管道迁移到TFX
EN

Stack Overflow用户
提问于 2021-01-22 07:45:50
回答 1查看 130关注 0票数 0

我们正在研究如何将ML管道从一组手动步骤转换为TFX管道。然而,我确实有一些问题,我想有一些更多的见解。

我们通常执行以下步骤(对于图像分类任务):

  1. 加载图像数据和元数据
  2. 基于元数据的“坏”数据过滤
  3. 确定基于图像的统计数据(Python中的经典图像处理):
    1. 图像电平特性
    2. 图像区域特征(区域是基于精细调谐的EfficientDet模型确定的)

  4. 基于图像统计的“坏”数据过滤
  5. 从此图像和元数据生成TFRecords。
  6. 过采样某些TFRecords用于类平衡(使用tf.data)
  7. 图像分类器的训练

现在,我试图将其映射到典型的示例TFX管道上。

然而,这引起了一些问题:

  1. 我认为有两种选择:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- ExampleGen uses a CSV file containing pointers to the image to be loaded and the meta-data to be loaded (above step ‘1). However:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - If this CSV file contains a path to an image file, can ExampleGen then load the image data and add this to its output?
    - Is the output of ExampleGen a streaming output, or a dump of all example data?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- ExampleGen has TFRecords as input (output of above step ‘5)

->这意味着我们仍然需要在TFX…之外实现步骤1-5。,这将降低TFX对我们…的价值。

你能告诉我什么是最好的办法吗?

  1. StatisticsGen还能根据每个示例生成统计信息(例如,一些基于经典图像处理的图像(区域)特征)吗?还是应该在ExampleGen中实现?或…?
  2. 可以使用元数据存储缓存计算的统计数据吗?如果有的话,是否有这样的例子? 利用经典的图像处理方法计算图像的特征是比较慢的。如果新的数据可用,触发要执行的TFX输入组件,理想情况下,已经计算出来的统计信息应该从缓存中加载。
  3. ExampleValidator可能会拒绝某些示例(例如缺少数据、异常值、…),这是否正确??
  4. 在这种设置中,如何在网络输入端(而不是通过丢失函数)实现类平衡(通常我们是通过使用TFRecords过度采样tf.data来实现的)?如果这是在ExampleGen级别完成的,那么ExampleValidator仍然可能会拒绝一些可能再次不平衡数据的示例。对于大型数据ML任务来说,这似乎不是一个大问题,但对于小数据ML任务(在医疗保健设置中通常是如此),它变得至关重要。因此,在转换组件之前,我希望使用TFX组件,但是这个块应该可以访问所有数据,而不是以流式方式访问(请参阅我前面关于ExampleGen输出的问题)…。

谢谢你的见解。

EN

回答 1

Stack Overflow用户

发布于 2021-10-08 08:22:55

我将尝试用我在tfx方面的经验来解决大多数问题。

  1. 我有一个数据流作业,我运行,以预处理我的图像,标签,功能等,并将所有这些转化为to记录。它位于tfx之外,只有在有数据刷新时才会运行。

您也可以这样做,这里有一个非常简单的代码片段,我使用它来调整所有图像的大小并创建简单的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
      image = tf.io.decode_jpeg(image_string)
      image = tf.image.resize(image,[image_resize_size,image_resize_size])
      image = tf.image.convert_image_dtype(image/255.0, dtype=tf.uint8)
      image_shape = image.shape

      image = tf.io.encode_jpeg(image,quality=100)

      feature = {
        'height': _int64_feature(image_shape[0]),
        'width' : _int64_feature(image_shape[1]),
        'depth' : _int64_feature(image_shape[2]),
        'label' : _int64_feature(labels_to_int(element[2].decode())),
        'image_raw' : _bytes_feature(image.numpy())
      }

      tf_example = tf.train.Example(features=tf.train.Features(feature=feature))
    except:
      print('image could not be decoded')
      return None
  1. 一旦获得tfrecord格式的数据,我就使用ImportExampleGen组件将数据加载到tfx管道中。然后是StatisticsGen,它将计算特性的统计信息。

当在云中运行所有这些时,它是在批处理模式下使用掩护下的数据流。

  1. 元数据存储仅缓存管道元数据,但数据缓存在gcs桶中,元数据存储知道这一点。因此,当您重新运行管道时,如果将缓存设置为True,则如果数据没有更改,则不会重新运行您的ImportExampleGen、StatisticsGen、SchemaGen、Transform。这在时间和成本上都有很大的好处。
  2. ExampleValidator输出一个工件,让您知道数据中的数据异常。我创建了一个自定义组件,它输入了examplevalidator工件,如果我的数据不符合某些条件,我就在这个组件中抛出一个错误来扼杀管道。我希望有一个组件可以只是停止管道,但我还没有找到一个,所以我的工作是抛出一个错误,阻止管道进一步发展。
  3. 通常,当我创建tfx管道时,它是用来自动化机器学习过程的。到目前为止,我们已经完成了类平衡、特性选择等工作,因为这更多地属于预处理阶段。

我想您可以从技术上创建一个自定义组件,该组件接受StatisticsGen工件,解析它并尝试进行类平衡,并创建一个包含balances类的新数据集。但老实说,我认为最好是在预处理阶段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65848283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文