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

 

posted @ 2023-09-07 10:10  思念殇千寻  阅读(120)  评论(0编辑  收藏  举报