相关文章:
【一】tensorflow安装、常用python镜像源、tensorflow 深度学习强化学习教学
【二】tensorflow调试报错、tensorflow 深度学习强化学习教学
trick1---实现tensorflow和pytorch迁移环境教学
zip语法
zip([iterable, ...])
a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表
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)]
函数定义:
def tile(input, multiples, name=None):
函数功能:在指定的维度上复制N遍),来创建出一个新的 tensor。
3个参数:
input:输入的tensor
multiples:在指定的维度上复制原tensor的次数
name:operation的名字
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))
[[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
作为tensorflow里的正态分布产生函数,这两个函数的输入参数几乎完全一致,
而其主要的区别在于,tf.truncated_normal的输出如字面意思是截断的,而截断的标准是2倍的stddev。
举例,当输入参数mean = 0 , stddev =1时,
使用tf.truncated_normal的输出是不可能出现-2,2以外的点的,
而如果shape够大的话,tf.random_normal却会产生2.2或者2.4之类的输出。
处理两个矩阵的点除,得到结果后,再作其他的计算,发现有些内置的函数不work;查看得到的数据,发现有很多nan和inf,导致python的基本函数运行不了,这是因为在除的过程中分母出现0的缘故。为了将结果能够被python其他函数处理,尤其numpy库,需要将nan,inf转为python所能识别的类型。这里将nan,inf替换0作为例子。
代码
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)
结果
[[ 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
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张量
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)
输出:
[[0 1 2 3]
[4 5 6 7]]
tf.data.Dataset.from_tensor_slices
该函数是dataset核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。
假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple,那么我们的想法是让每个标签都恰好对应2个特征,而且像直接切片,比如:f11, f12。f11表示第一个数据的第一个特征,f12表示第1个数据的第二个特征,t1表示第一个数据标签。那么tf.data.Dataset.from_tensor_slices就是做了这件事情:
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) # 输出张量的信息
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)