将张量组织成一批动态形状的张量

2023-12-27

我有以下情况:

  • 我想使用 Tensorflow Serving 部署人脸检测器模型:https://www.tensorflow.org/serving/ https://www.tensorflow.org/serving/.
  • 在 Tensorflow Serving 中,有一个命令行选项,称为--enable_batching。这会导致模型服务器自动批处理请求以最大化吞吐量。我希望启用此功能。
  • 我的模型接受一组图像(称为images),这是一个形状张量(batch_size, 640, 480, 3).
  • 该模型有两个输出:(number_of_faces, 4) and (number_of_faces,)。第一个输出将被称为faces。最后的输出,我们可以称之为分区是原始批次中相应面的索引。例如,如果我传入一批 4 个images并得到 7faces,那么我可能有这个张量[0, 0, 1, 2, 2, 2, 3]。前两张脸对应第一张图像,第三张脸对应第二张图像,第三张图像有 3 张脸,依此类推。

我的问题是这样的:

  • 为了--enable_batching标志工作,我的模型的输出需要具有与输入相同的第 0 维。也就是说,我需要一个具有以下形状的张量:(batch_size, ...)。我想这是为了模型服务器可以知道将批次中的每个输出发送到哪个 grpc 连接。
  • 我想要做的是将面部检测器的输出张量从这个形状转换为(number_of_faces, 4)到这个形状(batch_size, None, 4)。也就是说,批次数组,其中每个批次可以具有可变数量的面孔(例如,批次中的一个图像可能没有面孔,而另一个图像可能有 3 个面孔)。

我尝试过的:

  • tf.dynamic_partition。从表面上看,这个功能看起来很完美。然而,当我意识到这一点后,我遇到了困难。num_partitions范围cannot是一个张量,只能是一个整数:

    tensorflow_serving_output = tf.dynamic_partition(faces, partitions, batch_size)

If the tf.dynamic_partition函数接受张量值num_partition,那么看来我的问题就解决了。然而,我又回到了第一点,因为事实并非如此。

感谢大家的帮助!如果有任何不清楚的地方请告诉我

附:这是预期过程的直观表示:


我最终找到了解决这个问题的方法TensorArray and tf.while_loop:

def batch_reconstructor(tensor, partitions, batch_size):
    """
    Take a tensor of shape (batch_size, 4) and a 1-D partitions tensor as well as the scalar batch_size
    And reconstruct a TensorArray that preserves the original batching

    From the partitions, we can get the maximum amount of tensors within a batch. This will inform the padding we need to use.
    Params:
        - tensor: The tensor to convert to a batch
        - partitions: A list of batch indices. The tensor at position i corresponds to batch # partitions[i]
    """
    tfarr = tf.TensorArray(tf.int32, size=batch_size, infer_shape=False)

    _, _, count = tf.unique_with_counts(partitions)
    maximum_tensor_size = tf.cast(tf.reduce_max(count), tf.int32)

    padding_tensor_index = tf.cast(tf.gather(tf.shape(tensor), 0), tf.int32)

    padding_tensor = tf.expand_dims(tf.cast(tf.fill([4], -1), tf.float32), axis=0) # fill with [-1, -1, -1, -1]
    tensor = tf.concat([tensor, padding_tensor], axis=0)

    def cond(i, acc):
        return tf.less(i, batch_size)

    def body(i, acc):
        partition_indices = tf.reshape(tf.cast(tf.where(tf.equal(partitions, i)), tf.int32), [-1])

        partition_size = tf.gather(tf.shape(partition_indices), 0)

        # concat the partition_indices with padding_size * padding_tensor_index
        padding_size = tf.subtract(maximum_tensor_size, partition_size)
        padding_indices = tf.reshape(tf.fill([padding_size], padding_tensor_index), [-1])

        partition_indices = tf.concat([partition_indices, padding_indices], axis=0)

        return (tf.add(i, 1), acc.write(i, tf.gather(tensor, partition_indices)))

    _, reconstructed = tf.while_loop(
        cond,
        body,
        (tf.constant(0), tfarr),
        name='batch_reconstructor'
    )

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

将张量组织成一批动态形状的张量 的相关文章

随机推荐

  • ASP Classic 应用程序中的多部分/表单数据和 UTF-8

    我有一个问题我真的不明白 我正在尝试在 ASP 经典应用程序中上传文件 而不使用外部组件 我还想发布一些将存储在数据库中的文本 文件上传完美 我正在使用以下代码 问题是其他表单输入字段 我使用的是 UTF 8 但它们最终并不是 UTF 8
  • 后期绑定onclick事件

    以下是我的 javascript 的一部分 使用 jquery list a b c for var i 0 i lt list length i a click here a click function foo list i appen
  • Java中如何实现“按引用调用”?

    Java中如何实现 按引用调用 假设我们使用该术语的方式与自 1960 年代以来同行评审的计算机科学文献中使用该术语的方式相同 请参阅这个维基百科页面 https en wikipedia org wiki Evaluation strat
  • 在 MFC 应用程序中显示文本

    我需要在 MFC 应用程序中显示文本 我有一个示例文本 例如 在 mfc 应用程序中显示文本 假设我打算在其中绘制此文本的客户端窗口非常小 水平 以至于在一行中唯一可以容纳的文本是 显示文本 不显示 mfc 应用程序 字样 我的问题是 如何
  • pjsip 2.5.5 构建错误

    我正在尝试为 android 构建 pjsipNDK r13b 标准构建就像 configure android with opus home user pjsip pjproject opus dev lib工作完美 但我需要几个TARG
  • 如何使用另一个数组的长度来初始化 Rust 中的数组?

    我想初始化一个数组 其长度等于另一个数组的长度 fn foo array i32 let mut sum 0 array len 它会出错 error E0080 constant evaluation error gt test rs 2
  • Pyspark:在数据帧的不同组上应用 kmeans

    使用 Pyspark 我想将 kmeans 单独应用于数据帧组 而不是立即应用于整个数据帧 目前 我使用 for 循环对每个组进行迭代 应用 kmeans 并将结果附加到另一个表 但是有很多组会很耗时 有人可以帮我吗 多谢 for cust
  • 如何使图像在图像墙内反弹?

    我面临这个问题 在动画过程中 我希望鱼图像在背景图像 池塘 中移动 并且每当它撞到墙壁或图像边界时它就会弹开 使用svg方法和javascript方法 非常感谢任何可以提供帮助的人 再次感谢您花时间阅读并帮助解决这个问题
  • 如何将临时 MySQL 表转储到文件中?

    有没有一种方法可以创建转储 导出 保存临时 MySQL 表到磁盘上的文件中 sql 文件 类似于 mysqldump 创建的文件 抱歉 我第一次没有正确阅读这个问题 无论如何 我能想到的最好的方法就是使用SELECT INTO OUTFIL
  • mongodb 从一个值获取整个文档

    我想从单个值获取 mongodb 文档的所有值 例子 id id name name description description invite invite support server server developer develop
  • 同一行有多个命令

    我一直在尝试找到一些可以让我在 Vim 中的同一行上运行多个命令的东西 类似于在 nix 系统中使用分号来分隔命令或 在Windows中 有没有办法做到这一点 A bar 将允许你这样做 从 help bar 可用于分隔命令 因此您可以在一
  • IoC 容器的使用;特别是温莎

    我认为这个问题的答案是如此明显 以至于没有人费心写这个 但已经晚了 我真的无法理解这个问题 我一直在阅读 IoC 容器 在本例中为 Windsor 但我不知道如何从代码的各个部分与容器进行通信 我得到了 DI 我已经做了穷人 DI 空构造函
  • 在 scala 中将其别名为 self =>

    一些 Scala API 别名this to self 例如 trait Function1 T1 R extends AnyRef self gt 我知道该怎样this别名通常有效 但没有看到像 Function1 这样的特征如何从中受益
  • 清理大型遗留 Java 项目

    我被指派去做一个大型Java项目的一些工作 开发人员的几次迭代的影响是显而易见的 没有标准的编码风格 格式 命名约定或类结构 当我遇到 Javadoc 类时真是美好的一天 单元测试是一个快乐的白日梦 到目前为止 我们参与该项目的人员一直在
  • if 条件在 nginxconf 中的 location 块内如何工作?

    我读过了https www nginx com resources wiki start topics 深度 ifisevil https www nginx com resources wiki start topics depth if
  • 从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

    我们有一个 NET 4 7 2 它混合使用异步和同步代码 我知道这是禁忌 我们在 Windows 服务上使用 NancyFX 该服务获取休息呼叫并进行休息呼叫 线程池看起来很健康 整个进程只使用了 70 个线程 由于某种原因 某些 http
  • 警告:def 文件末尾的 .drectve 已损坏

    我在 eclipse cdt c 中使用 gcc mingw 安装了 glew glfw 和 glm 全部都是静态的 一切正常 但我不喜欢 eclipse 输出控制台中的警告 警告 def 文件末尾的 drectve 已损坏 我如何修复并隐
  • ASCII 编码 UTF-8 的有效方法

    我正在寻找一种简单有效的方法来以 ASCII 7 存储 UTF 8 字符串 我所说的高效是指 输入中的所有 ASCII 字母数字字符应与输出中的 ASCII 字母数字字符保持相同 结果字符串应尽可能短 该操作需要可逆且不会丢失任何数据 生成
  • 如何在 ASP.NET MVC 4 应用程序中使用会话?

    我是 ASP NET MVC 新手 我以前使用过 PHP 很容易创建会话并根据当前会话变量选择用户记录 我在 Internet 上到处寻找简单的分步教程 该教程可以向我展示如何在 C ASP NET MVC 4 应用程序中创建和使用会话 我
  • 将张量组织成一批动态形状的张量

    我有以下情况 我想使用 Tensorflow Serving 部署人脸检测器模型 https www tensorflow org serving https www tensorflow org serving 在 Tensorflow