张量的值为什么会变化?

时间:2019-12-12 17:33:59

标签: tensorflow2.0

# Using Python state
x = tf.zeros([10, 10])
x += 2  # This is equivalent to x = x + 2, which does not mutate the original
        # value of x
print(x)

x从0更改为2。 它显示x = tf.zeros([10,10])的以下结果:

<tf.Tensor: id=266, shape=(10, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>

然后在执行后更改为以下内容:x + = 2

<tf.Tensor: id=263, shape=(10, 10), dtype=float32, numpy=
array([[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]], dtype=float32)>

注释为什么说“不会改变x的原始值”?

1 个答案:

答案 0 :(得分:1)

克里斯·希尔德(Chris Heald)是对的。最容易看到使用NumPy的区别:

import numpy as np

a = np.array(2)
b = a  # Set up an alias

a += 1  # NumPy operations are in-place - they mutate the array
print(b)  # Output: 3!

由于ndarray的{​​{1}}就地改变了数组,因此对该数组的任何引用都将更新,因此代码将打印__iadd__。在这方面,NumPy数组更像对象。

将此与不可变的TF 3(代码为TF 2)进行比较:

Tensor

输出2,因为import tensorflow as tf a = tf.constant(2) b = a # Set up an alias a += 1 # Tensor operations are not in-place - a new tensor is created print(b) # Output: 2 是不可变的。因此它们更像原始值。

访问原始值非常简单-只需将其分配给其他变量(就像我对Tensor所做的那样)。

另一种描述方法是使用列表:

b = a