TensorFlow常用张量函数

25 篇文章 0 订阅
7 篇文章 1 订阅

TensorFlow数据处理流程

先将数据加载至列表(元组)容器中,在通过convert_to_tensor()方法将数据转换为张量类型。在TensorFlow中运算处理后,再通过numpy()方法导出到普通Python程序能处理的数组和列表中,以方便其他模块调用。

范例:Python数组与张量类型转换

转换函数: tf.convert_to_tensor()

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

a_list = list([1,2,3,])            #列表对象
b_tuple = (11.0, 22.2, 33)         #元组
c_str_tuple = "a", "b", "c", "d"   #字符串元组

tensor_a = tf.convert_to_tensor(a_list,dtype=tf.float32)
tensor_b = tf.convert_to_tensor(b_tuple)
tensor_c = tf.convert_to_tensor(c_str_tuple)
tensor_add = tf.math.add(tensor_a, tensor_b)

print(type(a_list))           #输出类型
print(type(tensor_a))

print(type(b_tuple))
print(type(tensor_b))
print(type(c_str_tuple))
print(type(tensor_c))
print(type(tensor_add))

tf.print(tensor_c)       #输出tensor_c中的数据
tf.print(tensor_add)     #输出tensor_add中的数据

输出:

["a" "b" "c" "d"]
[12 24.2 36]
<class 'list'>
<class 'tensorflow.python.framework.ops.EagerTensor'>
<class 'tuple'>
<class 'tensorflow.python.framework.ops.EagerTensor'>
<class 'tuple'>
<class 'tensorflow.python.framework.ops.EagerTensor'>
<class 'tensorflow.python.framework.ops.EagerTensor'>

TensorFlow中的常量与变量

常量型张量: tf.constant()
Variable变量: tf.Variable() 在机器学习任务中,某些参数(如模型参数)可能需要长期保存,且其值还可能不断被迭代更新,这时就需要用到变量(Variable)。

特别提示: tf作为框架名,其点操作符(.)后面成员的首字母时而小写(如tf.function)时而大写(如tf.variable)这是为什么呢?简单来说,这是TensorFlow的一个编程约定,若成员首字母小写,则表明这个元素直接隶属于TensorFlow框架,是一级方法成员若成员首字母大写,则表明该元素是一个设计好的类(Class),他还需要接着定义对象才能使用。如Variable就是一个类,它有自己的构造方法和成员方法。

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

my_state = tf.Variable(1.0)    #定义一个变量对象
one = tf.constant(1.0)         #定义一个常量
#变量加1操作后并自我赋值
read_and_increment = tf.function(lambda: my_state.assign_add(one))
print(my_state)

for _ in range(3):
    read_and_increment()
    print(my_state.numpy())

输出:

<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>
2.0
3.0
4.0

特别提示: for循环中有一个下划线变量"_",这里可将它理解为“垃圾箱变量”,因为这个下画线虽然可以用来接收变量,但此处我们并不准备用它,这里我们看重的是整个for循环的次数。

tf.Variable对象可以理解为一个常驻内存、不会被轻易回收的张量。例如:神经网络层中的连接权重w和偏置b,它们时时刻刻都在发生变化,而且更新当前值时,还可能需要上一次的变量值,因此需要通过tf.Variable将其封装起来,以便TensorFlow跟踪梯度相关的信息。
tf.Variable有两个属性:name和trainable。通常,如果不对tf.Variable的name属性进行显式命名,那么TensorFlow内部会自动维护这套命名体系,以保证命名的唯一性和规整性。trainable是布尔类型的属性,默认为True。trainable属性值要“从一而终”,后期不许修改。

特别提示: 可以使用 @tf.function() 构建计算图,提高执行效率。
使用方法:在函数前一行加上上式即可。

常用张量生成方法

全0张量: tf.zeros(shape, dtype=tf.dtypes.floats32, name=None)
全1张量: tf.ones()
生成全为给定值的张量: tf.fill(dims, value, name=None) 其中,dim:维度信息,value:填充的值,name:为本操作命名,非必须。
生成已知分布的随机数张量
正态分布的张量生成:tf.random.normal(shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None, name=None) 其中,shape:输出张量尺寸,mean:均值,stddev:方差,seed:随机数种子。
均匀分布的张量生成:tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32) 其中,[minval, maxval]为均匀分布采样区间。若不指定,默认为[0, 1)。
创建特定张量序列
tf.range(limit, delta=1, dtype=None, name=‘range’) 或
tf.range(start, limit, delta=1, dtype=None, name=‘range’)
其中,start:开始元素,limit:训练的上限,无法取到,delta:步长。

张量的索引和切片

索引是指张量元素所在的位置编号。
切片规则:张量名[start: end: step] ,其中冒号(:)作为切片的分隔符,start表示切片的起始索引,从0开始,-1表示结束;end表示切片的结束(注意,不包含end位);step表示步长(相当于采样间隔),步长为正时,从左向右采样取值,步长为负时,则反向采样取值。

张量的维度伸缩与变换

张量中的轴: 张量维度称为轴(Axis)方向。第0维度就是axis=0,第1维度是axis=1,以此类推。通常把三维张量的axis=0设置为深度(depth)或样本的数量。
张量维度的增加和删除:
常用方法
tf.expand_dims() 增加张量维度
tf.concat() 合并两个张量
tf.squeeze() 缩减张量维度

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

A = tf.random.normal([5, 30, 7])
print(A.shape)
A = tf.expand_dims(A, axis=0)
print(A.shape)
B = tf.random.normal([5, 30, 7])
B = tf.expand_dims(B, axis=0)
A_B = tf.concat([A, B], axis=0)
print(A_B.shape)
A = tf.squeeze(A, axis=0)
print(A.shape)

输出:

(5, 30, 7)
(1, 5, 30, 7)
(2, 5, 30, 7)
(5, 30, 7)

张量的合并、分割

合并: tf.concat(values, axis, name=‘concat’)
其中, values是需要拼接的向量,多个向量用列表 [ ] 括起来,axis指定在哪个轴上拼接,name本操作的名称。
分割: tf.split(value, num_or_size_splits, axis=0, num=None, name=‘spllit’)
其中,value待分割张量。num_or_size_splits表明分割方案,当num_or_size_splits为单个数值时,如10,表示将张量等分为10份;当num_or_size_splits为列表时,列表的每个元素表示每份的长度,如[2, 4, 3, 2] 表示将张量分割为4块(即列表的长度), 每块的元素个数依次是2个,4个, 3个,2个。axis指定分割的维度索引号,默认在第0轴进行分割。

参考书籍:深度学习与TensorFlow实践 张玉宏
陆续更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值