tensorflow学习笔记:tf.data.Dataset,from_tensor_slices(),shuffle(),batch()的用法
tf.data.Dataset.from_tensor_slices:
它的作用是切分傳入Tensor的第一個(gè)維度,生成相應(yīng)的dataset。
例1:
dataset = tf.data.Dataset.from_tensor_slices(np.random.uniform(size=(5, 2)))?
傳入的數(shù)值是一個(gè)矩陣,它的形狀為(5, 2),tf.data.Dataset.from_tensor_slices就會(huì)切分它形狀上的第一個(gè)維度,最后生成的dataset中一個(gè)含有5個(gè)元素,每個(gè)元素的形狀是(2, ),即每個(gè)元素是矩陣的一行。
例2:
對(duì)于更復(fù)雜的情形,比如元素是一個(gè)python中的元組或者字典:在圖像識(shí)別中一個(gè)元素可以是{”image”:image_tensor,”label”:label_tensor}的形式。?
dataset = tf.data.Dataset.from_tensor_slices ( { “a”:np.array([1.0,2.0,3.0,4.0,5.0]), “b”:np.random.uniform(size=(5,2) ) } )?
這時(shí),函數(shù)會(huì)分別切分”a”中的數(shù)值以及”b”中的數(shù)值,最后總dataset中的一個(gè)元素就是類(lèi)似于{ “a”:1.0, “b”:[0.9,0.1] }的形式。
batch很好理解,就是batch size。注意在一個(gè)epoch中最后一個(gè)batch大小可能小于等于batch size?
dataset.repeat就是俗稱(chēng)epoch,但在tf中與dataset.shuffle的使用順序可能會(huì)導(dǎo)致個(gè)epoch的混合?
dataset.shuffle就是說(shuō)維持一個(gè)buffer_size 大小的 shuffle buffer,圖中所需的每個(gè)樣本從shuffle buffer中獲取,取得一個(gè)樣本后,就從源數(shù)據(jù)集中加入一個(gè)樣本到shuffle buffer中。對(duì)于完美的洗牌,需要大于或等于數(shù)據(jù)集的完整大小的緩沖區(qū)大小。
tf.slice:?
tf.slice(input_,begin,size,name=None )函數(shù)參數(shù)
- input_:一個(gè)Tensor.
- begin:一個(gè)int32或int64類(lèi)型的Tensor.
- size:一個(gè)int32或int64類(lèi)型的Tensor.
- name:操作的名稱(chēng)(可選).
函數(shù)返回
tf.slice函數(shù)返回與input具有相同類(lèi)型的Tensor.
此操作從由begin指定位置開(kāi)始的張量input中提取一個(gè)尺寸size的切片.切片size被表示為張量形狀,其中size[i]是你想要分割的input的第i維的元素的數(shù)量.切片的起始位置(begin)表示為每個(gè)input維度的偏移量.換句話(huà)說(shuō),begin[i]是你想從中分割出來(lái)的input的“第i個(gè)維度”的偏移量.
input = [[[1, 1, 1], [2, 2, 2]],[[3, 3, 3], [4, 4, 4]],[[5, 5, 5], [6, 6, 6]]] tf.slice(input, [1, 0, 0], [1, 1, 3]) ==> [[[3, 3, 3]]] tf.slice(input, [1, 0, 0], [1, 2, 3]) ==> [[[3, 3, 3],[4, 4, 4]]] tf.slice(input, [1, 0, 0], [2, 1, 3]) ==> [[[3, 3, 3]],[[5, 5, 5]]]tf.gather(input, [0, 2]) ==> [[[1, 1, 1], [2, 2, 2]],[[5, 5, 5], [6, 6, 6]]]假設(shè)我們要從input中抽取[[[3, 3, 3]]],這個(gè)輸出在inputaxis=0的下標(biāo)是1,axis=1的下標(biāo)是0,axis=2的下標(biāo)是0-2,所以begin=[1,0,0],size=[1,1,3]。假設(shè)我們要從input中抽取[[[3, 3, 3], [4, 4, 4]]],這個(gè)輸出在inputaxis=0的下標(biāo)是1,axis=1的下標(biāo)是0-1,axis=2的下標(biāo)是0-2,所以begin=[1,0,0],size=[1,2,3]。假設(shè)我們要從input中抽取[[[3, 3, 3], [5, 5, 5]]],這個(gè)輸出在inputaxis=0的下標(biāo)是1-2,axis=1的下標(biāo)是0,axis=2的下標(biāo)是0-2,所以begin=[1,0,0],size=[2,1,3]。假設(shè)我們要從input中抽取[[[1, 1, 1], [2, 2, 2]],[[5, 5, 5], [6, 6, 6]]],這個(gè)輸出在input的axis=0的下標(biāo)是[0, 2],不連續(xù),可以用tf.gather抽取。input[0]和input[2]tf.identity
tf.sequence_mask:
tf.sequence_mask(lengths,maxlen=None,dtype=tf.dtypes.bool,name=None )函數(shù)參數(shù)
- lengths:整數(shù)張量,其所有值小于等于maxlen.
- maxlen:標(biāo)量整數(shù)張量,返回張量的最后維度的大小;默認(rèn)值是lengths中的最大值.
- dtype:結(jié)果張量的輸出類(lèi)型.
- name:操作的名字.
函數(shù)返回值
形狀為lengths.shape + (maxlen,)的mask張量,投射到指定的dtype.
tf.sequence_mask([1, 3, 2], 5) # [[True, False, False, False, False],# [True, True, True, False, False],# [True, True, False, False, False]]tf.sequence_mask([[1, 3],[2,0]]) # [[[True, False, False],# [True, True, True]],# [[True, True, False],# [False, False, False]]]tf.boolean_mask:
tf.boolean_mask(tensor,mask,name='boolean_mask',axis=None )一般情況下,0 < dim(mask) = K <= dim(tensor) 并且 mask 的形狀必須與張量形狀的第一 K 維度匹配.然后我們就有:(tensor,?mask)[i,?j1,...,jd]?=?tensor[i1,...,iK,j1,...,jd] 當(dāng)(i1,...,iK) 是 mask?(row-major?order) 的第 i 個(gè)真輸入.
ARGS:
- tensor:N -D 張量.
- mask:K - D 布爾張量,K <= N 和 K 必須是靜態(tài)已知的.
- name:此操作的名稱(chēng)(可選).
返回:
返回(N-K + 1)維張量由條目中填充的 tensor 對(duì)應(yīng)于 mask 中的 True 值.
注意:
- ValueError:如果形狀不符合時(shí).
?
總結(jié)
以上是生活随笔為你收集整理的tensorflow学习笔记:tf.data.Dataset,from_tensor_slices(),shuffle(),batch()的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习:正则化原理总结
- 下一篇: tensorflow学习笔记:tf.co