张量 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 而预期单个张量时的张量列表