张量 tensor

Posted maxim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了张量 tensor相关的知识,希望对你有一定的参考价值。

张量 tensor

Tensor是一个类, 包含了属性和常用函数, 一个Tensor对象主要包含一下三个部分,

如下所示:

Tensor("placeholder:0", shape=(2, 3), dtype=float32)

  • 第一部分是Tensor Name, 比如:‘Constant‘、 ’placeholder、 ‘Varuable‘等,

       没什么实质性的含义, 知识表示Tensor的顺序,当前是0, 那么下一个Tensor就是1;

  • 第二部分是Tensor  shape,Tensor的形状,这里是[2,3], 也就是2行3列;
  • 第三部分是Tensor Type, 也就是tensor张量的数据类型

张量的形状

张量的形状,在Tensorflow中我们用阶乘表示:

 

 

 

 

 

 

技术图片

在Tensorflow中,[n,m]向量, 表示n行m列, 行表示特征数量, 列表示样本数量。

Tensor数据类型


tensor的数据类型有很多, 如下图所示:

 

 

 

 

技术图片

 

这里有float32, float64, 同理还有int32, int64,float64表示浮点数的精度,

但是实际并不会多分配内存,两者的使用效果差不多, 我们常用的float32.

 

Tensor 属性

tensor对象有以下属性, 我们可以通过tensor对象进行获取。

  •  graph:张量对所在的图
  • op : 张量的op
  • name: 张量的名字
  • shape: 张量的形状

示例

 1 import tensorflow as tf
 2 
 3 a = tf.constant(1.0)
 4 
 5 
 6 with tf.Session() as sess:
 7     print("graph-->", a.graph)
 8     print("op-->", a.op)
 9     print("name-->", a.name)
10     print("shape-->", a.shape)

 

输出结果:

graph--> <tensorflow.python.framework.ops.Graph object at 0x0000026D64F78C88>
op--> name: "Const"
op: "Const"
attr {
  key: "dtype"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "value"
  value {
    tensor {
      dtype: DT_FLOAT
      tensor_shape {
      }
      float_val: 1.0
    }
  }
}

name--> Const:0
shape--> ()

 

placeholder占位符张量

我们可以通过tf.placeholder来创建一个占位符张量, 用于在运行图的时候,可以动态

的赋予数据, 在Session中运行图的时候, 我们通过run(fetches, feed_dict=None,

graph=None)来来动态的赋予数据。

参数说明:

  •  feches:tensor
  • feed_dict:喂养的动态数据
  • graph:默认就是当前的图,所以不用填写。
 1 import tensorflow as tf
 2 
 3 plt = tf.placeholder(tf.float32, [2,3])
 4 print(plt)
 5 
 6 
 7 with tf.Session() as sess:
 8     print(sess.run(plt, feed_dict = {plt: [
 9                                      [1, 2, 3],
10                                      [4, 5, 6]
11     ]
12     }))

 

输出结果

Tensor("Placeholder:0", shape=(2, 3), dtype=float32)

[[1. 2. 3.]
 [4. 5. 6.]]

 

 

从图中可以看到,plt就是一个张量tensor

 张量的动态形状和静态形状

Tensorflow中, 张量具有静态形状和动态形状。

  •  静态形状

创建一个张量, 初始状态的形状, 如果初始形态的状态的shape有不确定的项,可以通过tf.Tensor.set_shape()

去更新形状,一旦shape是确定的,不允许给修改,这个张量在整张图的运行中都是不能修改的。

 

可以通过tf.Tensor.get_shape()去获取静态的形状。

核心api:

获取静态形状:tf.Tensor.get_shape()

更新静态形状:tf.Tensor.set_shape()

  •  动态形状

一张描述原始张量在执行过程中的一种形状, 这个张量在图的执行过程中是可以动态改变的。

核心api:

更新形状: tf.reshape()

示例:

 1 import tensorflow as tf
 2 
 3 plt = tf.placeholder(tf.float32, [None,2])
 4 print(plt)
 5 
 6 #列已经确定了,行没有确定可以修改
 7 plt.set_shape([3,2])
 8 print(plt)
 9 print(plt.get_shape())
10 
11 
12 #reshape重新创建一个张量
13 plt2 = tf.reshape(plt, [2,3])
14 print(plt2)
15 with tf.Session() as sess:
16     pass

 

输出结果:

 

Tensor("Placeholder:0", shape=(?, 2), dtype=float32)
Tensor("Placeholder:0", shape=(3, 2), dtype=float32)
(3, 2)
Tensor("Reshape:0", shape=(2, 3), dtype=float32)

 

 

补充说明:reshape前后的张量的个数是不可变的,可以使用tensorflow提供的api创建张量

创建随机张量

 1 tf.random.normal(shape, mean=0.0, stddev=1.0 , dtype=float32, seed=None, name=None) 

说明:只需要关注两个参数,mean表示的是数据的平均值,stddev是数据的标准差

,当mean=0,stddev=1时,就是标准正太分布。

张量类型的转换


例如:将张量的dtype是tf.int32类型的,可以转换为tf.float32类型的。

核心api:tf.cast()

示例如下:

1 a = tf.constant(1.0) 
2 b = tf.cast(a,tf.int32)

 

在上面的示例中将float32类型的转换为了int32类型的。

张量的合并

可以将两个张量合并,核心api是tf.concat(),示例如下:

1 import tensorflow as tf
2 
3 b = [[1,2,3],[4,5,6]]
4 c = [[7,8,9],[10,11,12]]
5 #张量合并
6 d = tf.concat([b,c], axis = 0)
7 
8 with tf.Session() as sess:
9     print(d.eval())

 

输出结果:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

 

补充说明:axis=0表示按行合并,axis=1表示按列合并

 

以上是关于张量 tensor的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:由于 tensor_scatter_update 而预期单个张量时的张量列表

PyTorch : 了解Tensor(张量)及其创建方法

对Tensorflow中tensor的理解

如何将张量列表转换为 Torch::Tensor?

张量tensor 和张量分解 tensor decomposition

TensorFlow张量Tensor