摘要:數(shù)據(jù)維度是一維,表示輸出密集張量的維度。解釋這個函數(shù)的作用是將稀疏張量的坐標(biāo)轉(zhuǎn)換成密集張量中的布爾坐標(biāo)。一個布爾類型的向量,向量長度是,并且其中包含個值。一個布爾類型的向量,數(shù)據(jù)長度是,如果該行填充了,那么該位置的布爾值為。
作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/c23...
計劃現(xiàn)將 tensorflow 中的 Python API 做一個學(xué)習(xí),這樣方便以后的學(xué)習(xí)。該章介紹有關(guān)稀疏張量的API
原文鏈接
對于多維稀疏數(shù)據(jù),TensorFlow提供了稀疏張量表示。稀疏張量里面的值都是采用IndexedSlices索引來表示,這樣能更加高效的表示數(shù)據(jù)。
class tf.SparseTensor
解釋:這個函數(shù)的作用是表示一個稀疏張量。
Tensorflow使用三個密集張量:indices,values,dense_shape,來表示一個稀疏張量。在Python接口中,這三個張量被整合到一個SparseTensor類中,如果你調(diào)換了這三個密集張量的位置,那么在進(jìn)行操作之前,SparseTensor類會自動調(diào)換三個張量的位置。
具體的說,稀疏張量表示為SparseTensor(values, indices, dense_shape):
indices: 一個二維的張量,數(shù)據(jù)類型是int64,數(shù)據(jù)維度是[N, ndims]。
values: 一個一維的張量,數(shù)據(jù)類型是任意的,數(shù)據(jù)維度是[N]。
dense_shape: 一個一維的張量,數(shù)據(jù)類型是int64,數(shù)據(jù)維度是[ndims]。
其中,N表示稀疏張量中存在N個值,ndims表示SparseTensor的維度。
相應(yīng)的密集張量滿足:
dense.shape = dense_shape dense[tuple(indices[i])] = values[i]
按照慣例,indices中的索引應(yīng)該按照從小到大的順序排序。SparseTensor中三個密集張量的順序不是強(qiáng)制的,你可以亂序,SparseTensor會自動將它排序。
比如:
SparseTensor(values=[1, 2], indices=[[0, 0], [1, 2]], shape=[3, 4])
那么密集張量就是:
[[1, 0, 0, 0] [0, 0, 2, 0] [0, 0, 0, 0]]
tf.SparseTensor.__init__(indices, values, shape)
解釋:這個函數(shù)的作用是構(gòu)建一個SparseTensor。
輸入?yún)?shù):
indices: 一個二維的張量,數(shù)據(jù)類型是int64,數(shù)據(jù)維度是[N, ndims]。
values: 一個一維的張量,數(shù)據(jù)類型是任意的,數(shù)據(jù)維度是[N]。
dense_shape: 一個一維的張量,數(shù)據(jù)類型是int64,數(shù)據(jù)維度是[ndims]。
輸出參數(shù):
一個稀疏張量SparseTensor。
tf.SparseTensor.indices
解釋:這個函數(shù)的作用是取出密集矩陣中非零值得索引。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices=[[4, 1], [1, 2]], values=[1, 2], shape=[3, 4]) b = a.indices sess = tf.Session() print sess.run(a) print sess.run(b) sess.close()
輸出參數(shù):
一個二維的張量,數(shù)據(jù)類型是int64,數(shù)據(jù)維度是[N, ndims]。其中,N表示在稀疏張量中非零值的個數(shù),ndims表示稀疏張量的秩。
tf.SparseTensor.values
解釋:這個函數(shù)的作用是取出密集矩陣中非零值。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices=[[4, 1], [1, 2]], values=[1, 2], shape=[3, 4]) b = a.values sess = tf.Session() print sess.run(a) print sess.run(b) sess.close()
輸出參數(shù):
一個一維的張量,數(shù)據(jù)類型是任意的。
tf.SparseTensor.dtype
解釋:這個函數(shù)的作用是返回張量中元素的類型。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices=[[4, 1], [1, 2]], values=tf.constant([1, 2]), shape=[3, 4]) b = a.dtype sess = tf.Session() print b sess.close()
輸出參數(shù):
返回張量中元素的類型。
tf.SparseTensor.shape
解釋:這個函數(shù)的作用是返回稀疏張量的維度。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices=[[4, 1], [1, 2]], values=tf.constant([1, 2]), shape=[3, 4]) b = a.shape sess = tf.Session() print sess.run(b) sess.close()
輸出參數(shù):
返回稀疏張量的維度。
tf.SparseTensor.graph
解釋:這個函數(shù)的作用是返回包含該稀疏張量的圖。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices=[[4, 1], [1, 2]], values=tf.constant([1, 2]), shape=[3, 4]) b = a.graph sess = tf.Session() print b sess.close()
輸出參數(shù):
返回包含該稀疏張量的圖。
class tf.SparseTensorValue
解釋:這個函數(shù)的作用是查看設(shè)置稀疏張量的值。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensorValue(indices=[[4, 1], [1, 2]], values=tf.constant([1, 2]), shape=[3, 4]) sess = tf.Session() print a print a[0] print a[1] print a[2] sess.close()
tf.SparseTensorValue.indices
解釋:這個函數(shù)的作用是返回稀疏張量中值的存在位置。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensorValue(indices=[[4, 1], [1, 2]], values=tf.constant([1, 2]), shape=[3, 4]) sess = tf.Session() print a.indices sess.close()
輸出參數(shù):
返回稀疏張量中值的存在位置。
tf.SparseTensorValue.shape
解釋:這個函數(shù)的作用是返回稀疏張量的維度。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensorValue(values=tf.constant([1, 2]), indices=[[4, 1], [1, 2]], shape=[3, 4]) sess = tf.Session() print a.shape sess.close()
輸出參數(shù):
返回稀疏張量的維度。
tf.SparseTensorValue.shape
解釋:這個函數(shù)的作用是返回稀疏張量中的元素。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensorValue(values=tf.constant([1, 2]), indices=[[4, 1], [1, 2]], shape=[3, 4]) sess = tf.Session() print sess.run(a.values) # 這是一個張量,所以用sess.run() sess.close()
輸出參數(shù):
返回稀疏張量中的元素。
TensorFlow提供了稀疏張量與密集張量之間的轉(zhuǎn)換操作。
tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value, name=None)
解釋:這個函數(shù)的作用是將一個稀疏表示轉(zhuǎn)換成一個密集張量。具體將稀疏張量sparse轉(zhuǎn)換成密集張量dense如下:
# If sparse_indices is scalar dense[i] = (i == sparse_indices ? sparse_values : default_value) # If sparse_indices is a vector, then for each i dense[sparse_indices[i]] = sparse_values[i] # If sparse_indices is an n by d matrix, then for each i in [0, n) dense[sparse_indices[i][0], ..., sparse_indices[i][d-1]] = sparse_values[i]
默認(rèn)情況下,dense中的填充值default_value都是0,除非該值被設(shè)置成一個標(biāo)量。
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.sparse_to_dense(sparse_indices = [[1,2],[2,1]], output_shape = [3,3], sparse_values = [2,3], default_value = 1) sess = tf.Session() print sess.run(a) sess.close()
輸入?yún)?shù):
sparse_indices: 一個Tensor,數(shù)據(jù)類型必須是int32或者int64。數(shù)據(jù)維度0維,一維或者二維都可以,或者更加高緯度的sparse_indices[i]。
output_shape: 一個Tensor,數(shù)據(jù)類型必須和sparse_indices相同。數(shù)據(jù)維度是一維,表示輸出密集張量的維度。
sparse_values: 一個Tensor,數(shù)據(jù)維度是一維,其中的每一個元素對應(yīng)sparse_indices中坐標(biāo)的值。
default_value: 一個Tensor,數(shù)據(jù)類型必須和sparse_values相同,數(shù)據(jù)維度是一個標(biāo)量。設(shè)置稀疏索引不指定的值。
name: (可選)為這個操作取一個名字。
輸出參數(shù):
一個Tensor,數(shù)據(jù)類型和sparse_values相同。密集張量的數(shù)據(jù)維度是output_shape。
tf.sparse_tensor_to_dense(sp_input, default_value, name=None)
解釋:這個函數(shù)的作用是將一個稀疏張量SparseTensor轉(zhuǎn)換成一個密集張量。
這個操作是一個便利的將稀疏張量轉(zhuǎn)換成密集張量的方法。
比如,sp_input的數(shù)據(jù)維度是[3, 5],非空值為:
[0, 1]: a [0, 3]: b [2, 0]: c
default_value值為x,那么輸出的密集張量的維度是[3, 5],具體的展示形式如下:
[[x a x b x] [x x x x x] [c x x x x]]
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[0, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[3, 5]) b = tf.sparse_tensor_to_dense(a, default_value = 11) sess = tf.Session() print sess.run(b) sess.close()
輸入?yún)?shù):
sp_input: 一個SparseTensor。
default_value: 數(shù)據(jù)維度是一個標(biāo)量,設(shè)置稀疏索引不指定的值。
name: (可選)設(shè)置返回張量名稱的前綴。
輸出參數(shù):
一個密集張量,數(shù)據(jù)維度是sp_input.shape,密集張量里面的值為sp_input中指定的值,沒有索引的值為default_value值。
異常:
類型錯誤: 如果sp_input不是一個SparseTensor,將報錯。
tf.sparse_to_indicator(sp_input, vocab_size, name=None)
解釋:這個函數(shù)的作用是將稀疏張量SparseTensor的坐標(biāo)轉(zhuǎn)換成密集張量中的布爾坐標(biāo)。
sp_input中的最后一維被丟棄,并且用sp_input在該位的值來代替,如果sp_input.shape = [D0, D1, D2, ..., Dn, K],其中K是最后一維,那么output.shape = [D0, D1, D2, ..., Dn, vocab_size],其中:
output[d_0, d_1, ..., d_n, sp_input[d_0, d_1, ..., d_n, k]] = True
output中其余值為False。
比如,sp_input.shape = [2, 3, 4],非空值如下:
[0, 0, 0]: 0 [0, 1, 0]: 10 [1, 0, 3]: 103 [1, 1, 2]: 112 [1, 1, 3]: 113 [1, 2, 1]: 121
并且vocab_size = 200,那么輸出output.shape = [2, 3, 200],并且output中的值都是False,除了以下位置:
(0, 0, 0), (0, 1, 10), (1, 0, 103), (1, 1, 112), (1, 1, 113), (1, 2, 121).
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[0, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[3, 5]) b = tf.sparse_to_indicator(a, 10) sess = tf.Session() print sess.run(b) sess.close()
輸入?yún)?shù):
sp_input: 一個SparseTensor,數(shù)據(jù)類型是int32或者int64。
vocab_size: sp_Input最后一維的新的維度,并且0 <= sp_input.shape > vocab_size。
name: (可選)設(shè)置返回張量名稱的前綴。
輸出參數(shù):
一個經(jīng)過修改的密集布爾張量。
異常:
類型錯誤: 如果sp_input不是一個SparseTensor,將報錯。
TensorFlow提供了一些對于稀疏張量的操作函數(shù)。
tf.sparse_concat(concat_dim, sp_inputs, name=None)
解釋:這個函數(shù)的作用是將一系列的SparseTensor,按照指定的維度進(jìn)行合并。
具體合并思路是,先將稀疏張量看成是一個密集張量,然后按照指定的維度進(jìn)行張量合并,最后將合并成的密集張量看成是一個稀疏張量。
輸入的數(shù)據(jù)中,SparseTensor的數(shù)據(jù)維度必須是相同的,并且indices,values和shapes的長度必須相同。
輸出數(shù)據(jù)的維度將由輸入數(shù)據(jù)的維度決定,除了需要合并的那一維度,這一維度是所有數(shù)據(jù)該維度的相加總和。
輸出張量中的元素將會被重新保存在稀疏張量中,并且按照原來的順序進(jìn)行排序。
這個操作的時間復(fù)雜度是O(M log M),其中,M是輸入數(shù)據(jù)中所有非空元素的個數(shù)總和。
比如,當(dāng)concat_dim = 1時:
sp_inputs[0]: shape = [2, 3] [0, 2]: "a" [1, 0]: "b" [1, 1]: "c" sp_inputs[1]: shape = [2, 4] [0, 1]: "d" [0, 2]: "e"
那么輸出數(shù)據(jù)為:
shape = [2, 7] [0, 2]: "a" [0, 4]: "d" [0, 5]: "e" [1, 0]: "b" [1, 1]: "c"
用圖形表示,如下:
[ a] concat [ d e ] = [ a d e ] [b c ] [ ] [b c ]
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[0, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[3, 5]) aa = tf.SparseTensor(indices = [[1, 1], [1, 3], [2, 1]], values=[11,12,13], shape=[3, 5]) b = tf.sparse_concat(0, [a, aa]) sess = tf.Session() print sess.run(b) print sess.run(tf.sparse_tensor_to_dense(b)) sess.close()
輸入?yún)?shù):
concat_dim: 需要合并的維度。
sp_inputs: 一個需要合并的SparseTensor列表。
name: (可選)設(shè)置返回張量名稱的前綴。
輸出參數(shù):
一個經(jīng)過合并的SparseTensor。
異常:
類型錯誤: 如果sp_inputs不是一個SparseTensor列表。
tf.sparse_reorder(sp_input, name=None)
解釋:這個函數(shù)的作用是將SparseTensor中的元素進(jìn)行重新排列,按照索引從小到大進(jìn)行排序。
重排列不會影響SparseTensor的維度。
比如,如果sp_input的維度是[4, 5],indices / values如下:
[0, 3]: b [0, 1]: a [3, 1]: d [2, 0]: c
那么輸出的SparseTensor的維度還是[4, 5] ,indices / values如下:
[0, 1]: a [0, 3]: b [2, 0]: c [3, 1]: d
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[2, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[3, 5]) b = tf.sparse_reorder(a) sess = tf.Session() print sess.run(b) sess.close()
輸入?yún)?shù):
sp_input: 一個SparseTensor。
name: (可選)設(shè)置返回張量名稱的前綴。
輸出參數(shù):
一個SparseTensor,數(shù)據(jù)維度和數(shù)據(jù)類型都不變,只有其中的值進(jìn)行了有序的排序。
異常:
類型錯誤: 如果sp_input不是一個SparseTensor。
tf.sparse_retain(sp_input, to_retain, name=None)
解釋:這個函數(shù)的作用是保留SparseTensor中指定的非空元素。
比如,如果sp_input的數(shù)據(jù)維度是[4, 5],并且擁有4個非空值如下:
[0, 1]: a [0, 3]: b [2, 0]: c [3, 1]: d
而且to_retain = [True, False, False, True],那么最后輸出數(shù)據(jù)SparseTensor的數(shù)據(jù)維度是[4, 5],并且保留兩個非空值如下:
[0, 1]: a [3, 1]: d
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[2, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[3, 5]) b = tf.sparse_retain(a, [False, False, True]) sess = tf.Session() print sess.run(b) sess.close()
輸入?yún)?shù):
sp_input: 一個SparseTensor,包含N個非空元素。
to_retain: 一個布爾類型的向量,向量長度是N,并且其中包含M個True值。
輸出參數(shù):
一個SparseTensor,數(shù)據(jù)維度和輸入數(shù)據(jù)相同,其中包含M個非空值,該值的位置根據(jù)True的位置來決定。
異常:
類型錯誤: 如果sp_input不是一個SparseTensor。
tf.sparse_fill_empty_rows(sp_input, default_value, name=None)
解釋:這個函數(shù)的作用是將二維的SparseTensor中,將空的行中填充指定元素的值。
如果一行中不存在元素,那么就將改行的坐標(biāo)[row, 0]填上default_value。
比如,我們假設(shè)sp_input的數(shù)據(jù)維度是[5, 6],并且非空值如下:
[0, 1]: a [0, 3]: b [2, 0]: c [3, 1]: d
因為在稀疏張量中,第一行和第四行中不存在值,那么我們需要在[1, 0]和[4, 0]坐標(biāo)填上default_value,如下:
[0, 1]: a [0, 3]: b [1, 0]: default_value [2, 0]: c [3, 1]: d [4, 0]: default_value
請注意,輸入可能有空列在最后,但對這個操作沒有任何影響。
輸出的SparseTensor將是一個按照從小到大的順序進(jìn)行排序,并且輸出數(shù)據(jù)和輸入數(shù)據(jù)擁有相同的數(shù)據(jù)維度。
這個操作還會返回一個布爾向量,其中的布爾值,如果是True值,那么表示該行添加了一個default_value,計算公式如下:
empty_row_indicator[i] = True iff row i was an empty row.
使用例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np a = tf.SparseTensor(indices = [[2, 1], [0, 3], [2, 0]], values=[1,2,3], shape=[6, 5]) b, bb = tf.sparse_fill_empty_rows(a, 10) sess = tf.Session() print sess.run(b) print "----" print sess.run(bb) sess.close()
輸入?yún)?shù):
sp_input: 一個SparseTensor,數(shù)據(jù)維度是[N, M]。
default_value: 需要向空行填充的值,數(shù)據(jù)類型和sp_input相同。
name: (可選)設(shè)置返回張量名稱的前綴。
輸出參數(shù):
sp_ordered_output: 一個SparseTensor,數(shù)據(jù)維度是[N, M],并且其中所有空行填充了default_value。
empty_row_indicator: 一個布爾類型的向量,數(shù)據(jù)長度是N,如果該行填充了default_value,那么該位置的布爾值為True。
異常:
類型錯誤: 如果sp_input不是一個SparseTensor。
作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/c23...
CoderPai 是一個專注于算法實(shí)戰(zhàn)的平臺,從基礎(chǔ)的算法到人工智能算法都有設(shè)計。如果你對算法實(shí)戰(zhàn)感興趣,請快快關(guān)注我們吧。加入AI實(shí)戰(zhàn)微信群,AI實(shí)戰(zhàn)QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關(guān)注 “CoderPai” 微信號(coderpai)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41214.html
摘要:解釋這個函數(shù)的作用是對的維度進(jìn)行重新組合。其中,表示要解壓出來的的個數(shù)。如果,無法得到,那么系統(tǒng)將拋出異常。異常如果沒有被正確指定,那么將拋出異常。向量中的值必須滿足,并且其長度必須是。對于每個切片的輸出,我們將第維度的前的數(shù)據(jù)進(jìn)行翻轉(zhuǎn)。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/00...
摘要:隨機(jī)數(shù)張量提供了一些函數(shù),去幫助我們構(gòu)建隨機(jī)數(shù)張量。該值表示正態(tài)分布的均值。一個維的,或者一個數(shù)據(jù)類型是的值,該值表示正態(tài)分布的標(biāo)準(zhǔn)偏差。解釋這個函數(shù)返回一個隨機(jī)數(shù)序列,數(shù)組里面的值按照均勻分布,數(shù)據(jù)范圍是。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/d05... 計劃現(xiàn)將 tens...
摘要:輸出數(shù)據(jù)的第維將根據(jù)指定。輸入數(shù)據(jù)必須是一個二維的矩陣,經(jīng)過轉(zhuǎn)置或者不轉(zhuǎn)置,內(nèi)部維度必須相匹配。默認(rèn)情況下,該標(biāo)記都是被設(shè)置為。解釋這個函數(shù)的作用是將兩個 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/ce4... 計劃現(xiàn)將 tensorflow 中的 Python API 做一個學(xué)習(xí),...
摘要:使用例子輸入?yún)?shù)一個,數(shù)據(jù)類型必須是以下之一,,,,,,。解釋這個函數(shù)的作用是沿著指定的維度,分割張量中的值,并且返回最大值。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/4da... 計劃現(xiàn)將 tensorflow 中的 Python API 做一個學(xué)習(xí),這樣方便以后的學(xué)習(xí)。原文鏈接...
摘要:表示元素是否放電的概率。更加具體的表示細(xì)節(jié)為注意,必須有。數(shù)據(jù)維度是四維。在大部分處理過程中,卷積核的水平移動步數(shù)和垂直移動步數(shù)是相同的,即。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/e3a... 計劃現(xiàn)將 tensorflow 中的 Python API 做一個學(xué)習(xí),這樣方便以后...
閱讀 1368·2021-11-24 09:39
閱讀 1358·2021-11-04 16:12
閱讀 2701·2021-09-24 09:47
閱讀 3346·2021-09-01 10:50
閱讀 1487·2019-08-30 15:55
閱讀 1432·2019-08-30 15:43
閱讀 652·2019-08-30 11:08
閱讀 3588·2019-08-23 18:33