TensorFlow简单操作:张量与Python变量

TensorFlow简单操作:张量与Python变量,python,tensorflow,Python,Tensorflow,我不确定以下4个变量之间的实际差异(它们的评估值都相同)。我的理解是,如果我调用tf,它将在图形上创建一个操作,否则可能会。如果我不在开始时创建tf.constant(),我相信在进行加法时会隐式创建常量;但是对于tf.add(a,b)vsa+b,其中a和b都是张量(#1和#3),除了默认的命名(前者是add,后者是add),我看不出有什么区别。有人能解释一下它们之间的区别吗?什么时候应该使用它们 ## 1 a = tf.constant(1) b = tf.constant(1) x = tf

我不确定以下4个变量之间的实际差异(它们的评估值都相同)。我的理解是,如果我调用
tf
,它将在图形上创建一个操作,否则可能会。如果我不在开始时创建
tf.constant()
,我相信在进行加法时会隐式创建常量;但是对于
tf.add(a,b)
vs
a+b
,其中
a
b
都是张量(#1和#3),除了默认的命名(前者是
add
,后者是
add
),我看不出有什么区别。有人能解释一下它们之间的区别吗?什么时候应该使用它们

## 1
a = tf.constant(1)
b = tf.constant(1)
x = tf.add(a, b)
with tf.Session() as sess:
    x.eval()

## 2
a = 1
b = 1
x = tf.add(a, b)
with tf.Session() as sess:
    x.eval()

## 3
a = tf.constant(1)
b = tf.constant(1)
x = a + b
with tf.Session() as sess:
    x.eval()

## 4
a = 1
b = tf.constant(1)
x = a + b
with tf.Session() as sess:
    x.eval()

他们都一样

a+b中的python-“+”由tensorflow捕获,并实际生成与tf.add(a,b)相同的op


contant允许您定义更多细节,例如定义创建的张量的形状、类型和名称。但同样,tensorflow在您的示例a=1中拥有“a”,它相当于tf.constant(1)(在本例中将该常数视为int值)

结果是相同的,因为每个操作符(
add
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)调用其操作数

tf.add(a+b)
a+b
之间的区别在于前者使您能够使用
name
参数为操作命名。相反,后者并没有提供这种能力,而且也使得在Tensorflow环境中,计算可能由Python解释器完成,而不是在Python解释器之外


如果(且仅当)
a
b
都不是
Tensor
对象,因此计算中将不涉及Tensorflow,则会发生这种情况。

您给出的四个示例都将给出相同的结果,并生成相同的图(如果忽略图中的某些操作名称不同)。TensorFlow将许多不同的Python对象转换为
tf.Tensor
对象,当它们作为参数传递给TensorFlow操作符时,例如这里的
tf.add()
+
运算符只是
tf.add()
上的一个简单包装器,当左手或右手参数是
tf.Tensor
(或
tf.Variable
)时,将使用重载

既然您可以将许多Python对象传递给TensorFlow操作符,为什么还要使用
tf.constant()
?有几个原因:

  • 如果使用相同的Python对象作为多个不同操作的参数,TensorFlow将多次将其转换为张量,并在图中表示这些张量中的每一个。因此,如果Python对象是一个大的NumPy数组,那么如果对该数组的数据进行了太多的复制,则可能会耗尽内存。在这种情况下,您可能希望将数组转换为
    tf.Tensor
    一次

  • 创建
    tf.constant()
    显式允许您设置其
    name
    属性,这对于TensorBoard调试和图形可视化非常有用。(请注意,默认的TensorFlow ops将根据op参数的名称,尝试为每个自动转换的tensor指定一个有意义的名称。)

  • 创建
    tf.constant()
    显式允许您设置张量的确切元素类型。TensorFlow将Python
    int
    对象转换为
    tf.int32
    ,将
    float
    对象转换为
    tf.float32
    。如果需要
    tf.int64
    tf.float64
    ,可以通过将相同的值传递给
    tf.constant()
    并传递显式
    dtype
    参数来实现

  • tf.constant()
    函数在创建具有重复值的大张量时也提供了一个有用的功能:

    c = tf.constant(17.0, shape=[1024, 1024], dtype=tf.float32)
    
    上面的tensor
    c
    表示4*1024*1024字节的数据,但TensorFlow将在图形中以单个浮点
    17.0
    加上指示应如何解释的形状信息的形式简洁地表示它。如果图形中有许多大的填充常量,那么用这种方法创建它们会更有效