【TF/Guide筆記】 08. Ragged/Sparse tensor, RNG
明明記得之前試過RaggedTensor不能下標(biāo)訪問,但是看到他支持reduce_mean就又試了一下發(fā)現(xiàn)是可以的,估計是之前搞的不對。既然支持下標(biāo)訪問,也可以按維度reduce,那說明它內(nèi)部肯定記錄了未定維每一行的長度
如果按列reduce,如果長度不夠的話會被當(dāng)做不存在而不是0
倒序取元素的時候就是從有元素的末尾取,跟直觀的理解是一樣的。
雖然支持broadcast,但是被broadcast的那個小tensor似乎不支持RaggedTensor,用Tensor是可以的
RaggedTensor連序列化都搞了好幾套方法來應(yīng)對不同情況的數(shù)據(jù),就為了讓編碼后的內(nèi)容占最小空間,絕了
看起來SparseTensor并不是key-value的形式,而是就像構(gòu)造需要的那樣,按順序存放了index-value而已,print的時候也是這樣的形式
reduce_max的例子里,from_dense在構(gòu)造SparseTensor的時候是過濾了0值的,所以reduce_max出來才是負數(shù),如果用其他方法使構(gòu)造的SparseTensor有顯式的0,那么max值依舊是0
沒想到是在random這一節(jié)里明確的指出了Variable是thread safe的
從描述來看,Generator內(nèi)部可以看作存了seed-state的Variable,值的存放位置受tf.device限制
global_generator可以看做是一個全局的種子,比如之前那樣直接跑tf.random.normal的時候用的就是它。這個東西會在第一次被需要的時候聲明,所以外側(cè)的device scope應(yīng)該會影響到它
如果global_generator是在聲明計算圖的時候被生成的,而在還未運行的時候調(diào)用set_global_generator則會出現(xiàn)bug,因為計算圖里指向的老Variable被析構(gòu)了
通過split生成的generator保證了是互相獨立的,推測實現(xiàn)上是新生成了幾個種子構(gòu)造出了新generator,因為split之后,舊generator的狀態(tài)會變。split可以用在聲明計算圖的時候,保證種子是存在當(dāng)前device上的,避免重復(fù)拷貝。這里也可以新聲明,文檔里說風(fēng)險在于可能并不是獨立的,但我估計寫from_seed(global_generator.normal([]))就行了
generator作為輸入的時候,盡管他可以被看做是Variable,但依舊會觸發(fā)多態(tài),因為理論上隨機數(shù)是可以控制圖的形狀的,所以即使是同一個generator通過get_concrete_function拿到的計算圖依舊不能跑
從代碼來看,一個checkpoint似乎只能有一個generator
generator的IO有個diverge的問題,因為checkpoint的存儲是分布式的,存下的這多份checkpoint有的時候合起來才代表一個模型,而如果generator出現(xiàn)diverge的話,在cp.load的時候,如果concurrency不同,誰用哪個種子就不大好定義了(文檔說只會采用第一個讀到的)。當(dāng)然我覺得種子這東西大部分情況下沒必要存進去的