TensorFlow中"?"的含义及指定形状Tensor的创建方法
嘿,作为TensorFlow新手,这俩问题其实挺典型的,我来给你一步步讲明白~
在TensorFlow的张量信息里,?代表动态维度(Dynamic Dimension),简单说就是这个维度的大小在构建计算图的时候还没确定,要等到实际运行(喂入数据)的时候才会根据输入的具体数据来填充。
最常见的场景就是**批量大小(batch size)**的设置——训练模型时我们经常会调整batch size(比如用32、64甚至128),把这个维度设为动态的,就能让张量兼容不同的批量数据,不用每次改图都重新定义张量形状。比如你看到的shape=(?, 299, 299, 3),第一个?就表示这个位置的维度大小是可变的,运行时传入多少条样本,它就变成多少。
Tensor("batch:0", shape=(?, 299, 299, 3), dtype=float32)的张量? 根据TensorFlow的版本(现在主流是2.x),有几种常用的方法,我给你列出来:
方法1:用tf.keras.Input(TensorFlow 2.x推荐写法)
这是构建模型输入层最常用的方式,直接把动态维度设为None,打印出来就会显示为?:
import tensorflow as tf # 创建动态批量的输入张量,可自定义名称 input_tensor = tf.keras.Input(shape=(299, 299, 3), dtype=tf.float32, name="batch") print(input_tensor)
运行后输出大概是:Tensor("batch:0", shape=(None, 299, 299, 3), dtype=float32),这里的None在TensorFlow的图表示里就等价于你看到的?。
方法2:用tf.compat.v1.placeholder(兼容TensorFlow 1.x写法)
如果你还在使用TF1.x的静态图模式,或者需要兼容旧代码,可以用占位符来创建:
import tensorflow as tf # 启用兼容模式的占位符,指定名称为batch placeholder_tensor = tf.compat.v1.placeholder(tf.float32, shape=(None, 299, 299, 3), name="batch") print(placeholder_tensor)
输出就是你提到的格式:Tensor("batch:0", shape=(?, 299, 299, 3), dtype=float32)。
方法3:创建带动态维度的Variable(适合需要可训练的动态张量)
如果这个张量需要是可训练的变量,也可以定义动态维度:
import tensorflow as tf # 初始化时用0个样本,形状设为动态并指定名称 var_tensor = tf.Variable( tf.random.normal((0, 299, 299, 3)), shape=(None, 299, 299, 3), dtype=tf.float32, name="batch" ) print(var_tensor)
输出会包含张量的图表示部分:shape=(?, 299, 299, 3),完全符合你的需求。
总结一下:不管用哪种方法,只要把对应维度设为None,TensorFlow在图中就会用?来表示这个动态维度,运行时就能适配任意大小的批量数据啦~
内容的提问来源于stack exchange,提问作者Akhilesh_IN

