Tensor and Variable

Tensor and Variable

Tensor

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

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

参数说明:

  • 第一部分是Tensor Name,比如:’Constant’、‘Placeholder’、‘Variable’等,0没有什么实质性的含义,只是表示Tensor的顺序,当前是0,那么下一个Tensor就是1了;

  • 第二部分是Tensor Shape, 也就是Tensor的形状,这里是[2,3],2行3列。

  • 第三部分是Tensor Type,也就是tensor张量的数据类型。

tensor的形状

tensor的形状,我们在TensorFlow中使用阶乘表示,它的形状表示如下表所示:

阶乘名称描述示例
0纯量只有大小s = 481
1向量有大小和方向v = [1, 2, 3]
2矩阵数据表比如:3x2矩阵,m = [[1,2] [3,4] [5,6]]
33阶张量数据立体比如:1x2x2,t = [[ [[1,2], [3,4]], [[5,6], [7,8]] ]]
nn阶张量n阶张量

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

tensor的数据类型

Python类型描述
tf.float6464位浮点数
tf.float3232位浮点数
tf.int6464位有符号整型
tf.int3232位有符号整型
tf.int1616位有符号整型
tf.int88位有符号整型
tf.uint88位无符号整型
tf.string可变长度的字节数组,每一个张量元素都是一个字节数组
tf.bool布尔型
tf.complex64由两个32位浮点数组成的复数:实数和虚数
tf.qint32用于量化Ops的32位有符号整型
tf.qint8用于量化Ops的8位有符号整型
tf.quint8用于量化Ops的8位无符号整型

float32和float64表示浮点精度,但是实际并不会多分配内存,两者的使用效果差不多,我们常用float32。同理int32和int64也是这样。

tensor属性

tensor对象具有如下属性:

  • graph:张量所在的图

  • op:张量的op

  • name:张量的名称

  • shape:张量的形状

示例代码:

import tensorflow as tf

a = tf.constant(1.0)

with tf.Session() as sess:
    print("graph-->", a.graph)
    print("op-->",a.op)
    print("name-->",a.name)
    print("shape-->",a.shape)

placeholder

placeholder是占位符张量。

我们可以通过tf.placeholder()来创建一个占位符张量,用于在运行图的时候,可以动态赋予数据,我们通过run(fetches, feed_dict=None, graph=None)来动态赋予数据。

示例代码:

import tensorflow as tf

plt = tf.placeholder(tf.float32, [2,3])

with tf.Session() as sess:
    sess.run(plt, feed_dict={
        plt: [[1, 2, 3],[3, 4, 5]]
    })

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

静态形状

张量的形状在整个图中都是固定不可变的,如果初始的张量中由不确定的形状(如?),我们可以通过set_shape()去设置,通过get_shape()去获取

示例代码:

import tensorflow as tf

plt = tf.placeholder(tf.float32, [None,2])
# 列已经确定了,不能修改,行是None不确定可以修改
plt.set_shape([3,2])
print(plt.get_shape())

动态形状

一种描述原始张量在执行过程中的一种形状,这个张量的形状在图的执行过程中是可以动态改变的。更新动态形状:tf.reshape()

示例代码:

import tensorflow as tf

plt = tf.placeholder(tf.float32, [3,2])

# reshape重新创建一个张量
plt2 = tf.reshape(plt, [2,3])
print(plt2)

注意reshape前后的张量数据个数肯定是不能变的。

随机张量

在做神经网络训练的时候,梯度下降的初始参数w、b我们可以使用随机张量,然后通过梯度下降去优化。

以下是从正态分布创建随机张量的例子:

示例代码:

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

我们关注2个参数,mean表示数据平均值,也就是数学中的μ,stddev表示标准差,也就是数学中的σ。

当μ=0,σ=1时,也就是标准正态分布。

张量类型转换

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

示例代码:

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

张量合并

示例代码:

import tensorflow as tf

b = [[1,2,3],[4,5,6]]
c = [[7,8,9],[10,11,12]]
# 张量合并
d = tf.concat([b,c], axis=0)

with tf.Session() as sess:
    print(d.eval())

运行结果如下:

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

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

Variable

variable 变量也是一种OP,是一种特殊的张量,能够进行存储持久化。

Variable的创建

API

tf.Variable(initial_value=None,name=None)

代码中涉及到了变量,一定要在Session之前做变量初始化,然后在Session中首先运行初始化的变量。

示例代码:

import tensorflow as tf
import os
os.environ['TP_CPP_LOG_LEVEL'] = '2'

# 创建变量
val = tf.Variable(tf.random_normal([2,3], mean=0.0, stddev=1.0))

# 变量初始化
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    # 运行变量初始化op
    sess.run(init_op)

    # 输出变量
    print(sess.run(val))

我们在会话前必须做变量的初始化成一个op,然后在会话中首先运行这个初始化变量

我们也可以采用下面的简化方式:

with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值