Tensorflow中的dynamic shape、static shape及reshape、set_shape

【tensorrt之dynamic shapes】 1. 背景 Dynamic shapes指的是我们可以在runtime(推理)阶段来指定some或者all输入数据的维度,同时,提供C++和Python两种接口。一般需要指定为dynamic的是batch_size这一个维度,使得我们可以根据自己实际情况动态设置batch,而不需要每次都重新生成engine文件。 2. 总体流程 如何生成及使用支持dynamic shapes的engine的大致步骤如下: 1. 使用最新的接口创建NetworkDefinition对象 截止到t... 阅读详情

转自:https://blog.youkuaiyun.com/qq_21949357/article/details/77987928

这个问题是在学习Tensorflow当中,reshape与set_shape的区别时引出的。

在学习Tensorflow的cifar10代码的时候,发现在处理cifar数据集的读入数据时,demo使用的是如下代码来处理读入数据而不是直接使用熟悉的reshape。

float_image.set_shape([height, width, 3])
read_input.label.set_shape([1])
  • 1
  • 2

官方文档对此的解释是:

The tf.Tensor.set_shape method updates the static shape of a Tensor object, and it is typically used to provide additional shape information when this cannot be inferred directly. It does not change the dynamic shape of the tensor.

The tf.reshape operation creates a new tensor with a different dynamic shape.

由此引出了dynamic shape和static shape的概念。

Tensorflow在构建图的时候,tensor的shape被称为static(inferred);而在实际运行中,常常出现图中tensor的具体维数不确定而用placeholder代替的情况,因此static shape未必是已知的。tensor在训练过程中的实际维数被称为dynamic shape,而dynamic shape是一定的。

看如下例子:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
print(x1.get_shape())

sess = tf.Session()
print(sess.run(tf.shape(x1), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x1), feed_dict={x1:[[0,1],[2,3]]}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在实际运行的时候,显示的结果是

unknown 
[4] 
[2,2]

第一个结果代表构建图时x1的shape,此时它是未知的,尽管在Session中运行了以后给出了[0,1,2,3]的传入值,但无法改变图中的x1的static shape。而后面的print也可以看到,随着传入值的不同,x1的dynamic shape是会变化的。

顺带一说get_shape()方法和tf.shape()的区别,get_shape()是tensor的方法,返回一个tuple,而tf.shape()则返回一个tensor。第三行的unknown直接代表了x1的shape数组,假如我们这里用:

print(tf.shape(x1))
  • 1

就会看到显示的是一个Tensor,不过它的shape里有unknown。因此,我们在获取x1的shape的时候,要用tf.shape方法,让指针指向一个tensor,不然使用get_shape()指针就会指向一个tuple从而报错。

下面说下set_shape()和reshape()的区别。其实从官方说明中可以看出,这两个主要是适用场合的区别,前者用于更新图中某个tensor的shape,而后者则往往用于动态地创建一个新的tensor。

一个set_shape的典型用法如下:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
x1.set_shape([2,2])
print(x1.get_shape())

sess = tf.Session()
#print(sess.run(tf.shape(x1), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x1), feed_dict={x1:[[0,1],[2,3]]}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

此时,运行结果为:

(2,2) 
[2,2]

这代表了图中最开始没有shape的x1在使用了set_shape后,它的图中的信息已经改变了,如果取消掉注释就会报错,因为我们传入了和图不符合的参数。

reshape的典型用法则是这样:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
x2 = tf.reshape(x1, [2,2])
print(x1.get_shape())

sess = tf.Session()
print(sess.run(tf.shape(x2), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x2), feed_dict={x1:[[0,1],[2,3]]}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

此时运算结果为:

(2,2) 
[2,2] 
[2,2]

即它并不是想改变图,而只是想创造一个新的tensor以供我们使用。

但是reshape能否和set_shape有着相同的用法,即用来改变图?我们试着修改上面的代码:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
x1 = tf.reshape(x1, [2,2]) # use tf.reshape()
print(tf.shape(x1))

sess = tf.Session()
#print(sess.run(tf.shape(x1), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x1), feed_dict={x1:[[0,1],[2,3]]}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

经测试,reshape后x1的shape也发生了变化,注释不取消仍然会有报错现象。

那么set_shape和reshape的用法是否完全一样呢?还是有一定差别的。reshape可以改变原有tensor的shape,而set_shape只能更新信息没办法直接改变值,可以参考下面的程序:

import tensorflow as tf
x1 = tf.Variable([[0, 1], [2, 3]])
print(x1.get_shape())

x1 = tf.reshape(x1, [4, 1]) # if we use x1.set_shape([4, 1]),the program cannot run
print(x1.get_shape())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

最后总结一下吧,reshape应用场合比较广泛,当我们需要创建新的tensor或者动态地改变原有tensor的shape的时候可以使用;而当我们只是想更新图中某个tensor的shape或者补充某个tensor的shape信息可以使用set_shape来进行更新。

【TensorFlow】tf中关于shape的问题汇总 在TensorFlow中,涉及到shape的问题比较容易混淆,为此,在这里做一下区分,简单的汇总一下。 首先要说明一点,tf中tensor有两种shape,分别为static (inferred) shape 和 dynamic (true) shape,其中 static shape 用于构建图,是由创建这个tensor的op推断(inferred)得来,故又称 inferred shape。 阅读详情

相关推荐

TensorFlow 2 中 tf.function 替代 Session 的核心实践

tf.function 是 TensorFlow 2 实现函数式执行的核心机制,它将 Python 函数自动编译为高性能计算图,在保留 Eager Execution 调试便利性的同时,提供接近原生图模式的训练与推理性能。其原理基于 AutoGraph 控制流转换、tracing 机制与静态签名约束,技术价值在于统一开发、训练与部署的心智模型,消除 Session 带来的调试割裂、控制流限制和部署复杂性。典型应用场景包括自定义训练循环、数据预处理流水线加速、混合精度训练及多 GPU 分布式训练。本文聚焦于

diegouyi3472的博客 348

tensorflow获取动态shape

tf.shape(a)和a.get_shape()比较 相同点:都可以得到tensor a的尺寸 不同点:tf.shape()中a 数据的类型可以是tensor, list, array     a.get_shape()中a的数据类型只能是tensor,且返回的是一个元组(tuple) 如果需要根据上一层的动态shape计算当前层的shape,该如何做呢 x=tf.placeholder(tf.float32, shape=[None, 227,227,3] ) 但在运行的时候想知道None到

ab0902cd的博客 2729

手写可调试RNN:梯度截断+状态重置的TensorFlow原生实现

循环神经网络(RNN)是处理时序数据的基础模型,其核心在于隐藏态的递归更新与跨时间步的梯度传播。然而标准Keras封装隐藏了状态管理、梯度流动和数值稳定性等关键机制,导致训练发散、预测失真与部署不可控。本文聚焦RNN底层原理,详解梯度爆炸抑制(通过tf.clip_by_global_norm)、隐藏态显式重置(脱离stateful模式依赖)及dynamic_rnn动态图构建等技术价值,适用于时序预测、NLP序列建模与工业级异常检测等需强确定性的场景。特别面向已掌握LSTM基础但亟需深入理解initial_s

weixin_34109408的博客 390

tensorflow代码学习:动态获取shape

使用tensor.shape只会获取静态的shape: a = tf.placeholder(tf.float32, [None, 128]) # returns [None, 128] a.shape.as_list() # [None, 128] 如果想要获取动态的shape,需要使用tf.shape(): tensr = tf.constant([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]) tensr.shape # TensorShape([Dimension(2),

he_wen_jie的博客 806

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

Ubuntu系统作为Linux系统的一个重要分支,既有Linux系统的轻量化、高扩展性和长时间稳定运行,也拥有Windows一样的友好图形界面,因此可以作为熟悉服务器系统的良好选择。对于笔者来说,ubuntu系统最大的用处,就是可以让家里老旧的电脑重焕生机,让本已退居二线的电脑与cpolar内网穿透软件搭配,成为私人服务器,搭建自己喜欢的各种网站。今天,笔者就为大家介绍,如何使用cpolar内网穿透+Z-blog搭建私人博客网站。

m0_74808907的博客 3147

树莓派上基于ONNXRuntime与Qt的C++模型部署实战指南

本文详细介绍了在树莓派上使用ONNXRuntime与Qt进行C++模型部署的完整流程。从环境配置、依赖安装到交叉编译优化,再到Qt界面集成与ARM架构性能调优,提供了实战指南和常见问题解决方案,帮助开发者高效完成边缘设备上的AI应用部署。

ik6789012的博客 339

8.TensorRT中文版开发教程-----如何在TensorRT中使用动态形状(Dynamic Shapes)

在TensorRT中使用动态形状(Dynamic Shapes) 点击此处加入NVIDIA开发者计划 动态形状(Dynamic Shapes) 是延迟指定部分或全部张量维度直到运行时的能力。动态形状可以通过 C++ 和 Python 接口使用。 以下部分提供了更详细的信息;但是,这里概述了构建具有动态形状的引擎的步骤: 1.网络定义不得具有隐式批次维度。 C++ 通过调用创建INetworkDefinition IBuilder::createNetworkV2(1U << s

专注于人工智能领域的小何尚 1万+

告别眼疲劳!保姆级教程:给你的SecureCRT v8.7.2换上护眼高亮配色(附透明背景设置)

本文提供了一份详细的SecureCRT v8.7.2护眼高亮配色方案教程,帮助程序员缓解眼疲劳问题。通过科学调整配色方案、动态环境自适应设置以及字体渲染优化,显著提升终端使用的舒适度和工作效率。特别推荐Solarized Dark和One Dark Pro医学适配版配色方案,适合长时间编码工作。

weixin_42549496的博客 354

tensorflow 基础: static shape VS Dynamic shape, get_shape VS tf.shape() , reshape VS set_shape

######################################################################################### 1) 概念:static shape 与 dynamic shape 在tensorflow中构建的图中的每个节点的tensor有两个shape: static shape 和 dynamic shape....

wzg2016的博客 1653

41、矩形和圆柱形开槽微带贴片天线设计及性能分析

本文提出了一种适用于ISM频段(2.4 - 2.48 GHz)的微带圆形贴片天线,专为生物医学植入和可穿戴设备设计。通过在贴片上蚀刻矩形槽并去除圆柱形槽,实现了小型化与性能优化。采用Rogers 3010基板材料,结合缺陷接地结构(DGS)技术,有效改善了带宽、回波损耗和极化纯度。仿真结果显示,天线在弯曲状态下仍保持良好性能,回波损耗达-13 dB,VSWR为1.6,方向性提升至5.38 dB。与以往设计相比,本次设计在回波损耗和谐振频率稳定性方面表现优异,具备良好的生物相容性和应用潜力。未来将从开槽结构、

github5actions的博客 259

华为 MetaERP 通过元数据驱动的多组织架构 + 内部交易协同 + 自动对账引擎 + 合并规则引擎,实现多组织内部往来与合并报表的全流程自动抵消,核心是源头标准化、过程自动化、结果可追溯

摘要: 华为MetaERP通过元数据驱动的多组织架构与主数据标准化,实现内部往来与合并报表全流程自动化。其核心包括:统一组织模型与主数据(确保数据口径一致)、内部交易协同(自动生成对称凭证)、智能对账引擎(多维度自动匹配差异)、合并规则引擎(配置化抵消模板)。依托GaussDB高性能数据库与流批一体架构,华为全球88家子公司合并报表效率提升400%,关账时间缩短至2小时,支持多准则、多币种自动抵消,审计全程可追溯。相比传统ERP,MetaERP在协同性、自动化与扩展性上优势显著,为跨国集团提供高效、准确的合

金牌架构师 264

shape相关函数: tf.shape(), x.get_shape().as_list(), x.shape.as_list(), tf.set_shape()和tf.reshape()

https://blog.youkuaiyun.com/gqixf/article/details/82769174 x.get_shape().as_list(): x必须为tensor, get_shape(), 返回tuple, 用as_list()转换为list tf.shape():是一个op, 必须sess.run, 返回list, tf.split()和tf.slice(): https://w...

ChengChengCheng的博客 1758

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

TensorFlow基础二(Shape)

首先说明tf中tensor有两种shape,分别为static (inferred) shape和dynamic (true) shape,其中static shape用于构建图,由创建这个tensor的op推断(inferred)得来,故又称inferred shape。在实际运行中,常常出现图中tensor的具体维数不确定而用placeholder代替的情况,因此static shape未必是...

weixin_30268071的博客 688

MT4/MT5 第三代移动平均线(MetaTrader 指标)

第三代移动平均线(3G-MA)是传统MA指标的升级版本,通过"时滞压缩"算法将信号滞后降至理论极限(λ=2)。该指标在保留平滑性的同时,信号速度比EMA快1.5-2.3倍,适用于MT4/MT5平台。核心参数包括计算周期(默认34)、滞后压缩系数(2-10)和应用价位选择,支持斜率变色功能。安装简单,无需外部依赖,通过多周期共振可提升12-18%胜率。指标代码包含完整的MT4/MT5实现方案,采用双缓冲计算结构,通过相位前移算法抵消群延迟。风险提示:需配合其他技术指标和严格风控(≤2%账户

JanLEE 580

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1787

Tensorflow中的reshape、set_shape的区别!!!

  讨论reshape与set_shape的区别之前,我们首先需要知道dynamic shape和static shape的区别: Tensorflow在构建图的时候,tensor的shape被称为static(inferred);而在实际运行中,常常出现图中tensor的具体维数不确定而用placeholder代替的情况,因此static shape未必是已知的。tensor在训练过程中的实...

weixin_40395922的博客 5049

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

tf中关于shape的问题

在TensorFlow中,涉及到shape的问题比较容易混淆,为此,在这里做一下区分,简单的汇总一下。 首先要说明一点,tf中tensor有两种shape,分别为static (inferred) shape 和 dynamic (true) shape,其中 static shape 用于构建图,是由创建这个tensor的op推断(inferred)得来,故又称 inferred shap

芦金宇的专栏 1850

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

tf中几个shape问题

tf中有两对方法比较容易混淆,涉及的是shape问题,在此做一些区分。 首先说明tf中tensor有两种shape,分别为static (inferred) shape和dynamic (true) shape,其中static shape用于构建图,由创建这个tensor的op推断(inferred)得来,故又称inferred shape。如果该tensor的static shape未定

HK_John的博客 1852

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

tensorflow的shape问题

转载自:http://www.jianshu.com/p/2b88256ad206 tf中有两对方法比较容易混淆,涉及的是shape问题,在此做一些区分。 首先说明tf中tensor有两种shape,分别为static (inferred) shape和dynamic (true) shape,其中static shape用于构建图,由创建这个tensor的op推断(inferred)得来

object_allen的专栏 3131

昇腾CANN/GE BatchMatMul融合优化示例

This sample uses the BatchMatMulV2 flatten fusion pass as an example to introduce the implementation of a fusion pass that flattens BatchMatMul to MatMul, providing ATC tool offline model compilation

gitblog_00204的博客 832

深度学习新手选型:PyTorch与TensorFlow对比指南

深度学习作为人工智能的核心技术,其框架选择直接影响学习效率与工程实践。PyTorch与TensorFlow是目前主流的两种深度学习框架,前者以动态计算图和Pythonic风格著称,后者则凭借完善的部署生态在工业界占有一席之地。掌握框架背后的原理与差异,能帮助开发者在模型训练、迁移学习、大模型微调等场景中做出合理决策,也有助于理解神经网络的底层工作机制。无论是学术研究、算法工程还是AI应用落地,选择适配的框架都至关重要。本指南从API设计、生态发展、部署能力等维度展开分析,并给出2026年新手入门的实用建议,

weixin_34221773的博客 543

Qwen3.8-27B-GGUF 量化选型指南:5.8GB 到 51GB 共 24 个版本,按显存怎么选?

刚 `git clone` 完,目录里 24 个 `.gguf` 从 5.8GB 到 29.3GB 一字排开,外加近 51GB 的 BF16 分片,满屏的 Q4_K_M、Q5_K_M、UD-IQ2_M 让人无从下手。这份 **Qwen3.8-27B-GGUF 量化**选型指南直接把显存和文件对上号,并给出明确结论:只下一个文件的话,该选哪个。 ## 速查表:按显存档位 10 秒选对 GGUF 文

gitblog_00893的博客 150

Keras.NET 底层原理完整揭秘:Python 绑定如何让 C 无缝调用 Keras 与 TensorFlow

Keras.NET 是一个专为 C# 和 F# 开发者打造的高层神经网络 API,它通过 Python 绑定技术(pythonnet)无缝调用 Keras 与 TensorFlow,让你无需编写一行 Python 代码,就能在 .NET 应用中训练、保存和加载神经网络模型。本文将带你深入源码,完整揭秘这套"翻译机制"的三层底层原理。 ## 什么是 Keras.NET:C# 深度学习神经网络 AP

gitblog_00053的博客 884

ONNX动态输入输出与int8量化部署避坑指南

在模型部署与AI推理中,ONNX常被用作跨框架交换格式,而动态shape决定了模型能否一次导出、多场景复用。其原理是把输入/输出张量的部分维度从固定整数改为dim_param符号,由ONNX Runtime、TensorRT等推理引擎在运行期做shape推导、内存规划和kernel选择。动态输入输出能显著降低多分辨率、变batch、变长序列场景的维护成本,广泛用于OCR、车牌识别、目标检测和边缘端模型转换。但动态轴与int8量化、TensorRT optimization profile、RKNN固定尺寸限

weixin_33778544的博客 372
上一篇: 目标检测---RCNN系列
下一篇: 标签传播算法
class_brick
博客等级 码龄12年 223粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值