Einops矩阵操作语法随记
参考资料:
https://einops.rocks/1-einops-basics/
这篇随笔主要记录使用Einops这个矩阵操作的库的时候发现的,值得记录的高频或者重要的操作:
既然网上的教程已经很详尽了,为什么还要这样做?因为遇见一次的情况很有可能下次还会遇到,主要是写给自己看,方便以后查阅。
1. rearrange / unsqueeze
添加新维度
x = rearrange(ims, 'b h w c -> b 1 h w 1 c') # functionality of numpy.expand_dims print(x.shape) print(rearrange(x, 'b 1 h w 1 c -> b h w c').shape) # functionality of numpy.squeeze
2. repeat / expand
元素/维度的重复。读者可能会疑惑,为什么einops中的repeat和pytorch中的expand而不是repeat相对应。根据https://github.com/arogozhnikov/einops/issues/202这个帖子的内容,einops把repeat和pytorch中的expand对应实际上是社区的需求。
这里解释一下pytorch中的expand和repeat,expand仅仅创建一个view,也就是说创建出的那个tensor和原始的Tensor是共享内存的,你拿到的仅仅是一个“视图”(View)。而torch中的repeat操作则是实打实的进行复制。视图可以防止显存或者内存的浪费,但是如果你希望这些参数是可训练的参数的话还是老老实实地进行repeat吧。
# repeat along a new axis. New axis can be placed anywhere repeat(ims[0], 'h w c -> h new_axis w c', new_axis=5).shape