[TensorFlow系列-5]:TensorFlow基础 - 稀疏张量与其创建方法

 作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119615940


目录

第1部分 稀疏张量概述

1.1 概述

1.2 Tensorflow稀疏矩阵的原理

第2部分 稀疏张量创建的代码示例

2.1 环境准备

2.2 构建稀疏张量:SparseTensor(indices, values, dense_shape) 

2.3 把稀疏矩阵/张量转换成稠密矩阵/张量:tf.sparse.to_dense()


第1部分 稀疏张量概述

1.1 概述

稀疏张量指矩阵中的大多数元素的值都为0,由于其中非常多的元素都是0,使用常规方法进行存储非常的浪费空间,所以采用另外的方法存储稀疏张量。

1.2 Tensorflow稀疏矩阵的原理

Tensorflow采用indices+values矩阵来描述和定义稀疏矩阵。

indices是一个张量,张量中的最内层的向量表示了稠密矩阵中非零元素的位置。

values是一个一维向量,是有稠密矩阵中非零元素的数值组成的序列。

原理如下:

 

这是非常简单的一种方式,使用一个三元组来描述任意维度的稀疏矩阵。

三元组分别表示稀疏矩阵中的元素(行,列,元素值)。

indices=[ [行,列],[行列],[行列] .........]

values= [值,值,值.........]

如上图目标矩阵,一共有4*4的目标矩阵,共16个元素,其中4个非零元素:

(0, 0) 位置的值是1。

(0,1) 位置的值是7

(1,1) 位置的值是2

(1,2) 位置的值是8

因此需要4 * 2的COO矩阵,来描述一个4*4的稀疏矩阵。

很显然,通过上述方法,目标稀疏矩阵的每个位置,需要通过3个数值来表示,增加了存储空间。

因此当矩阵规模比较小时,上述的表示是浪费存储空间的。

只有当矩阵的规模比较大,且是稀疏矩阵时,上述的表示才体现出优势。

备注:

TensorFlow和Pytorch在定义稀疏矩阵的基本原理是相同的,但具体实现是方式却不相同。

TensorFlow使用的是N个 1*2的向量表示所有的非零值的位置。TensorFlow的结构可以表示任意维度的张量。

PyTorch使用了1个1*N的行向量和1个1*N的列向量来表示所有的非零值的位置,PyTorch的结构只能表示矩阵。

第2部分 稀疏张量创建的代码示例

2.1 环境准备

import numpy as np
import tensorflow as tf
print("hello world")
print("tensorflow version:", tf.__version__)

2.2 构建稀疏张量:SparseTensor(indices, values, dense_shape) 

indices:是一个维度为(n, ndims)的2-D int64张量,指定非零元素的位置。比如indices=[[1,3], [2,4]]表示[1,3]和[2,4]位置的元素为非零元素。n表示非零元素的个数,ndims表示构造的稀疏张量的维数。 

# 注意:indices的定义方式与PyTorch不同
# Tensorflow:每一个向量完整的定义一个位置
# PyTorch:   多个向量中的元素,各取一个元素,组合在一起,定位一个位置


values:是一个维度为(N)的1-D张量,对应indices所指位置的元素值。 

dense_shape:是一个维度为(ndims)的1-D张量,代表稀疏张量的维度。

print("稀疏张量的indices张量")
# 注意:indices的定义方式与PyTorch不同
# Tensorflow:每一个向量完整的定义一个位置
# PyTorch:   多个向量中的元素,各取一个元素,组合在一起,定位一个位置
indices = tf.constant([[0,0],[0,1],[1,1],[1,2]], dtype=tf.int64)
print(indices)

print("\n稀疏张量的values张量")
values = tf.constant([1, 7, 2, 8])
print(values)

print("\n稀疏张量")
a = tf.SparseTensor(indices=indices, values=values, dense_shape=[4, 4])
print(a)
输出:

稀疏张量的indices张量
tf.Tensor(
[[0 0]
 [0 1]
 [1 1]
 [1 2]], shape=(4, 2), dtype=int64)

稀疏张量的values张量
tf.Tensor([1 7 2 8], shape=(4,), dtype=int32)

稀疏张量
SparseTensor(indices=tf.Tensor(
[[0 0]
 [0 1]
 [1 1]
 [1 2]], shape=(4, 2), dtype=int64), values=tf.Tensor([1 7 2 8], shape=(4,), dtype=int32), dense_shape=tf.Tensor([4 4], shape=(2,), dtype=int64))

2.3 把稀疏矩阵/张量转换成稠密矩阵/张量:tf.sparse.to_dense()

print("把稀疏矩阵格式转换成稠密矩阵格式:")
b = tf.sparse.to_dense(a)
print(b)
输出:

把稀疏矩阵格式转换成稠密矩阵格式:
tf.Tensor(
[[1 7 0 0]
 [0 2 8 0]
 [0 0 0 0]
 [0 0 0 0]], shape=(4, 4), dtype=int32)


作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119615940

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值