摘要:解釋這個函數的作用是對的維度進行重新組合。其中,表示要解壓出來的的個數。如果,無法得到,那么系統將拋出異常。異常如果沒有被正確指定,那么將拋出異常。向量中的值必須滿足,并且其長度必須是。對于每個切片的輸出,我們將第維度的前的數據進行翻轉。
作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/00a...
計劃現將 tensorflow 中的 Python API 做一個學習,這樣方便以后的學習。該章介紹有關張量轉換的API
原文鏈接
Tensorflow提供了很多的數據類型投射操作,你能將數據類型投射到一個你想要的數據類型上去。
tf.string_to_number(string_tensor, out_type = None, name = None)
解釋:這個函數是將一個string的Tensor轉換成一個數字類型的Tensor。但是要注意一點,如果你想轉換的數字類型是tf.float32,那么這個string去掉引號之后,里面的值必須是一個合法的浮點數,否則不能轉換。如果你想轉換的數字類型是tf.int32,那么這個string去掉引號之后,里面的值必須是一個合法的浮點數或者整型,否則不能轉換。
使用例子:
#!/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:(可選)為這個操作取一個名字。
輸出參數:
一個Tensor,數據類型是out_type,數據維度和string_tensor相同。
tf.to_double(x, name = "ToDouble")
解釋:這個函數是將一個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相同。
作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/00a...
CoderPai 是一個專注于算法實戰的平臺,從基礎的算法到人工智能算法都有設計。如果你對算法實戰感興趣,請快快關注我們吧。加入AI實戰微信群,AI實戰QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關注 “CoderPai” 微信號(coderpai)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41235.html
摘要:隨機數張量提供了一些函數,去幫助我們構建隨機數張量。該值表示正態分布的均值。一個維的,或者一個數據類型是的值,該值表示正態分布的標準偏差。解釋這個函數返回一個隨機數序列,數組里面的值按照均勻分布,數據范圍是。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/d05... 計劃現將 tens...
摘要:數據維度是一維,表示輸出密集張量的維度。解釋這個函數的作用是將稀疏張量的坐標轉換成密集張量中的布爾坐標。一個布爾類型的向量,向量長度是,并且其中包含個值。一個布爾類型的向量,數據長度是,如果該行填充了,那么該位置的布爾值為。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/c23... 計...
摘要:輸出數據的第維將根據指定。輸入數據必須是一個二維的矩陣,經過轉置或者不轉置,內部維度必須相匹配。默認情況下,該標記都是被設置為。解釋這個函數的作用是將兩個 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/ce4... 計劃現將 tensorflow 中的 Python API 做一個學習,...
摘要:使用例子輸入參數一個,數據類型必須是以下之一,,,,,,。解釋這個函數的作用是沿著指定的維度,分割張量中的值,并且返回最大值。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/4da... 計劃現將 tensorflow 中的 Python API 做一個學習,這樣方便以后的學習。原文鏈接...
摘要:表示元素是否放電的概率。更加具體的表示細節為注意,必須有。數據維度是四維。在大部分處理過程中,卷積核的水平移動步數和垂直移動步數是相同的,即。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/e3a... 計劃現將 tensorflow 中的 Python API 做一個學習,這樣方便以后...
閱讀 2136·2023-04-25 18:49
閱讀 1839·2019-08-30 14:02
閱讀 2642·2019-08-29 17:24
閱讀 3323·2019-08-28 18:10
閱讀 2925·2019-08-28 18:03
閱讀 488·2019-08-26 12:01
閱讀 3308·2019-08-26 11:31
閱讀 1408·2019-08-26 10:29