【TF/Guide笔记】 01. Tensor
不知道官网文档犯的什么病,上篇刚感慨他们真照顾咱,第二天就打不开了,无奈之下还是用notebook看的文档源码。
tensor类型兼容了绝大多数numpy和python语法,有人力就是好
A * B是element_wise_mul,A @ B是matmul,不知道是从哪来的语法
shape为空()时代表标量,然后是vector、tensor etc
支持多维度下标访问,使用单下标而不是slice的时候会使结果降维
文档只在reshape的地方明确说了内存会共享(这个好理解),但是没有说slice的时候是怎么管理内存的。由于tensor与py变量一样,遵循绝对无法修改的原则,所以理论上无法验证到底是怎样。从设计理念出发推测的话,既然tensor内部的内存是连续的,那么如果是按列slice,就一定要触发拷贝,如果slice出来的结果是连续的,也许做了专门的优化不需要触发拷贝的,但是目前不看cc文件的话没法确认
关于broadcast,可以理解为先把低维tensor的最高维用1补齐,然后所有长度1的维度可以直接复制,向不为1的对其,这里只考虑1而不考虑整除,也就是1能扩展成6但2不能扩展成6。的确我以前也觉得2扩展成6的情况似乎没什么意义,而且tf里除非显示调用broadcast_to这个op,不然broadcast的这个过程是不消耗临时内存的,并不是把低维的先复制出来再继续后面的操作,也许是靠1的特性来实现的
Ragged Tensor搞不明白有什么用,试了一下这东西甚至不能下标访问,也就是说他内部甚至没有记录不确定维里的每个长度,那二维Ragged不就跟vector是一个意思了吗,搞不懂
dtype是string的时候,使用的是tf.string,tensor依旧是Tensor而不是RaggedTensor,也许特化了tf.string的模板,或者tf.string本身有统一的连续分配内存的机制,来让这个tensor实例占用的内存是连续的,但让我设计的话感觉直接甩在外面就可以了,毕竟真的到了跑训练的时候,哪有直接上字符的呢。也许单独做了个tf.string是为了兼容py和cc,也许真的在里面对内存做了优化,毕竟他们人力很多