V1

2022/01/05阅读:135主题:默认主题

einops库中的rearrange,reduce,repeat介绍

用法介绍

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

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

einopsrearrangerepeatreduce的函数细节介绍如下所示

def rearrange(inputs, pattern, **axes_lengths) transform_inputs

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

def repeat(inputs, pattern, **axes_lengths) transform_inputs

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

def reduce(inputs, pattern, reduction, **axes_lengths) transform_inputs

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

代码示例

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

# suppose we have a set of 32 images in "h w c" format (height-width-channel)
>>> images = [np.random.randn(30403for _ in range(32)]
# stack along first (batch) axis, output is a single array
>>> rearrange(images, 'b h w c -> b h w c').shape
(3230403)
# concatenate images along height (vertical axis), 960 = 32 * 30
>>> rearrange(images, 'b h w c -> (b h) w c').shape
(960403)
# concatenated images along horizontal axis, 1280 = 32 * 40
>>> rearrange(images, 'b h w c -> h (b w) c').shape
(3012803)
# reordered axes to "b c h w" format for deep learning
>>> rearrange(images, 'b h w c -> b c h w').shape
(3233040)
# flattened each image into a vector, 3600 = 30 * 40 * 3
>>> rearrange(images, 'b h w c -> b (c h w)').shape
(323600)
# split each image into 4 smaller (top-left, top-right, bottom-left, bottom-right), 128 = 32 * 2 * 2
>>> rearrange(images, 'b (h1 h) (w1 w) c -> (b h1 w1) h w c', h1=2, w1=2).shape
(12815203)
# space-to-depth operation
>>> rearrange(images, 'b (h h1) (w w1) c -> b h w (c h1 w1)', h1=2, w1=2).shape
(32152012)

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

# a grayscale image (of shape height x width)
>>> image = np.random.randn(3040)
# change it to RGB format by repeating in each channel
>>> repeat(image, 'h w -> h w c', c=3).shape
(30403)
# repeat image 2 times along height (vertical axis)
>>> repeat(image, 'h w -> (repeat h) w', repeat=2).shape
(6040)
# repeat image 2 time along height and 3 times along width
>>> repeat(image, 'h w -> h (repeat w)', repeat=3).shape
(30120)
# convert each pixel to a small square 2x2. Upsample image by 2x
>>> repeat(image, 'h w -> (h h2) (w w2)', h2=2, w2=2).shape
(6080)
# pixelate image first by downsampling by 2x, then upsampling
>>> 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
(3040)

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

>>> x = np.random.randn(1003264)
# perform max-reduction on the first axis
>>> y = reduce(x, 't b c -> b c''max')
# same as previous, but with clearer axes meaning
>>> y = reduce(x, 'time batch channel -> batch channel''max')
>>> x = np.random.randn(10203040)
# 2d max-pooling with kernel size = 2 * 2 for image processing
>>> y1 = reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1''max', h2=2, w2=2)
# if one wants to go back to the original height and width, depth-to-space trick can be applied
>>> 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')
# Adaptive 2d max-pooling to 3 * 4 grid
>>> reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1''max', h1=3, w1=4).shape
(102034)
# Global average pooling
>>> reduce(x, 'b c h w -> b c''mean').shape
(1020)
# Subtracting mean over batch for each channel
>>> y = x - reduce(x, 'b c h w -> () c () ()''mean')
# Subtracting per-image mean for each channel
>>> y = x - reduce(x, 'b c h w -> b c () ()''mean')

分类:

人工智能

标签:

人工智能

作者介绍

V1