【TF/Guide筆記】 01. Tensor
不知道官網(wǎng)文檔犯的什么病,上篇?jiǎng)偢锌麄冋嬲疹櫾?,第二天就打不開了,無奈之下還是用notebook看的文檔源碼。
tensor類型兼容了絕大多數(shù)numpy和python語法,有人力就是好
A * B是element_wise_mul,A @ B是matmul,不知道是從哪來的語法
shape為空()時(shí)代表標(biāo)量,然后是vector、tensor etc
支持多維度下標(biāo)訪問,使用單下標(biāo)而不是slice的時(shí)候會(huì)使結(jié)果降維
文檔只在reshape的地方明確說了內(nèi)存會(huì)共享(這個(gè)好理解),但是沒有說slice的時(shí)候是怎么管理內(nèi)存的。由于tensor與py變量一樣,遵循絕對(duì)無法修改的原則,所以理論上無法驗(yàn)證到底是怎樣。從設(shè)計(jì)理念出發(fā)推測(cè)的話,既然tensor內(nèi)部的內(nèi)存是連續(xù)的,那么如果是按列slice,就一定要觸發(fā)拷貝,如果slice出來的結(jié)果是連續(xù)的,也許做了專門的優(yōu)化不需要觸發(fā)拷貝的,但是目前不看cc文件的話沒法確認(rèn)
關(guān)于broadcast,可以理解為先把低維tensor的最高維用1補(bǔ)齊,然后所有長(zhǎng)度1的維度可以直接復(fù)制,向不為1的對(duì)其,這里只考慮1而不考慮整除,也就是1能擴(kuò)展成6但2不能擴(kuò)展成6。的確我以前也覺得2擴(kuò)展成6的情況似乎沒什么意義,而且tf里除非顯示調(diào)用broadcast_to這個(gè)op,不然broadcast的這個(gè)過程是不消耗臨時(shí)內(nèi)存的,并不是把低維的先復(fù)制出來再繼續(xù)后面的操作,也許是靠1的特性來實(shí)現(xiàn)的
Ragged?Tensor搞不明白有什么用,試了一下這東西甚至不能下標(biāo)訪問,也就是說他內(nèi)部甚至沒有記錄不確定維里的每個(gè)長(zhǎng)度,那二維Ragged不就跟vector是一個(gè)意思了嗎,搞不懂
dtype是string的時(shí)候,使用的是tf.string,tensor依舊是Tensor而不是RaggedTensor,也許特化了tf.string的模板,或者tf.string本身有統(tǒng)一的連續(xù)分配內(nèi)存的機(jī)制,來讓這個(gè)tensor實(shí)例占用的內(nèi)存是連續(xù)的,但讓我設(shè)計(jì)的話感覺直接甩在外面就可以了,畢竟真的到了跑訓(xùn)練的時(shí)候,哪有直接上字符的呢。也許單獨(dú)做了個(gè)tf.string是為了兼容py和cc,也許真的在里面對(duì)內(nèi)存做了優(yōu)化,畢竟他們?nèi)肆芏?br>