Tensorflow基础


前言


一、张量(Tensor)

张量(tensor):多维数组或列表,其中阶表示张量的维数,即张量可以表示0阶到n阶的数组或列表

1.张量的维数(阶)

标量 一个数字 —> 0阶张量
向量 一维数组 [2, 3, 4] —> 1阶张量
矩阵 二维数组 [[2, 3, 4], [2, 3, 4]] —> 2阶张量

维度要看张量的最左边有多少个左中括号,有n个,则这个张量就是n维张量

张量的形状以 [D0, D1, … Dn-1] 的形式表示,D0 到Dn 是任意的正整数
在形状的中括号中有多少个数字,就代表这个张量是多少维的张量

形状的第一个元素要看张量最外边的中括号中有几个元素,被最外边的中括号里边的内中括号括起来的所有数据算作一个元素)被逗号隔开,有n1个则这个张量就是n1维的,形状的第一个元素就是n1;
形状的第二个元素要看张量中最左边的第二个中括号中有几个被逗号隔开的元素,有n2个则shape的第二个元素就是n2;形状的第二个元素之后的第3,4…n个元素依次类推,分别看第n个中括号中有几个元素即可

1    # 形状为[]
[1,2,3]   # 形状为[3]
[[1,2],[3,4]]   # 形状为[2,2]
[[[1,2],[3,4]],[[1,2],[3,4]]]   # 形状为[2,2,2]

2. 张量类型类型

数据类型类型 描述
DT_FLOAT tf.float3232 位浮点数.
DT_DOUBLE tf.float6464 位浮点数.
DT_INT64 tf.int6464 位有符号整型.
DT_INT32 tf.int3232 位有符号整型.
DT_INT16 tf.int1616 位有符号整型.
DT_INT8 tf.int88 位有符号整型.
DT_UINT8 tf.uint88 位无符号整型.
DT_STRING tf.string可变长度的字节数组.每一个张量元素都是一个字节数组.
DT_BOOL tf.bool布尔型.
DT_COMPLEX64tf.complex64 由两个32位浮点数组成的复数:实数和虚数.
DT_QINT32 tf.qint32用于量化Ops的32位有符号整型.
DT_QINT8 tf.qint8用于量化Ops的8位有符号整型.
DT_QUINT8 tf.quint8用于量化Ops的8位无符号整型.

对于数值类型的张量,可以保持为不同字节长度的精度,Bit 位越长,精度越高,同时占用的内存空间也就越大,在创建张量时,可以指定张量的保存精度

3.创建张量

创建固定值张量
(1)tf.zeros ,值为0

tf.zeros(shape, dtype=tf.float32, name=None)
print(tf.zeros([2,2]))
# Tensor("zeros:0", shape=(2, 2), dtype=float32)
'''
[[2,2]
[2,2]]
'''

注意:这里传入的参数是是这个数据的形状

(2)tf.ones ,值为1

tf.ones(shape, dtype=tf.float32, name=None)

(3)tf.constant

tf.constant(value, dtype=tf.float32, name='Const')
    tensor1 = tf.ones(shape=[5,6])
    tensor2 = tf.constant([1,3,5,7])
    tensor3 = tf.constant([[4],[9],[16],[25]],dtype = tf.int32)  # 指定默认类型
    print(tensor1.numpy())
    print(tensor2.numpy())
    print(tensor3.numpy())

'''
[[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]
[1 3 5 7]
[[ 4]
 [ 9]
 [16]
 [25]]
'''

4.张量改变

(1)类型变化

tf.string_to_number(string_tensor, out_type=None, name=None)
tf.to_double(x, name=‘ToDouble’)
tf.to_float(x, name=‘ToFloat’)
tf.to_bfloat16(x, name=“ToBFloat16”)
tf.to_int32(x, name=‘Tolnt32’)
tf.to_int64(x, name=‘Tolnt64’)

但是,这些都不常用,使用最多的是:tf.cast(x, dtype, name=None),通用类型转换,张量类型的修改:不会改变原始的Tensor

(2)形状变化
tensorflow的张量具有两种形状变换,动态形状和静态形状

tf.reshape:改变动态形状
tf.set_shape:改变静态形状

注:只有在形状还没有完全固定下来的情况下才可以改变,转换形状的时候,只能从一维到一维,二维到二维,不能跨维度改变形状

二、数据类型

Tensorflow主要有3种数据类型:数值型,字符串型,布尔型

1.数值型

标量(Scalar) :单个的实数,如1,2,3

向量(Vector) :n个实数的有序集合,通过中括号包裹,如[1,2]

矩阵(Matrix):n 行 m 列实数的有序集合,如 [ [1,2],[3,4] ]

如果要使用TensorFlow 提供的功能函数, 须通过 TensorFlow 的方式去创建张量

import numpy as np
import tensorflow as tf

a = 1.2   # python创建变量
b = tf.constant(1.2)   # tensorflow 创建张量
c = tf.constant([[1,2],[23,0]])
d = c.numpy     # 将张量数据导出为numpy格式
print(type(a),type(b),tf.is_tensor(b),end='\n')
print(c,d,sep='\t',end='\n')
print(c.shape)  

"""
<class 'float'> <class 'tensorflow.python.framework.ops.EagerTensor'> True
tf.Tensor(
[[ 1  2]
 [23  0]], shape=(2, 2), dtype=int32)	<bound method _EagerTensorBase.numpy of <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 1,  2],
       [23,  0]])>>
(2, 2)
"""

创建张量:tf.constant(张量内容,dtype=数据类型(可选))

2.字符串型

使用constant, 通过传入字符串对象即可创建字符串类型的张量

strings = tf.constant("Tensorflow")
print(strings,end='\n')
print(tf.strings.lower(strings))

'''
tf.Tensor(b'Tensorflow', shape=(), dtype=string)
tf.Tensor(b'tensorflow', shape=(), dtype=string)
'''

在 tf.strings 模块中提供了常见的字符串类型的工具函数,lower(),join(), length(), split()

3.布尔型

布尔类型的张量需要传入 Python 语言的布尔类型数据,转换成 TensorFlow 内部布尔型即可
注:TensorFlow 的布尔类型和 Python 语言的布尔类型并不等价,不能通用

# 创建布尔类型张量
bools = tf.constant([True])
print(bools is True)  
print(bools)

'''
False
tf.Tensor([ True], shape=(1,), dtype=bool)
'''

三、变量OP

1.创建变量

变量的特点:存储持久化,可修改值,可指定被训练

为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量,增加了一种专门的数据类型来支持梯度信息的记录:tf.Variable

tf.Variable 类型在普通的张量类型基础上添加了 name,trainable 等属性来支持计算图的构建,通过 tf.Variable()函数可以将普通张量转换为待优化张量

由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数,对于不需要的优化的张量,如神经网络的输入 X,不需要通过 tf.Variable 封装,但是对于需要计算梯度并优化的张量,如神经网络层的W 和𝒃,需要通过 tf.Variable 包裹以便 TensorFlow 跟踪相关梯度信息

tf.Variable(initia_value=None, trainable=True, collections=None, name=None)

initial_value:初始化的值
trainable:是否被训练
collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加到图形集合GraphKeys.TRAINABLE_VARIABLES

注:变量需要显示初始化,才能运行值

# 创建变量
    a1 = tf.Variable(3)
    b1 = tf.Variable(2)
    c1 = tf.add(a1,b1)
    print(a1)
    print(b1)
    print(c1)
    print("...........")
    
    # 初始化变量
    init = tf.global_variables_initializer()
    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        a1, b1, c1 = sess.run([a1, b1, c1])
        print(c1)
'''
<tf.Variable 'Variable:0' shape=() dtype=int32_ref>
<tf.Variable 'Variable_1:0' shape=() dtype=int32_ref>
Tensor("Add:0", shape=(), dtype=int32)
...........
5
'''

2.修改命名空间

返回上下文管理器,用于定义创建变量(或层)的操作, 修改变量的命名空间,
注意:scope name has to match the following pattern: ^ [A-Za-z0-9.][ A-Za-z0-9_.\/>-]*$ 要符号正则表达式

def variable_scope(name_or_scope,
                   default_name=None,
                   values=None,
                   initializer=None,
                   regularizer=None,
                   caching_device=None,
                   partitioner=None,
                   custom_getter=None,
                   reuse=None,
                   dtype=None,
                   use_resource=None)

在这里插入图片描述

# 创建变量
    with tf.variable_scope("my_scope"):
        a1 = tf.Variable(3)
        b1 = tf.Variable(2)
    with tf.variable_scope("your_scope"):
        c1 = tf.add(a1, b1)
    print(a1)
    print(b1)
    print(c1)
    print("...........")
    # 初始化变量

    init = tf.global_variables_initializer()
    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        a1, b1, c1 = sess.run([a1, b1, c1])
        print(c1)
        
'''
<tf.Variable 'my_scope/Variable:0' shape=() dtype=int32_ref>
<tf.Variable 'my_scope/Variable_1:0' shape=() dtype=int32_ref>
Tensor("your_scope/Add:0", shape=(), dtype=int32)
'''
...........
5

总结

提示:这里对文章进行总结:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值