做者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
个人博客:请点击这里python
计划现将 tensorflow 中的 Python API 作一个学习,这样方便之后的学习。
原文连接git
Tensorflow提供了不少的数据类型投射操做,你能将数据类型投射到一个你想要的数据类型上去。github
tf.string_to_number(string_tensor, out_type = None, name = None)
算法
解释:这个函数是将一个string
的Tensor
转换成一个数字类型的Tensor
。可是要注意一点,若是你想转换的数字类型是tf.float32
,那么这个string
去掉引号以后,里面的值必须是一个合法的浮点数,不然不能转换。若是你想转换的数字类型是tf.int32
,那么这个string
去掉引号以后,里面的值必须是一个合法的浮点数或者整型,不然不能转换。api
使用例子:数组
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant('123')
print sess.run(data)
d = tf.string_to_number(data)
print sess.run(d)复制代码
输入参数:
* string_tensor
: 一个string
类型的Tensor
。
* out_type
: 一个可选的数据类型tf.DType
,默认的是tf.float32
,但咱们也能够选择tf.int32
或者tf.float32
。
* name
:(可选)为这个操做取一个名字。bash
输出参数:
* 一个Tensor
,数据类型是out_type
,数据维度和string_tensor
相同。微信
tf.to_double(x, name = 'ToDouble')
dom
解释:这个函数是将一个Tensor
的数据类型转换成float64
。函数
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant(123)
print sess.run(data)
d = tf.to_double(data)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据类型是float64
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成float64
类型的,那么将报错。
tf.to_float(x, name = 'ToFloat')
解释:这个函数是将一个Tensor
的数据类型转换成float32
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant(123)
print sess.run(data)
d = tf.to_float(data)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据类型是float32
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成float32
类型的,那么将报错。
tf.to_bfloat16(x, name = 'ToBFloat16')
解释:这个函数是将一个Tensor
的数据类型转换成bfloat16
。
译者注:这个API
的做用不是很理解,但我测试了一下,输入的x
必须是浮点型的,别的类型都不行。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([x for x in range(20)], tf.float32)
print sess.run(data)
d = tf.to_bfloat16(data)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据类型是bfloat16
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成bfloat16
类型的,那么将报错。
tf.to_int32(x, name = 'ToInt32')
解释:这个函数是将一个Tensor
的数据类型转换成int32
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([x for x in range(20)], tf.float32)
print sess.run(data)
d = tf.to_int32(data)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据类型是int32
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成int32
类型的,那么将报错。
tf.to_int64(x, name = 'ToInt64')
解释:这个函数是将一个Tensor
的数据类型转换成int64
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([x for x in range(20)], tf.float32)
print sess.run(data)
d = tf.to_int64(data)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据类型是int64
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成int64
类型的,那么将报错。
tf.cast(x, dtype, name = None)
解释:这个函数是将一个Tensor
或者SparseTensor
的数据类型转换成dtype
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([x for x in range(20)], tf.float32)
print sess.run(data)
d = tf.cast(data, tf.int32)
print sess.run(d)复制代码
输入参数:
* x
: 一个Tensor
或者是SparseTensor
。
* dtype
: 目标数据类型。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
或者SparseTensor
,数据维度和x
相同。
提示:
* 错误: 若是x
是不能被转换成dtype
类型的,那么将报错。
Tensorflow提供了不少的数据维度转换操做,你能改变数据的维度,将它变成你须要的维度。
tf.shape(input, name = None)
解释:这个函数是返回input
的数据维度,返回的Tensor
数据维度是一维的。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
print sess.run(data)
d = tf.shape(data)
print sess.run(d)复制代码
输入参数:
* input
: 一个Tensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型是int32
。
tf.size(input, name = None)
解释:这个函数是返回input
中一共有多少个元素。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
print sess.run(data)
d = tf.size(data)
print sess.run(d)复制代码
输入参数:
* input
: 一个Tensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型是int32
。
tf.rank(input, name = None)
解释:这个函数是返回Tensor
的秩。
注意:Tensor
的秩和矩阵的秩是不同的,Tensor
的秩指的是元素维度索引的数目,这个概念也被成为order
, degree
或者ndims
。好比,一个Tensor
的维度是[1, 28, 28, 1]
,那么它的秩就是4
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
print sess.run(data)
d = tf.rank(data)
print sess.run(tf.shape(data))
print sess.run(d)复制代码
输入参数:
* input
: 一个Tensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型是int32
。
tf.reshape(tensor, shape, name = None)
解释:这个函数的做用是对tensor
的维度进行从新组合。给定一个tensor
,这个函数会返回数据维度是shape
的一个新的tensor
,可是tensor
里面的元素不变。
若是shape
是一个特殊值[-1]
,那么tensor
将会变成一个扁平的一维tensor
。
若是shape
是一个一维或者更高的tensor
,那么输入的tensor
将按照这个shape
进行从新组合,可是从新组合的tensor
和原来的tensor
的元素是必须相同的。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
print sess.run(data)
print sess.run(tf.shape(data))
d = tf.reshape(data, [-1])
print sess.run(d)
d = tf.reshape(data, [3, 4])
print sess.run(d)复制代码
输入参数:
* tensor
: 一个Tensor
。
* shape
: 一个Tensor
,数据类型是int32
,定义输出数据的维度。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和输入数据相同。
tf.squeeze(input, squeeze_dims = None, name = None)
解释:这个函数的做用是将input
中维度是1
的那一维去掉。可是若是你不想把维度是1
的所有去掉,那么你可使用squeeze_dims
参数,来指定须要去掉的位置。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[1, 2, 1], [3, 1, 1]])
print sess.run(tf.shape(data))
d_1 = tf.expand_dims(data, 0)
d_1 = tf.expand_dims(d_1, 2)
d_1 = tf.expand_dims(d_1, -1)
d_1 = tf.expand_dims(d_1, -1)
print sess.run(tf.shape(d_1))
d_2 = d_1
print sess.run(tf.shape(tf.squeeze(d_1)))
print sess.run(tf.shape(tf.squeeze(d_2, [2, 4])))
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
# shape(squeeze(t)) ==> [2, 3]
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
# shape(squeeze(t, [2, 4])) ==> [1, 2, 3, 1]
复制代码
输入参数:
* input
: 一个Tensor
。
* squeeze_dims
: (可选)一个序列,索引从0
开始,只移除该列表中对应位的tensor
。默认下,是一个空序列[]
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和输入数据相同。
tf.expand_dims(input, dim, name = None)
解释:这个函数的做用是向input
中插入维度是1
的张量。
咱们能够指定插入的位置dim
,dim
的索引从0
开始,dim
的值也能够是负数,从尾部开始插入,符合 python 的语法。
这个操做是很是有用的。举个例子,若是你有一张图片,数据维度是[height, width, channels]
,你想要加入“批量”这个信息,那么你能够这样操做expand_dims(images, 0)
,那么该图片的维度就变成了[1, height, width, channels]
。
这个操做要求: -1-input.dims() <= dim <= input.dims()
这个操做是squeeze()
函数的相反操做,能够一块儿灵活运用。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[1, 2, 1], [3, 1, 1]])
print sess.run(tf.shape(data))
d_1 = tf.expand_dims(data, 0)
print sess.run(tf.shape(d_1))
d_1 = tf.expand_dims(d_1, 2)
print sess.run(tf.shape(d_1))
d_1 = tf.expand_dims(d_1, -1)
print sess.run(tf.shape(d_1))复制代码
输入参数:
* input
: 一个Tensor
。
* dim
: 一个Tensor
,数据类型是int32
,标量。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和输入数据相同,数据和input
相同,可是维度增长了一维。
Tensorflow提供了不少的数据抽取和结合的方法。
tf.slice(input_, begin, size, name = None)
解释:这个函数的做用是从输入数据input
中提取出一块切片,切片的尺寸是size
,切片的开始位置是begin
。切片的尺寸size
表示输出tensor
的数据维度,其中size[i]
表示在第i
维度上面的元素个数。开始位置begin
表示切片相对于输入数据input_
的每个偏移量,好比数据input_
是
,
[[[1, 1, 1], [2, 2, 2]],
[[33, 3, 3], [4, 4, 4]],
[[5, 5, 5], [6, 6, 6]]]begin
为[1, 0, 0]
,那么数据的开始位置是33。由于,第一维偏移了1,其他几位都没有偏移,因此开始位置是33。
操做知足: size[i] = input.dim_size(i) - begin[i]
0 <= begin[i] <= begin[i] + size[i] <= Di for i in [0, n]
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
input = tf.constant([[[1, 1, 1], [2, 2, 2]],
[[3, 3, 3], [4, 4, 4]],
[[5, 5, 5], [6, 6, 6]]])
data = tf.slice(input, [1, 0, 0], [1, 1, 3])
print sess.run(data)
data = tf.slice(input, [1, 0, 0], [1, 2, 3])
print sess.run(data)
data = tf.slice(input, [1, 0, 0], [2, 1, 3])
print sess.run(data)
data = tf.slice(input, [1, 0, 0], [2, 2, 2])
print sess.run(data)复制代码
输入参数:
* input_
: 一个Tensor
。
* begin
: 一个Tensor
,数据类型是int32
或者int64
。
* size
: 一个Tensor
,数据类型是int32
或者int64
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和input_
相同。
tf.split(split_dim, num_split, value, name = 'split')
解释:这个函数的做用是,沿着split_dim
维度将value
切成num_split
块。要求,num_split
必须被value.shape[split_dim]
整除,即value.shape[split_dim] % num_split == 0
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
input = tf.random_normal([5,30])
print sess.run(tf.shape(input))[0] / 5
split0, split1, split2, split3, split4 = tf.split(0, 5, input)
print sess.run(tf.shape(split0))复制代码
输入参数:
* split_dim
: 一个0维的Tensor
,数据类型是int32
,该参数的做用是肯定沿着哪一个维度进行切割,参数范围 [0, rank(value))
。
* num_split
: 一个0维的Tensor
,数据类型是int32
,切割的块数量。
* value
: 一个须要切割的Tensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 从value
中切割的num_split
个Tensor
。
tf.tile(input, multiples, name = None)
解释:这个函数的做用是经过给定的tensor
去构造一个新的tensor
。所使用的方法是将input
复制multiples
次,输出的tensor
的第i
维有input.dims(i) * multiples[i]
个元素,input
中的元素被复制multiples[i]
次。好比,input = [a b c d], multiples = [2]
,那么tile(input, multiples) = [a b c d a b c d]
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
data = tf.constant([[1, 2, 3, 4], [9, 8, 7, 6]])
d = tf.tile(data, [2,3])
print sess.run(d)复制代码
输入参数:
* input_
: 一个Tensor
,数据维度是一维或者更高维度。
* multiples
: 一个Tensor
,数据类型是int32
,数据维度是一维,长度必须和input
的维度同样。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和input
相同。
tf.pad(input, paddings, name = None)
解释:这个函数的做用是向input
中按照paddings
的格式填充0
。paddings
是一个整型的Tensor
,数据维度是[n, 2]
,其中n
是input
的秩。对于input
的中的每一维D
,paddings[D, 0]
表示增长多少个0
在input
以前,paddings[D, 1]
表示增长多少个0
在input
以后。举个例子,假设paddings = [[1, 1], [2, 2]]
和input
的数据维度是[2,2]
,那么最后填充完以后的数据维度以下:
也就是说,最后的数据维度变成了[4,6]
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
t = tf.constant([[[3,3,],[2,2]]])
print sess.run(tf.shape(t))
paddings = tf.constant([[3,3],[1,1],[2,2]])
print sess.run(tf.pad(t, paddings)).shape复制代码
输入参数:
* input
: 一个Tensor
。
* paddings
: 一个Tensor
,数据类型是int32
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和input
相同。
tf.concat(concat_dim, value, name = 'concat')
解释:这个函数的做用是沿着concat_dim
维度,去从新串联value
,组成一个新的tensor
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
sess = tf.Session()
t1 = tf.constant([[1, 2, 3], [4, 5, 6]])
t2 = tf.constant([[7, 8, 9], [10, 11, 12]])
d1 = tf.concat(0, [t1, t2])
d2 = tf.concat(1, [t1, t2])
print sess.run(d1)
print sess.run(tf.shape(d1))
print sess.run(d2)
print sess.run(tf.shape(d2))
# output
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
# tips
从直观上来看,咱们取的concat_dim的那一维的元素个数确定会增长。好比,上述例子中的d1的第0维增长了,并且d1.shape[0] = t1.shape[0]+t2.shape[0]。复制代码
输入参数:
* concat_dim
: 一个零维度的Tensor
,数据类型是int32
。
* values
: 一个Tensor
列表,或者一个单独的Tensor
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个从新串联以后的Tensor
。
tf.pack(values, name = 'pack')
解释:这个函数的做用是将秩为R
的tensor
打包成一个秩为R+1
的tensor
。具体的公式能够表示为:
tf.pack([x, y, z]) = np.asqrray([x, y, z])复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
z = tf.constant([7,8,9])
p = tf.pack([x,y,z])
sess = tf.Session()
print sess.run(tf.shape(p))
print sess.run(p)
复制代码
输入参数:
* values
: 一个Tensor
的列表,每一个Tensor
必须有相同的数据类型和数据维度。
* name
:(可选)为这个操做取一个名字。
输出参数:
* output
: 一个打包的Tensor
,数据类型和values
相同。
tf.unpack(value, num = None, name = 'unpack')
解释:这个函数的做用是将秩为R+1
的tensor
解压成一些秩为R
的tensor
。其中,num
表示要解压出来的tensor
的个数。若是,num
没有被指定,那么num = value.shape[0]
。若是,value.shape[0]
没法获得,那么系统将抛出异常ValueError
。具体的公式能够表示为:
tf.unpack(x, n) = list(x)复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
z = tf.constant([7,8,9])
p = tf.pack([x,y,z])
sess = tf.Session()
print sess.run(tf.shape(p))
pp = tf.unpack(p,3)
print sess.run(pp)
复制代码
输入参数:
* value
: 一个秩大于0
的Tensor
。
* num
: 一个整型,value
的第一维度的值。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 从value
中解压出来的一个Tensor
数组。
异常:
* ValueError
: 若是num
没有被正确指定,那么将抛出异常。
tf.reverse_sequence(input, seq_lengths, seq_dim, name = None)
解释:将input
中的值沿着第seq_dim
维度进行翻转。
这个操做先将input
沿着第0
维度切分,而后对于每一个切片,将切片长度为seq_lengths[i]
的值,沿着第seq_dim
维度进行翻转。
向量seq_lengths
中的值必须知足seq_lengths[i] < input.dims[seq_dim]
,而且其长度必须是input_dims(0)
。
对于每一个切片i
的输出,咱们将第seq_dim
维度的前seq_lengths[i]
的数据进行翻转。
好比:
# Given this:
seq_dim = 1
input.dims = (4, 10, ...)
seq_lengths = [7, 2, 3, 5]
# 由于input的第0维度是4,因此先将input切分红4个切片;
# 由于seq_dim是1,因此咱们按着第1维度进行翻转。
# 由于seq_lengths[0] = 7,因此咱们第一个切片只翻转前7个值,该切片的后面的值保持不变。
# 由于seq_lengths[1] = 2,因此咱们第一个切片只翻转前2个值,该切片的后面的值保持不变。
# 由于seq_lengths[2] = 3,因此咱们第一个切片只翻转前3个值,该切片的后面的值保持不变。
# 由于seq_lengths[3] = 5,因此咱们第一个切片只翻转前5个值,该切片的后面的值保持不变。
output[0, 0:7, :, ...] = input[0, 7:0:-1, :, ...]
output[1, 0:2, :, ...] = input[1, 2:0:-1, :, ...]
output[2, 0:3, :, ...] = input[2, 3:0:-1, :, ...]
output[3, 0:5, :, ...] = input[3, 5:0:-1, :, ...]
output[0, 7:, :, ...] = input[0, 7:, :, ...]
output[1, 2:, :, ...] = input[1, 2:, :, ...]
output[2, 3:, :, ...] = input[2, 3:, :, ...]
output[3, 2:, :, ...] = input[3, 2:, :, ...]复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
input = tf.constant([[1, 2, 3, 4], [3, 4, 5, 6]], tf.int64)
seq_lengths = tf.constant([3, 2], tf.int64)
seq_dim = 1
output = tf.reverse_sequence(input, seq_lengths, seq_dim)
print sess.run(output)
sess.close()
# output
[[3 2 1 4]
[4 3 5 6]]复制代码
输入参数:
* input
: 一个Tensor
,须要反转的数据。
* seq_lengths
: 一个Tensor
,数据类型是int64
,数据长度是input.dims(0)
,而且max(seq_lengths) < input.dims(seq_dim)
。
* seq_dim
: 一个int
,肯定须要翻转的维度。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和input
相同,数据维度和input
相同。
tf.reverse(tensor, dims, name = None)
解释:将指定维度中的数据进行翻转。
给定一个tensor
和一个bool
类型的dims
,dims
中的值为False
或者True
。若是dims[i] == True
,那么就将tensor
中这一维的数据进行翻转。
tensor
最多只能有8
个维度,而且tensor
的秩必须和dims
的长度相同,即rank(tensor) == size(dims)
。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
input_data = tf.constant([[
[
[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]
],
[
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]
]
]])
print 'input_data shape : ', sess.run(tf.shape(input_data))
dims = tf.constant([False, False, False, True])
print sess.run(tf.reverse(input_data, dims))
print "=========================="
dims = tf.constant([False, True, False, False])
print sess.run(tf.reverse(input_data, dims))
print "=========================="
dims = tf.constant([False, False, True, False])
print sess.run(tf.reverse(input_data, dims))
sess.close()复制代码
输入参数:
* tensor
: 一个Tensor
,数据类型必须是如下之一:uint8
,int8
,int32
,bool
,float32
或者float64
,数据维度不超过8
维。
* dims
: 一个Tensor
,数据类型是bool
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和tensor
相同,数据维度和tensor
相同。
tf.transpose(a, perm = None, name = 'transpose')
解释:将a
进行转置,而且根据perm
参数从新排列输出维度。
输出数据tensor
的第i
维将根据perm[i]
指定。好比,若是perm
没有给定,那么默认是perm = [n-1, n-2, ..., 0]
,其中rank(a) = n
。默认状况下,对于二维输入数据,其实就是常规的矩阵转置操做。
好比:
input_data.dims = (1, 4, 3)
perm = [1, 2, 0]
# 由于 output_data.dims[0] = input_data.dims[ perm[0] ]
# 由于 output_data.dims[1] = input_data.dims[ perm[1] ]
# 由于 output_data.dims[2] = input_data.dims[ perm[2] ]
# 因此获得 output_data.dims = (4, 3, 1)
output_data.dims = (4, 3, 1)复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
input_data = tf.constant([[1,2,3],[4,5,6]])
print sess.run(tf.transpose(input_data))
print sess.run(input_data)
print sess.run(tf.transpose(input_data, perm=[1,0]))
input_data = tf.constant([[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]])
print 'input_data shape: ', sess.run(tf.shape(input_data))
output_data = tf.transpose(input_data, perm=[1, 2, 0])
print 'output_data shape: ', sess.run(tf.shape(output_data))
print sess.run(output_data)
sess.close()复制代码
输入参数:
* a
: 一个Tensor
。
* perm
: 一个对于a
的维度的重排列组合。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个通过翻转的Tensor
。
tf.gather(params, indices, name = None)
解释:根据indices
索引,从params
中取对应索引的值,而后返回。
indices
必须是一个整型的tensor
,数据维度是常量或者一维。最后输出的数据维度是indices.shape + params.shape[1:]
。
好比:
# Scalar indices
output[:, ..., :] = params[indices, :, ... :]
# Vector indices
output[i, :, ..., :] = params[indices[i], :, ... :]
# Higher rank indices
output[i, ..., j, :, ... :] = params[indices[i, ..., j], :, ..., :]复制代码
若是indices
是一个从0
到params.shape[0]
的排列,即len(indices) = params.shape[0]
,那么这个操做将把params
进行重排列。
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
params = tf.constant([6, 3, 4, 1, 5, 9, 10])
indices = tf.constant([2, 0, 2, 5])
output = tf.gather(params, indices)
print sess.run(output)
sess.close()复制代码
输入参数:
* params
: 一个Tensor
。
* indices
: 一个Tensor
,数据类型必须是int32
或者int64
。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和params
相同。
tf.dynamic_partition(data, partitions, num_partitions, name = None)
解释:根据从partitions
中取得的索引,将data
分割成num_partitions
份。
咱们先从partitions.ndim
中取出一个元祖js
,那么切片data[js, ...]
将成为输出数据outputs[partitions[js]]
的一部分。咱们将js
按照字典序排列,即js
里面的值为(0, 0, ..., 1, 1, ..., 2, 2, ..., ..., num_partitions - 1, num_partitions - 1, ...)
。咱们将partitions[js] = i
的值放入outputs[i]
。outputs[i]
中的第一维对应于partitions.values == i
的位置。更多细节以下:
outputs[i].shape = [sum(partitions == i)] + data.shape[partitions.ndim:]
outputs[i] = pack([data[js, ...] for js if partitions[js] == i])复制代码
data.shape must start with partitions.shape
这句话不是很明白,说说本身的理解。 data.shape(0)
必须和partitions.shape(0)
相同,即data.shape[0] == partitions.shape[0]
。
好比:
# Scalar partitions
partitions = 1
num_partitions = 2
data = [10, 20]
outputs[0] = [] # Empty with shape [0, 2]
outputs[1] = [[10, 20]]
# Vector partitions
partitions = [0, 0, 1, 1, 0]
num_partitions = 2
data = [10, 20, 30, 40, 50]
outputs[0] = [10, 20, 50]
outputs[1] = [30, 40]复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
params = tf.constant([6, 3, 4, 1, 5, 9, 10])
indices = tf.constant([2, 0, 2, 5])
output = tf.gather(params, indices)
print sess.run(output)
sess.close()复制代码
输入参数:
* data
: 一个Tensor
。
* partitions
: 一个Tensor
,数据类型必须是int32
。任意数据维度,但其中的值必须是在范围[0, num_partitions)
。
* num_partitions
: 一个int
,其值必须不小于1
。输出的切片个数。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个数组Tensor
,数据类型和data
相同。
tf.dynamic_stitch(indices, data, name = None)
解释:这是一个交错合并的操做,咱们根据indices
中的值,将data
交错合并,而且返回一个合并以后的tensor
。
以下构建一个合并的tensor
:
merged[indices[m][i, ..., j], ...] = data[m][i, ..., j, ...]复制代码
其中,m
是一个从0
开始的索引。若是indices[m]
是一个标量或者向量,那么咱们能够获得更加具体的以下推导:
# Scalar indices
merged[indices[m], ...] = data[m][...]
# Vector indices
merged[indices[m][i], ...] = data[m][i, ...]复制代码
从上式的推导,咱们也能够看出最终合并的数据是按照索引从小到大排序的。那么会产生两个问题:1)假设若是一个索引同时存在indices[m][i]
和indices[n][j]
中,其中(m, i) < (n, j)
。那么,data[n][j]
将做为最后被合并的值。2)假设索引越界了,那么缺失的位上面的值将被随机值给填补。
好比:
indices[0] = 6
indices[1] = [4, 1]
indices[2] = [[5, 2], [0, 3]]
data[0] = [61, 62]
data[1] = [[41, 42], [11, 12]]
data[2] = [[[51, 52], [21, 22]], [[1, 2], [31, 32]]]
merged = [[1, 2], [11, 12], [21, 22], [31, 32], [41, 42],
[51, 52], [61, 62]]复制代码
使用例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
sess = tf.Session()
indices = [6, [4, 1], [[5, 2], [0, 3]]]
data = [[61, 62], [[41, 42], [11, 12]], [[[51, 52], [21, 22]], [[1, 2], [31, 32]]]]
output = tf.dynamic_stitch(indices, data)
print sess.run(output)
# 缺乏了第6,第7的位置,索引最后合并的数据中,这两个位置的值会被用随机数代替
indices = [8, [4, 1], [[5, 2], [0, 3]]]
output = tf.dynamic_stitch(indices, data)
# 第一个2被覆盖了,最后合并的数据是第二个2所指的位置
indices = [6, [4, 1], [[5, 2], [2, 3]]]
output = tf.dynamic_stitch(indices, data)
print sess.run(output)
print sess.run(output)
sess.close()复制代码
输入参数:
* indices
: 一个列表,至少包含两Tensor
,数据类型是int32
。
* data
: 一个列表,里面Tensor
的个数和indices
相同,而且拥有相同的数据类型。
* name
:(可选)为这个操做取一个名字。
输出参数:
* 一个Tensor
,数据类型和data
相同。
CoderPai 是一个专一于算法实战的平台,从基础的算法到人工智能算法都有设计。若是你对算法实战感兴趣,请快快关注咱们吧。加入AI实战微信群,AI实战QQ群,ACM算法微信群,ACM算法QQ群。详情请关注 “CoderPai” 微信号(coderpai) 。