einops库中rearrange,reduce和repeat的介绍

用法介绍

einops是一个简洁优雅操作张量的库,并且支持对numpy,pytorch,tensorflow中的张量进行操作,该库最大的优点是函数的使用逻辑清晰明了,其中中常用的三个函数分别是rearrange,repeat,reduce。

  • rearrange: 用于对张量的维度进行重新变换排序,可用于替换pytorch中的reshape,view,transpose和permute等操作
  • repeat: 用于对张量的某一个维度进行复制,可用于替换pytorch中的repeat
  • reduce: 类似于tensorflow中的reduce操作,可以用于求平均值,最大最小值的同时压缩张量维度

einops中rearrange,repeat,reduce的函数细节介绍如下所示

def rearrange(inputs, pattern, **axes_lengths)⟶ \longrightarrow ⟶ transform_inputs

  • inputs (tensor): 表示输入的张量
  • pattern (str): 表示张量维度变换的映射关系
  • axes_lengths**: 表示按照指定的规格形式进行变换

def repeat(inputs, pattern, **axes_lengths)⟶ \longrightarrow ⟶ transform_inputs

  • inputs (tensor): 表示输入的张量
  • pattern (str): 表示张量按照某个维度复制的映射关系
  • axes_lengths**: 表示按照指定的规格形式进行复制

def reduce(inputs, pattern, reduction, **axes_lengths)⟶ \longrightarrow ⟶ transform_inputs

  • inputs (tensor): 表示输入的张量
  • pattern (str): 表示张量执行某种运算做操作后维度变换的映射关系
  • reduction (str): 表示运算操作的类型,分别有’max’,’min’,’sum’,’mean’,’prod’
  • axes_lengths**: 表示按照指定的规格形式进行运算操作

代码示例

einops库中rearrange函数的代码示例如下所示


>>> images = [np.random.randn(30, 40, 3) for _ in range(32)]

>>> rearrange(images, 'b h w c -> b h w c').shape
(32, 30, 40, 3)

>>> rearrange(images, 'b h w c -> (b h) w c').shape
(960, 40, 3)

>>> rearrange(images, 'b h w c -> h (b w) c').shape
(30, 1280, 3)

>>> rearrange(images, 'b h w c -> b c h w').shape
(32, 3, 30, 40)

>>> rearrange(images, 'b h w c -> b (c h w)').shape
(32, 3600)

>>> rearrange(images, 'b (h1 h) (w1 w) c -> (b h1 w1) h w c', h1=2, w1=2).shape
(128, 15, 20, 3)

>>> rearrange(images, 'b (h h1) (w w1) c -> b h w (c h1 w1)', h1=2, w1=2).shape
(32, 15, 20, 12)

einops库中repeat函数的代码示例如下所示


>>> image = np.random.randn(30, 40)

>>> repeat(image, 'h w -> h w c', c=3).shape
(30, 40, 3)

>>> repeat(image, 'h w -> (repeat h) w', repeat=2).shape
(60, 40)

>>> repeat(image, 'h w -> h (repeat w)', repeat=3).shape
(30, 120)

>>> repeat(image, 'h w -> (h h2) (w w2)', h2=2, w2=2).shape
(60, 80)

>>> downsampled = reduce(image, '(h h2) (w w2) -> h w', 'mean', h2=2, w2=2)
>>> repeat(downsampled, 'h w -> (h h2) (w w2)', h2=2, w2=2).shape
(30, 40)

einops库中reduce函数的代码示例如下所示

>>> x = np.random.randn(100, 32, 64)

>>> y = reduce(x, 't b c -> b c', 'max')

>>> y = reduce(x, 'time batch channel -> batch channel', 'max')
>>> x = np.random.randn(10, 20, 30, 40)

>>> y1 = reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1', 'max', h2=2, w2=2)

>>> y2 = rearrange(y1, 'b (c h2 w2) h1 w1 -> b c (h1 h2) (w1 w2)', h2=2, w2=2)
>>> assert parse_shape(x, 'b _ h w') == parse_shape(y2, 'b _ h w')

>>> reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1', 'max', h1=3, w1=4).shape
(10, 20, 3, 4)

>>> reduce(x, 'b c h w -> b c', 'mean').shape
(10, 20)

>>> y = x - reduce(x, 'b c h w -> () c () ()', 'mean')

>>> y = x - reduce(x, 'b c h w -> b c () ()', 'mean')

Original: https://blog.csdn.net/qq_38406029/article/details/122322166
Author: 鬼道2022
Title: einops库中rearrange,reduce和repeat的介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/496346/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球