在不丢失基数信息的情况下对 TensorFlow 数据集进行窗口处理?

2024-05-12

tf.data.Dataset.window返回一个新的数据集,其元素是数据集,这些嵌套数据集的元素是所需大小的窗口。如果您有一个数据集(例如,Dataset.range(10)并想要一个像这样的窗口数据集[0 1 2] [1 2 3] ... [7 8 9]),有一个技巧可以做到这一点window plus flat_map:

>>> d = tf.data.Dataset.range(10).window(3, shift=1, drop_remainder=True).flat_map(lambda x: x.batch(3))
>>> print(list(d))
[<tf.Tensor: shape=(3,), dtype=int64, numpy=array([0, 1, 2])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([1, 2, 3])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([2, 3, 4])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([3, 4, 5])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([4, 5, 6])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([5, 6, 7])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([6, 7, 8])>, <tf.Tensor: shape=(3,), dtype=int64, numpy=array([7, 8, 9])>]

但是,那flat_map导致数据集丢失基数信息:

>>> d.cardinality.numpy()
<tf.Tensor: shape=(), dtype=int64, numpy=-2>

(-2 is UNKNOWN_CARDINALITY https://www.tensorflow.org/api_docs/python/tf/data#UNKNOWN_CARDINALITY; see Tensorflow 2.0:flat_map() 压平数据集的数据集返回基数 -2 https://stackoverflow.com/questions/66287320/tensorflow-2-0-flat-map-to-flatten-dataset-of-dataset-returns-cardinality-2/68281606#68281606)

我想创建此类窗口的数据集,同时保留基数信息。使用未知基数的数据集的一个小烦恼是 Keras 训练进度条需要先运行一个 epoch,然后才能生成 ETA。我试过.take(n_windows)我在哪里计算n_windows我自己,但仍然返回了一个数据集UNKNOWN_CARDINALITY.

有没有某种方法可以在不丢失基数信息的情况下对数据集进行窗口化?


主要问题是基数是静态计算的。因此无法计算 flat_map 操作的基数。您可以参考这个问题 https://github.com/tensorflow/tensorflow/issues/37998

正如您所知道的 flat_map 输入和输出的关系,解决方案是您自己设置基数。

这是有关如何设置窗口基数的示例:

import tensorflow as tf

ds = tf.data.Dataset.range(10)
print("Original cardinality -> ", ds.cardinality().numpy())
# Output:
# Original cardinality -> 10

ds = ds.window(3, shift=1, drop_remainder=True)
# cardinality at this point is still known.
# as drop_remainder is true, window cardinality will be <= original cardinality
window_cardinality = ds.cardinality()
print("window cardinality ->",window_cardinality.numpy())
# Output:
# window cardinality -> 8

ds = ds.flat_map(lambda x: x.batch(3))
# after flat_map the inferred cardinality is lost.
print("flat cardinality ->",ds.cardinality().numpy())
# Output:
# flat cardinality -> -2

# as we know the flat_map relation is 1:1 we can set the cardinality back to the original value.
ds = ds.apply(tf.data.experimental.assert_cardinality(window_cardinality))
print("dataset cardinality ->",ds.cardinality().numpy())
print("length of dataset ->", len(list(ds)))
# Output: 
# dataset cardinality -> 8
# length of dataset -> 8

for idx, x in ds.enumerate():
    print(f"{idx} -> {x}")
# Output:
# 0 -> [0 1 2]
# 1 -> [1 2 3]
# 2 -> [2 3 4]
# 3 -> [3 4 5]
# 4 -> [4 5 6]
# 5 -> [5 6 7]
# 6 -> [6 7 8]
# 7 -> [7 8 9]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不丢失基数信息的情况下对 TensorFlow 数据集进行窗口处理? 的相关文章

随机推荐

  • Bloomberg Api 连接问题 - 连接失败

    我正在尝试 Bloomberg C API 示例 出现以下错误 ritesh Ritesh Desktop blpapi cpp 3 7 5 1 Linux RequestServiceExample 64 RequestServiceEx
  • 如何将数组与 setState 一起使用?

    我目前正在使用以下命令将数组映射到 setState 但没有设置任何内容 也没有记录任何错误 如果我明确地逐行写出它 它就会起作用 关于如何解决这个问题有什么想法或建议吗 使用数组设置状态 不设置状态 const myData messag
  • Net core EF 3.1 LINQ 字符串比较不再起作用

    我有以下课程 public class Employee public string Name get set 以及 EF Core 2 1 中的 LINQ 查询 Employee GetEmployeeByName string name
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 阻止 div 容器调整大小

    我的 html 页面中有两列 一列向右浮动 另一列向左浮动 我已将两个容器的高度设置为 100 将两个容器的宽度设置为 50 我希望这两个容器适合中间的窗户 当用户水平调整窗口大小时 我不希望内容调整大小 我怎样才能做到这一点 Thanks
  • Android Activity 旋转刷新

    我是一名经验丰富的 NET 开发人员 但这是我的第一个 Android 应用程序 它让我发疯 这是一个运行良好的倒计时器 但是当您旋转屏幕时 它会重新初始化归零并停止倒计时的活动 这就是我尝试过的 我摆脱了 CountDownTimer 对
  • 如何处理剪贴板阻塞和其他异常情况

    在过去的几个小时中 我一直在追踪一个相当具体的错误 该错误是由于另一个应用程序打开了剪贴板而发生的 本质上 由于剪贴板是共享资源 根据 为什么我的共享剪贴板不起作用 http blogs msdn com rds archive 2006
  • Ruby 中的 Set 是否始终保留插入顺序?

    即 Ruby 的 Set 相当于 Java 的 LinkedHashSet 吗 在 Ruby 1 9 中 yes 在 Ruby 1 8 中 可能不会 Set uses a Hash内部 https github com ruby ruby
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • 创建新的 Eclipse 插件项目时何时选择“生成激活器...”

    有很多 Eclipse RCP 教程都从明显的第一步开始 创建一个新的插件项目 看来大约 其中 70 指定检查 生成一个激活器 一个控制插件生命周期的Java类 其他人特别说不要检查该切换 替代文本http img179 imageshac
  • WordPress 计划事件未在设定时间触发

    在 WordPress 中 我正在创建一个插件 用于向用户发送电子邮件 为此 我使用 WordPresscron工作 所以基本上它要做的就是每小时向用户发送电子邮件 所以我的代码看起来像这样 public function construc
  • MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入到重写方法

    我有一个正在使用的 MVC3 应用程序Ninject http ninject org and Mvc站点地图提供者 http mvcsitemap codeplex com 我创建了此类 MvcSiteMapProvider 使用它来动态
  • 如何在 Angular2 中实现间隔/轮询以与量角器一起使用?

    我有一个 angular2 应用程序 我想用量角器进行测试 在此应用程序中 我有一个带有图表的页面 该页面正在使用自动生成的数据定期更新 显然 Protractor 的一项功能是在执行测试代码之前等待脚本和 http 调用完成 但是 如果有
  • 将现有表单添加到 C++/CLI WinForms 项目

    我在不同的解决方案中有两个 C CLI 项目 A 和 B 我使用 A 进行实验 测试 并在完成测试后将测试的代码移至 B 但是 我发现在将 Windows 窗体类 标头 cpp 和 resx 添加到项目 B 时 我无法再使用 IDE 的可视
  • 将 Cookie 从 CookieContainer 写入 IE Cookie 存储

    我想从桌面应用程序导航到 Web 应用程序中的页面 没问题 我听到你说 只需使用正确的 URL 启动默认浏览器即可 但是 Web 应用程序使用 ASP NET 表单身份验证 用户不想看到登录页面 因为他们已经在桌面应用程序中使用相同的凭据进
  • 如何在 REST WCF 服务中接受任意 JSON 对象?

    我想实现这样的服务方法 OperationContract WebInvoke RequestFormat WebMessageFormat Json ResponseFormat WebMessageFormat Json public
  • 在高频交易中尝试并行订单处理是否有意义?

    好吧 我认为对于那些熟悉 hft 的人来说 这是一个更理论的问题 我收到来自 FAST 的订单并进行处理 我每秒收到大约 2 3 千个订单 问题是我是否应该尝试同步或异步处理它们 每次收到下一个订单时 我都需要执行以下操作 更新相应工具的订
  • 是否可以在两个应用程序之间共享一项应用程序内购买?

    我的产品有两种不同的版本 一种用于 iPhone 另一种用于 iPad 是否有可能解锁功能通过应用内购买in both与其中之一一起玩一次 您不能使用相同的 ID 但是 您可以管理有关哪些用户在您自己的服务器上进行了哪些购买的信息 并在用户
  • Python 脚本在开机时启动

    我正在制作一个简单的 python 脚本作为在后台运行的可执行文件运行 有没有办法让它在启动时运行 我知道我可以将可执行文件添加到启动目录 但这需要我根据我的机器对其进行硬编码 我希望它也能在其他机器上运行 Windows 和 ubuntu
  • 在不丢失基数信息的情况下对 TensorFlow 数据集进行窗口处理?

    tf data Dataset window返回一个新的数据集 其元素是数据集 这些嵌套数据集的元素是所需大小的窗口 如果您有一个数据集 例如 Dataset range 10 并想要一个像这样的窗口数据集 0 1 2 1 2 3 7 8