如何在 Tensorflow 中生成/读取 CTC 损失的稀疏序列标签?

2024-03-12

从单词图像及其转录的列表中,我尝试创建和读取稀疏序列标签(例如tf.nn.ctc_loss) 用一个tf.train.slice_input_producer,避免

  1. 将预打包的训练数据序列化到磁盘中TFRecord format

  2. 的明显局限性tf.py_func,

  3. 任何不必要或过早的填充,以及

  4. 将整个数据集读取到 RAM。

主要问题似乎是将字符串转换为标签序列(aSparseTensor)需要tf.nn.ctc_loss.

例如,字符集在(有序)范围内[A-Z],我想转换文本标签字符串"BAD"到序列标签类别列表[1,0,3].

我想要读取的每个示例图像都包含文本作为文件名的一部分,因此可以直接提取并直接在 python 中进行转换。 (如果有办法在 TensorFlow 计算中做到这一点,我还没有找到。)

之前的几个问题都扫过这些问题,但是一直没能整合成功。例如,

  • Tensorflow读取带有标签的图像 https://stackoverflow.com/questions/34340489/tensorflow-read-images-with-labels显示了一个带有离散、分类标签的简单框架, 我是从这个模型开始的。

  • 如何使用 TensorFlow 加载稀疏数据? https://stackoverflow.com/questions/36917807/how-to-load-sparse-data-with-tensorflow很好地解释了加载稀疏数据的方法,但假设 预包装tf.train.Examples.

有没有办法整合这些方法?

另一个例子(SO问题#38012743)显示了我如何延迟从字符串到列表的转换,直到将文件名出队进行解码之后,但它依赖于tf.py_func,其中有警告。 (我应该担心他们吗?)

我认识到“SparseTensors 不能很好地处理队列”(根据 tf 文档),因此在批处理之前可能需要对结果(序列化?)进行一些巫术,甚至在计算发生的地方进行返工;我对此持开放态度。

按照 MarvMind 的大纲,这里是一个基本框架,其中包含我想要的计算(迭代包含示例文件名的行,提取每个标签字符串并转换为序列),但我尚未成功确定“Tensorflow”方式来执行此操作。

感谢您的正确“调整”,一个更适合我的目标的策略,或者一个指示tf.py_func不会破坏训练效率或下游的其他东西(例如,加载经过训练的模型以供将来使用)。

编辑(+7 小时)我找到了缺失的操作来修补问题。虽然仍然需要验证它与下游 CTC_Loss 的连接,但我已经检查了下面编辑的版本是否正确批处理并读取图像和稀疏张量。

out_charset="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def input_pipeline(data_filename):
    filenames,seq_labels = _get_image_filenames_labels(data_filename)
    data_queue = tf.train.slice_input_producer([filenames, seq_labels])
    image,label = _read_data_format(data_queue)
    image,label = tf.train.batch([image,label],batch_size=2,dynamic_pad=True)
    label = tf.deserialize_many_sparse(label,tf.int32)
    return image,label

def _get_image_filenames_labels(data_filename):
    filenames = []
    labels = []
    with open(data_filename)) as f:
        for line in f:
            # Carve out the ground truth string and file path from 
            # lines formatted like:
            # ./241/7/158_NETWORK_51375.jpg 51375
            filename = line.split(' ',1)[0][2:] # split off "./" and number
            # Extract label string embedded within image filename
            # between underscores, e.g. NETWORK
            text = os.path.basename(filename).split('_',2)[1]
            # Transform string text to sequence of indices using charset, e.g.,
            # NETWORK -> [13, 4, 19, 22, 14, 17, 10]
            indices = [[i] for i in range(0,len(text))]
            values = [out_charset.index(c) for c in list(text)]
            shape = [len(text)]
            label = tf.SparseTensorValue(indices,values,shape)
            label = tf.convert_to_tensor_or_sparse_tensor(label)
            label = tf.serialize_sparse(label) # needed for batching
            # Add data to lists for conversion
            filenames.append(filename)
            labels.append(label)
    filenames = tf.convert_to_tensor(filenames)
    labels = tf.convert_to_tensor_or_sparse_tensor(labels)
    return filenames, labels

def _read_data_format(data_queue):
    label = data_queue[1]
    raw_image = tf.read_file(data_queue[0])
    image = tf.image.decode_jpeg(raw_image,channels=1)
    return image,label

关键的想法似乎是创造一个SparseTensorValue从想要的数据中,将其传递tf.convert_to_tensor_or_sparse_tensor然后(如果你想批量处理数据)将其序列化tf.serialize_sparse。批处理后,您可以使用以下命令恢复值tf.deserialize_many_sparse.

这是概要。创建稀疏值,转换为张量,然后序列化:

indices = [[i] for i in range(0,len(text))]
values = [out_charset.index(c) for c in list(text)]
shape = [len(text)]
label = tf.SparseTensorValue(indices,values,shape)
label = tf.convert_to_tensor_or_sparse_tensor(label)
label = tf.serialize_sparse(label) # needed for batching

然后,您可以进行批处理和反序列化:

image,label = tf.train.batch([image,label],dynamic_pad=True)
label = tf.deserialize_many_sparse(label,tf.int32)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Tensorflow 中生成/读取 CTC 损失的稀疏序列标签? 的相关文章

随机推荐

  • 从数据库模式创建 Web 表单

    我想知道是否有任何应用程序 最好是免费软件 可以进行数据库配置 并且尽可能轻松地创建用于轻松插入数据的 Web 表单 我发现很难准确表达我所追求的是什么 也许我可以谈谈我需要什么 我有一个配置数据库 至少通常包含有关我们系统中服务器的 真相
  • 如何在 jQuery 中解析 JSON 数组?

    EDIT我检查了 jQuery 文档 并使用 ajax 和指定的 json 数据类型返回一个评估的 javascript 对象 因此 eval 不是这里的答案 无论如何 我知道这一点 因为我能够解析单个 JSON 对象 但不能解析数组 问题
  • Capybara 问题:@request 必须是 ActionDispatch::Request

    我在让 Capybara 与 Rails 一起使用时遇到问题 只是测试那个所谓有趣的测试东西 好的 在所附的代码中有几个等效的测试 第一个是用Rails 自带的shoulda context Test Unit 制作的 第二个测试也是使用水
  • bitbucket - 无法确定主机“bitbucket.org”的真实性

    我在尝试推送到我的 bitbucket 存储库时遇到了这个问题 不确定为什么指纹不匹配 It asks me if I want to continue but I can t type anything in the dialog aft
  • 未为类型“DBNull”和类型“Integer”定义运算符“=”

    过去几个小时我一直在挣扎 但仍然无法解决这个问题 我遇到的问题是 当有人被承认数据库更新给他们 BedID 时 当我尝试释放他们时 我似乎无法将 BedID 在数据库中 设置为 Nothing 这是一个问题 因为我需要能够接纳和解雇尽可能多
  • 将 csv 数据集导入到 R 但值变成因子

    我对 R 非常陌生 在访问我导入的数据集时遇到问题 我正在使用 RStudio 并在导入 csv 文件时使用导入数据集功能 并将该行从控制台窗口粘贴到源窗口 代码如下 setwd c kalle R stuckey lt read csv
  • 未调用 DOMContentLoaded 或加载事件处理程序的异步加载脚本?

    我有一个脚本DOMContentLoaded事件处理程序 document addEventListener DOMContentLoaded function console log Hi 我正在异步加载 然而 事件处理程序从未被调用过
  • Java中的正则表达式问题

    我正在尝试为以下内容创建一个正则表达式replaceAllJava 中的方法 测试字符串是abXYabcXYZ模式是abc 我想将除图案之外的任何符号替换为 例如字符串abXYabcXYZ和图案 abc 应该返回 abc 但就我而言 它会返
  • 透明表单,其中包含可见的可点击控件

    我正在尝试在 win8 和 winforms 中制作一个鼠标透明表单 其中包含可单击的控件 我可以使用此代码使表单鼠标透明 int initialStyle GetWindowLong this Handle 20 SetWindowLon
  • 具有彩色高度的 3D 瀑布图

    我正在尝试使用 Python 和 Matplotlib 以 3D 方式可视化一个数据集 该数据集由 x z 数据的时间序列 沿 y 组成 我想创建一个像下面这样的图 这是用 Python 制作的 http austringer net wp
  • 将逗号分隔的字符串作为列表传递

    假设我有一个字符串 例如 x 1 y cat z NULL 我想获取代码创建的列表list x 1 z cat z NULL 这是我的第一次尝试 我知道这是horrible parse text lt function x parse te
  • 如何在 Java 中设置 LookAndFeel 文件?

    我需要在 JDK 1 6 中设置 LookAndFeel 文件 我有两个文件 餐巾拉夫 swingset2 jar 餐巾纸罐子 我该如何设置并使用它 我想要 GTK 外观或 Qt 外观 它们可用吗 本页介绍了如何使用外观和感觉 http j
  • Clang 在折叠表达式中找不到模板二元运算符

    这是我连接元组的二元运算符 template
  • HTML5 视频无法在 IE 11 中运行

    我有一个视频存档 可以在除 IE 11 之外的所有版本中使用 在 IE 11 中加载时 我收到错误 错误 不支持的视频类型或无效文件路径 下面是我正在使用的 HTML
  • 如何使用 JSR94 通过 Drools 加载基于 Excel 的决策表?

    网上有很多关于如何加载 Drools DRL 规则集的示例 但是 我似乎找不到任何有关如何使用 JSR94 API 加载 Excel 格式的决策表的说明或示例 有谁知道如何做到这一点 如果是的话 您能提供一个简单的代码示例吗 下面是我正在使
  • 如何在android上为jenkins生成JUnit测试报告

    我正在尝试使用 Jenkins 中的 发布 JUnit 测试结果报告 但无法让它适用于我的 android 测试项目 我在 Jenkins 中的 android 测试项目的设置基于此指南 https wiki jenkins ci org
  • 如何在 Mac OS X 10.7.3 上安装 JDK7 (Java 7)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在 Mac OS X 10 7 3
  • vue.js 代码、模板和 css 位于单独的文件中

    我想将我的 vue 组件拆分为包含 css scss 模板和代码的单独文件 到目前为止我得到的解决方案是 js代码 import Vue from vue import template from template vue import s
  • Ansible,如何在单个文件中加入多个数组?

    使用它作为我的样板 https github com modcloth ansible role modcloth sumologic collector https github com modcloth ansible role mod
  • 如何在 Tensorflow 中生成/读取 CTC 损失的稀疏序列标签?

    从单词图像及其转录的列表中 我尝试创建和读取稀疏序列标签 例如tf nn ctc loss 用一个tf train slice input producer 避免 将预打包的训练数据序列化到磁盘中TFRecord format 的明显局限性