TensorFlow2.0入门到进阶3.4 ——稀疏张量tf.SparseTensor与变量tf.Variable

1.稀疏张量tf.SparseTensor

1.1 定义

是否还记得上一级中:基础数据类型API之strings与ragged_tensor中的ragged_tensor其实就是允许含有0元素的张量,但是,这种变量所有0都在非零数字的后面,那如果很多0穿插在张量中间怎么办?为此,引入了稀疏张量tf.SparseTensor(何为稀疏,就是很多0元素啦),这种结构只记录非零元素的位置和数值,就可以减少存储空间

1.2 创建

  • indices为非零元素所在位置的索引,values为非零元素的数值
  • dense_shape 为矩阵维度
s = tf.SparseTensor(indices=[[0,1],[1,0],[2,3]],
                    values=[1.,2.,3.],
                    dense_shape=[3,4])
print(s)
print(tf.sparse.to_dense(s))

结果:

SparseTensor(indices=tf.Tensor(
[[0 1]
 [1 0]
 [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64))
tf.Tensor(
[[0. 1. 0. 0.]
 [2. 0. 0. 0.]
 [0. 0. 0. 3.]], shape=(3, 4), dtype=float32)

1.3 运算

与常数可以做乘法,不能做加法,否则会报错

# op on sparse tensors
s2 = s*2
print(s2)

try:
    s3 = s+1
except TypeError as ex:
    print(ex)

# 矩阵乘法
s4 = tf.constant([[11.,12.],
                  [22.,23],
                  [3.1,32.],
                  [41.,42.]])
print(tf.sparse.sparse_dense_matmul(s,s4))

结果:

SparseTensor(indices=tf.Tensor(
[[0 1]
 [1 0]
 [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([2. 4. 6.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64))
unsupported operand type(s) for +: 'SparseTensor' and 'int'
tf.Tensor(
[[ 22.  23.]
 [ 22.  24.]
 [123. 126.]], shape=(3, 2), dtype=float32)

1.4 转换为密集矩阵

  • 注意:tf.SparseTensor中的indices 需要是排好序的
  • 否则在tf.sparse.to_dense时会报错
  • 当然,可以使用tf.sparse.reorder自动排顺序
s5 = tf.SparseTensor(indices=[[1,1],[1,0],[2,3]],
                    values=[1.,2.,3.],
                    dense_shape=[3,4])
print(s)

s6=tf.sparse.reorder(s5)
print(tf.sparse.to_dense(s6))

结果:

SparseTensor(indices=tf.Tensor(
[[1 1]
 [1 0]
 [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64))
tf.Tensor(
[[0. 0. 0. 0.]
 [2. 1. 0. 0.]
 [0. 0. 0. 3.]], shape=(3, 4), dtype=float32)

2. 变量tf.Variable

对于常量,在神经网络训练的过程中是不能变的,而变量时可以变的,变量与常量差不多,但是变量会多一些操作

2.1 创建

v = tf.Variable([[1,2,3],
                 [4,5,6]])
print(v)
print(v.value()) 
print(v.numpy())

结果:

<tf.Variable 'Variable:0' shape=(2, 3) dtype=int32, numpy=
array([[1, 2, 3],
       [4, 5, 6]])>
tf.Tensor(
[[1 2 3]
 [4 5 6]], shape=(2, 3), dtype=int32)
[[1 2 3]
 [4 5 6]]

2.2 重新复制

在运行过程中,可以通过assign()函数重新赋值

v.assign(v*2)
print(v.numpy())
# print(v*2)
v[0,1].assign(12)
print(v.numpy())
v[0].assign([51,52,53])
print(v.numpy())

结果:

[[ 2  4  6]
 [ 8 10 12]]
[[ 2 12  6]
 [ 8 10 12]]
[[51 52 53]
 [ 8 10 12]]

这里要注意,这里的重新赋值只能用assign()函数,不能用等号

try :
    v[1] = [1,2,3]
except TypeError as ex:
    print(ex)

结果:

'ResourceVariable' object does not support item assignment
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: tf.compat.v1.Session() 是 tensorflow2.0 中的会话。在TensorFlow 2.0中,使用tf.Session()不再是必需的,因为默认情况下TensorFlow 2.0会启用即时执行模式(Eager Execution),这意味着您可以直接执行TensorFlow操作,而无需将它们包装在会话中。 如果您仍然需要使用会话,可以使用tf.compat.v1.Session()方法创建会话。例如: ``` import tensorflow.compat.v1 as tf # 创建一个常量张量 a = tf.constant(5.0) b = tf.constant(6.0) # 创建会话 with tf.compat.v1.Session() as sess: # 执行操作 c = tf.multiply(a, b) # 打印结果 print(c.eval()) ``` 请注意,在TensorFlow 2.0中,建议使用函数式API或子类化API来构建模型,而不是使用会话和图。 ### 回答2: tf.session() 是 TensorFlow 1.x 版本中的一个 Session 对象,用于在计算图中执行操作。但在 TensorFlow 2.0 版本中,tf.session() 已经被移除,取而代之的是 Eager Execution 模式。Eager Execution 模式使得 TensorFlow 类似于 Python 等语言的编程方式,可以实时地(命令式地)执行操作,无需先构建计算图。Eager Execution 模式的特点如下: 1. 实时执行:像 Python 一样,代码一行一行地执行,可以立即看到结果。 2. 更加直观:类似于 NumPy 的编程方式,使得代码更加易读。 3. 不需要 Session:不需要预先定义 Session 来进行执行,直接调用函数即可。 4. 更加灵活:可以通过控制流和 Python 控制结构来编写代码,使得代码更加灵活。 在 TensorFlow 2.0 中,可以通过以下方式使用 Eager Execution 模式: ```python import tensorflow as tf tf.compat.v1.disable_eager_execution() ``` 或者更简单的方式: ```python import tensorflow.compat.v1 as tf tf.disable_eager_execution() ``` 这样,就可以写出像普通的 Python 代码一样的 TensorFlow 代码了,使得开发和调试更加方便快捷。 ### 回答3: tf.session() 是 TensorFlow 1.x 版本中的重要概念。它是一个计算图的执行环境,可以在其中进行计算图的计算。然而,在 TensorFlow 2.0 中,tf.session() 不再存在,被新的执行方式所替代。 在 TensorFlow 2.0 中,执行图的方式已经成为了自然而然的过程,无需使用 tf.session()。新的方式是,采用 Eager Execution 的模式进行执行。Eager Execution 是 TensorFlow 2.0 引入的一种命令式编程模式,它允许实时地运行操作,计算并输出结果。它的最大优点是,允许使用 Python 自身的控制流,如 if、for 循环等语法,这使得程序更加灵活且易于调试。同时,也减少了许多前版本版本臭名昭著的易错代码。 使用 Eager Execution 模式的代码如下: ``` import tensorflow as tf # 创建一个计算图 a = tf.constant(2) b = tf.constant(3) x = tf.add(a, b) # 显示结果 print(x.numpy()) ``` 以上代码将输出 5,即计算了 a + b 的结果。 为了兼容以前的代码,TensorFlow 2.0 仍然保留 tf.compat.v1 中的 session() 函数,可以使用此函数调用 TensorFlow 1.x 版本的旧代码,但未来可能会被移除,因此,开发者应该尽可能使用新的 Eager Execution 模式编写代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力改掉拖延症的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值