# ravel 和 flatten 的区别

np.ravel 返回原数组的一个 view,而 flatten 返回一个副本

# T 转置的内存规则

对于一个 ndarray 数组 A,A.T 是一个新的对象,即 id (A) 和 id (A.T) 不相等

但是二者共享底层的数据存储

# 数组顺序

  • K:内存顺序
  • C:行顺序
  • F:列顺序

# metaclass 元类

创建普通类的 “创世神”,普通类是元类的一个 instance

记住 super ().__new__的参数需要 cls,super ().__init__则无需显式传入 self

自定义元类 mymeta 继承 type

class mything (base,metaclass=mymeta),其中 mymeta 是我们自己定义的元类

# 切片

切片获得原数组的 view,修改反馈到原数组

0 维数组使用 [...] 来切片

... 即许多个 :

# 自定义 np.ndarray 类

先 new,new 中有 view (cls) 所以会调用 finalize,最后创建好后会 init

一般不写 init,直接在 new 中 np.asarray,view,属性赋值

当进行切片 or 创建视图时,会调用__array_finalize__方法

finalize 中,obj 是原数组,self 是新视图

# 可迭代对象、迭代器、生成器

iterable:实现了 __iter__() 方法返回一个 迭代器

Iterator:实现了两个方法:

  • __iter__() 返回自身;
  • __next__() 返回下一个值,没值了就抛出 StopIteration

只能往前走,不能回退;

数据不会一次性全部加载,节省内存。

Generator:一种更方便写法的 迭代器

yield 函数,或者如 (i for i in range(3)) 的表达式

# BatchNorm & LayerNorm

batchnorm 对一个 batch 中所有 channel 操作,alpha、beta 形状就是 [C]

layernorm 对每个 batch 的每个 seq(字符)进行操作

且 layernorm 的 alpha、beta 形状为 [D],因为 D 维向量的每个维度代表不同的 "语义特征"。

  • 第 0 维可能编码 "主语信息"
  • 第 1 维可能编码 "时态信息"
  • ... 以此类推

不同特征维度的尺度可能不同,所以每个特征维度需要独立的 alpha 和 β 来调整。不同样本、不同序列位置的同一特征维度,语义含义相同,所以共享同一个 alpha 和 β


对于 BatchNorm 和 LayerNorm 它们区分训练状态和推理状态吗?

  • BN 区分:BN 训练时通过指数平滑记录均值和方差,推理时直接用训练过程中最后的均值和方差结果
  • LN 不区分:LN 对每一个 token 计算 feature 均值和方差,不依赖历史统计值
总访问量:加载中...更新于

谢谢你请我喝[茶]!(๑OvO๑)♪

柳小寒寒子 微信支付

微信支付