前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tensorflow语法【zip、tf.tile、tf.truncated_normal、tf.data.Dataset.from_tensor_slices、dataset中shuffle()】

tensorflow语法【zip、tf.tile、tf.truncated_normal、tf.data.Dataset.from_tensor_slices、dataset中shuffle()】

作者头像
汀丶人工智能
发布2022-12-01 16:36:57
7190
发布2022-12-01 16:36:57
举报
文章被收录于专栏:NLP/KG

相关文章:

【一】tensorflow安装、常用python镜像源、tensorflow 深度学习强化学习教学

【二】tensorflow调试报错、tensorflow 深度学习强化学习教学

【三】tensorboard安装、使用教学以及遇到的问题

【四】超级快速pytorch安装


trick1---实现tensorflow和pytorch迁移环境教学


zip()函数

zip语法

代码语言:javascript
复制
zip([iterable, ...])
a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

代码语言:javascript
复制
zipp=zip(a,b)
#result
[(1,4),(2,5),(3,6)]


zipp=zip(a,c)
#result
# 元素个数与最短的列表一致
[(1,4),(2,5),(3,6)]

zip(*zipp)
# 与 zip 相反,可理解为解压,返回二维矩阵式
[(1,2,3),(4,5,6)]

tf.tile() 

函数定义:

代码语言:javascript
复制
def tile(input, multiples, name=None):

函数功能:在指定的维度上复制N遍),来创建出一个新的 tensor。

3个参数:

input:输入的tensor

multiples:在指定的维度上复制原tensor的次数

name:operation的名字

代码语言:javascript
复制
import tensorflow as tf

with tf.Session() as sess:
    a = tf.constant([[15, 16], [17, 18]])
    b = tf.tile(a, [1, 3])
    c = tf.tile(a, [3, 2])
    print('------------------------------------')
    print(sess.run(a))
    print('------------------------------------')
    print(sess.run(b))
    print('------------------------------------')
    print(sess.run(c))
代码语言:javascript
复制
[[15 16]
 [17 18]]
------------------------------------
[[15 16 15 16 15 16]
 [17 18 17 18 17 18]]
------------------------------------
[[15 16 15 16]
 [17 18 17 18]
 [15 16 15 16]
 [17 18 17 18]
 [15 16 15 16]
 [17 18 17 18]]

输入的 a 是一个 2x2 的矩阵,tf.tile(a, 1, 3) 里的 1, 3 表示在第一个维度上把输入的tensor重复1遍,在第二个维度上把输入的tensor重复3遍。在本例中,第一个维度就是行,第二个维度就是列,因此 b 就变成了 2x6 的矩阵。

注意:tf.tile() 里的第2个参数,例如 1, 3,里面有两个元素,它必须与输入的 tensor 的维度一样(2维),如果输入的 tensor 是3维的,那么 tf.tile() 的第2个参数里也必须有3个元素,例如 2, 3, 5,否则会报类似于下面的错:

ValueError: Shape must be rank 3 but is rank 1 for 'Tile_1' (op: 'Tile') with input shapes

tf.truncated_normal与tf.random_normal的区别

作为tensorflow里的正态分布产生函数,这两个函数的输入参数几乎完全一致,

而其主要的区别在于,tf.truncated_normal的输出如字面意思是截断的,而截断的标准是2倍的stddev。

举例,当输入参数mean = 0 , stddev =1时,

使用tf.truncated_normal的输出是不可能出现-2,2以外的点的,

而如果shape够大的话,tf.random_normal却会产生2.2或者2.4之类的输出。

python将nan, inf转为特定的数字

处理两个矩阵的点除,得到结果后,再作其他的计算,发现有些内置的函数不work;查看得到的数据,发现有很多nan和inf,导致python的基本函数运行不了,这是因为在除的过程中分母出现0的缘故。为了将结果能够被python其他函数处理,尤其numpy库,需要将nan,inf转为python所能识别的类型。这里将nan,inf替换0作为例子。

代码

代码语言:javascript
复制
import numpy as np
a = np.array([[np.nan, np.nan, 1, 2], [np.inf, np.inf, 3, 4], [1, 1, 1, 1], [2, 2, 2, 2]])
print a
where_are_nan = np.isnan(a)
where_are_inf = np.isinf(a)
a[where_are_nan] = 0
a[where_are_inf] = 0
print a
print np.mean(a)

结果

代码语言:javascript
复制
[[ nan  nan   1.   2.]
 [ inf  inf   3.   4.]
 [  1.   1.   1.   1.]
 [  2.   2.   2.   2.]]
[[ 0.  0.  1.  2.]
 [ 0.  0.  3.  4.]
 [ 1.  1.  1.  1.]
 [ 2.  2.  2.  2.]]
1.375

tf.contrib.keras.preprocessing.sequence.pad_sequences 将标量数据 转换成numpy ndarray

keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype=’int32’, padding=’pre’, truncating=’pre’, value=0.) 函数说明: 将长为nb_samples的序列(标量序列)转化为形如(nb_samples,nb_timesteps)2D numpy array。如果提供了参数maxlen,nb_timesteps=maxlen,否则其值为最长序列的长度。其他短于该长度的序列都会在后部填充0以达到该长度。长于nb_timesteps的序列将会被截断,以使其匹配目标长度。padding和截断发生的位置分别取决于padding和truncating. 参数 sequences:浮点数或整数构成的两层嵌套列表 maxlen:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0. dtype:返回的numpy array的数据类型 padding:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补 truncating:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断 value:浮点数,此值将在填充时代替默认的填充值0 返回值 返回形如(nb_samples,nb_timesteps)的2D张量

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
 
pad_sequence = tf.contrib.keras.preprocessing.sequence.pad_sequences
 
a=[[1,2,3],[4,5,6,7]]
b_len=np.array([len(_) for _ in a])
bs_packed = pad_sequence(a,maxlen=4,padding='pre',truncating='pre',value = 0)
 
print(bs_packed)
 
代码语言:javascript
复制
输出:
[[0 1 2 3]
[4 5 6 7]]

tf.data.Dataset.from_tensor_slices

tf.data.Dataset.from_tensor_slices

该函数是dataset核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。

假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple,那么我们的想法是让每个标签都恰好对应2个特征,而且像直接切片,比如:f11, f12。f11表示第一个数据的第一个特征,f12表示第1个数据的第二个特征,t1表示第一个数据标签。那么tf.data.Dataset.from_tensor_slices就是做了这件事情:

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
 
features, labels = (np.random.sample((6, 3)),  # 模拟6组数据,每组数据3个特征
                    np.random.sample((6, 1)))  # 模拟6组数据,每组数据对应一个标签,注意两者的维数必须匹配
 
print((features, labels))  #  输出下组合的数据
data = tf.data.Dataset.from_tensor_slices((features, labels))
print(data)  # 输出张量的信息

dataset中shuffle()、repeat()、batch()用法

代码语言:javascript
复制
import numpy as np
import tensorflow as tf
np.random.seed(0)
x = np.random.sample((11,2))
# make a dataset from a numpy array
print(x)

dataset = tf.data.Dataset.from_tensor_slices(x)
dataset = dataset.shuffle(2)  # 将数据打乱,数值越大,混乱程度越大
dataset = dataset.batch(4)  # 按照顺序取出4行数据,最后一次输出可能小于batch
dataset = dataset.repeat()  # 数据集重复了指定次数
# repeat()在batch操作输出完毕后再执行,若在之前,相当于先把整个数据集复制两次
#为了配合输出次数,一般默认repeat()空

# create the iterator
iter = dataset.make_one_shot_iterator()
el = iter.get_next()

with tf.Session() as sess:
    for i in range(6):
        value = sess.run(el)
        print(value)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • zip()函数
  • tf.tile() 
  • tf.truncated_normal与tf.random_normal的区别
  • python将nan, inf转为特定的数字
  • tf.contrib.keras.preprocessing.sequence.pad_sequences 将标量数据 转换成numpy ndarray
  • tf.data.Dataset.from_tensor_slices
  • dataset中shuffle()、repeat()、batch()用法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档