张量运算(sparse tensor)

346 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

总结:此文为12月更文计划第三天第七篇。

张量运算-Ragged tensor

这篇文章继续上一篇的文章,进行 sparse tensor的学习

sparse tensor

对于sparse tensor的基础知识学习:

s = tf.SparseTensor(indices = [[0, 1], [1, 0], [2, 3],[3,2]], #位置
                    values = [1., 2., 3.,5],  #值
                    dense_shape = [4, 4])  #维数
print(s)
print('-'*50)
tt=tf.sparse.to_dense(s)
print('-'*50)
tt

sparse tensor 可以往前面补零,sparse tensor从第一行依次往下填位置

#sparese tensor存储节省内存空间,磁盘空间

输出的结果如下:

image.png

对于sparse tensor的算数运算学习:

s2 = s * 2.0
print(s2)
print('-'*50)
#不支持加法
try:
    s3 = s + 1
except TypeError as ex:
    print(ex)
print('-'*50)
s4 = tf.constant([[10., 20.],
                  [30., 40.],
                  [50., 60.],
                  [70., 80.]])
# tf.sparse.to_dense(s)@s4
print(tf.sparse.sparse_dense_matmul(s, s4)) 

#稀疏Tensor和Tensor想乘

输出的结果如下:

image.png

#没有顺序的sparse tensor必须进行reorder以后才能to_dense

s5 = tf.SparseTensor(indices = [[0, 2], [2, 3], [0, 1]],
                    values = [1., 2., 3.],
                    dense_shape = [3, 4])
# print(tf.sparse.to_dense(s5))  #sparse无顺序时,不能转为tensor,会报错
print('-'*50)
print(s5)
print('-'*50)
s6 = tf.sparse.reorder(s5)  
print(s6)
print('-'*50)
print(tf.sparse.to_dense(s6))

输出的结果如下:

image.png

Variables

v = tf.Variable([[1., 2., 3.], [4., 5.,6.]])
print(v)
print('-'*50)
print(type(v))
print('-'*50)
print(v.value())
print('-'*50)
print(v.numpy())

输出的结果如下:

image.png

修改变量时要用assign,改变tensor内某个值,空间没有发生变化,效率高

#assign就是赋值,变量就需要通过这个方式赋值,不能用等号

# assign value
print(id(v))
print('-'*50)
v.assign(2*v)  
print(id(v))
print('-'*50)
print(v.numpy())
print('-'*50)
v[0, 1].assign(42)  #取某个元素修改
print(v.numpy())
print('-'*50)
v[1].assign([7., 8., 9.])  #取某一行修改
print(v.numpy())
print(id(v))

输出的结果如下:

image.png