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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

以上是关于[TensorFlow系列-5]:TensorFlow基础 - 稀疏张量与其创建方法的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 有错误

Tensorflow-1.x源码编译及C++API调用

谷歌移动端深度学习框架 TensorFlow Lite 正式发布

资源 | 领英开源TonY:构建在Hadoop YARN上的TensorFlow框架

02.Tensorflow基础用法

使用 tensorflow 我遇到了这样的错误