XTensor 经典神经网络模块

以下的经典神经网络模块均支持XTensor自动反向传播计算。当您运行前传函数以后, 需要使用在 with pyvqnet.xtensor.autograd.tape() 的范围内定义前向计算。这样就可以将需要自动微分的算子纳入计算图中。

Warning

XTensor相关功能属于实验功能,当前只支持经典神经网络计算,与前述介绍的基于QTensor的接口不能混用。 如需要训练量子机器学习模型,请使用QTensor下相关接口。

接着执行反向函数就获取 requires_grad == TrueXTensor 的计算梯度。 一个卷积层的简单例子如下:

from pyvqnet.xtensor import arange
from pyvqnet import kfloat32
from pyvqnet.xtensor import Conv2D,autograd

# an image feed into two dimension convolution layer
b = 2        # batch size
ic = 2       # input channels
oc = 2      # output channels
hw = 4      # input width and heights

# two dimension convolution layer
test_conv = Conv2D(ic,oc,(2,2),(2,2),"same")

# input of shape [b,ic,hw,hw]
x0 = arange(1,b*ic*hw*hw+1,dtype=kfloat32).reshape([b,ic,hw,hw])
x0.requires_grad = True
with autograd.tape():
#forward function
    x = test_conv(x0)

#backward function with autograd
x.backward()
print(x0.grad)
"""
[[[[-0.0194679  0.1530238 -0.0194679  0.1530238]
[ 0.2553246  0.1616782  0.2553246  0.1616782]
[-0.0194679  0.1530238 -0.0194679  0.1530238]
[ 0.2553246  0.1616782  0.2553246  0.1616782]]

[[ 0.0285322  0.1099411  0.0285322  0.1099411]
[ 0.3087625 -0.0679072  0.3087625 -0.0679072]
[ 0.0285322  0.1099411  0.0285322  0.1099411]
[ 0.3087625 -0.0679072  0.3087625 -0.0679072]]]


[[[-0.0194679  0.1530238 -0.0194679  0.1530238]
[ 0.2553246  0.1616782  0.2553246  0.1616782]
[-0.0194679  0.1530238 -0.0194679  0.1530238]
[ 0.2553246  0.1616782  0.2553246  0.1616782]]

[[ 0.0285322  0.1099411  0.0285322  0.1099411]
[ 0.3087625 -0.0679072  0.3087625 -0.0679072]
[ 0.0285322  0.1099411  0.0285322  0.1099411]
[ 0.3087625 -0.0679072  0.3087625 -0.0679072]]]]
<XTensor 2x2x4x4 cpu(0) kfloat32>
"""

Module类

abstract calculation module

Module

class pyvqnet.xtensor.module.Module

所有神经网络模块的基类,包括量子模块或经典模块。您的模型也应该是此类的子类,用于 autograd 计算。 模块还可以包含其他Module类,允许将它们嵌套在树状结构。 您可以将子模块分配为常规属性:

class Model(Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = pyvqnet.xtensor.Conv2D(1, 20, (5,5))
        self.conv2 = pyvqnet.xtensor.Conv2D(20, 20, (5,5))
    def forward(self, x):
        x = pyvqnet.xtensor.relu(self.conv1(x))
        return pyvqnet.xtensor.relu(self.conv2(x))

以这种方式分配的子模块将被注册。

forward

pyvqnet.xtensor.module.Module.forward(x, *args, **kwargs)

Module类抽象前向计算函数

Parameters:
  • x – 输入QTensor。

  • *args – 非关键字可变参数。

  • **kwargs – 关键字可变参数。

Returns:

模型输出。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
import pyvqnet as vq
from pyvqnet.xtensor import Conv2D
b = 2
ic = 3
oc = 2
test_conv = Conv2D(ic, oc, (3, 3), (2, 2), "same")
x0 = XTensor(np.arange(1, b * ic * 5 * 5 + 1).reshape([b, ic, 5, 5]),
            dtype=vq.kfloat32)
x = test_conv.forward(x0)
print(x)

# [
# [[[4.3995643, 3.9317808, -2.0707254],
#  [20.1951981, 21.6946659, 14.2591858],
#  [38.4702759, 31.9730244, 24.5977650]],
# [[-17.0607567, -31.5377998, -7.5618000],
#  [-22.5664024, -40.3876266, -15.1564388],
#  [-3.1080279, -18.5986233, -8.0648050]]],
# [[[6.6493244, -13.4840755, -20.2554188],
#  [54.4235802, 34.4462433, 26.8171902],
#  [90.2827682, 62.9092331, 51.6892929]],
# [[-22.3385429, -45.2448578, 5.7101378],
#  [-32.9464149, -60.9557228, -10.4994345],
#  [5.9029331, -20.5480480, -0.9379558]]]
# ]

state_dict

pyvqnet.xtensor.module.Module.state_dict(destination=None, prefix='')

返回包含模块整个状态的字典:包括参数和缓存值。 键是对应的参数和缓存值名称。

Parameters:
  • destination – 返回保存模型内部模块,参数的字典。

  • prefix – 使用的参数和缓存值的命名前缀。

Returns:

包含模块整个状态的字典。

Example:

from pyvqnet.xtensor import Conv2D
test_conv = Conv2D(2,3,(3,3),(2,2),"same")
print(test_conv.state_dict().keys())
#odict_keys(['weights', 'bias'])

toGPU

pyvqnet.xtensor.module.Module.toGPU(device: int = DEV_GPU_0)

将模块和其子模块的参数和缓冲数据移动到指定的 GPU 设备中。

device 指定存储其内部数据的设备。 当device >= DEV_GPU_0时,数据存储在GPU上。如果您的计算机有多个GPU, 则可以指定不同的设备来存储数据。例如device = DEV_GPU_1 , DEV_GPU_2, DEV_GPU_3, … 表示存储在不同序列号的GPU上。

Note

Module在不同GPU上无法进行计算。 如果您尝试在 ID 超过验证 GPU 最大数量的 GPU 上创建 QTensor,将引发 Cuda 错误。

Parameters:

device – 当前保存QTensor的设备,默认=DEV_GPU_0。device= pyvqnet.DEV_GPU_0,存储在第一个 GPU 中,devcie = DEV_GPU_1,存储在第二个 GPU 中,依此类推

Returns:

Module 移动到 GPU 设备。

Examples:

from pyvqnet.xtensor import ConvT2D
test_conv = ConvT2D(3, 2, (4,4), (2, 2), "same")
test_conv = test_conv.toGPU()
print(test_conv.backend)
#1000

toCPU

pyvqnet.xtensor.module.Module.toCPU()

将模块和其子模块的参数和缓冲数据移动到特定的 CPU 设备中。

Returns:

Module 移动到 CPU 设备。

Examples:

from pyvqnet.xtensor import ConvT2D
test_conv = ConvT2D(3, 2, (4,4), (2, 2), "same")
test_conv = test_conv.toCPU()
print(test_conv.backend)
#0

模型参数保存和载入

以下接口可以进行模型参数保存到文件中,或从文件中读取参数文件。但请注意,文件中不保存模型结构,需要用户手动构建模型结构。

save_parameters

pyvqnet.xtensor.storage.save_parameters(obj, f)

保存模型参数的字典到一个文件。

Parameters:
  • obj – 需要保存的字典。

  • f – 保存参数的文件名。

Returns:

无。

Example:

from pyvqnet.xtensor import Module,Conv2D,save_parameters

class Net(Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = Conv2D(input_channels=1, output_channels=6, kernel_size=(5, 5), stride=(1, 1), padding="valid")

    def forward(self, x):
        return super().forward(x)

model = Net()
save_parameters(model.state_dict(),"tmp.model")

load_parameters

pyvqnet.xtensor.storage.load_parameters(f)

从文件中载入参数到一个字典中。

Parameters:

f – 保存参数的文件名。

Returns:

保存参数的字典。

Example:

from pyvqnet.xtensor import Module, Conv2D,load_parameters,save_parameters

class Net(Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = Conv2D(input_channels=1,
                            output_channels=6,
                            kernel_size=(5, 5),
                            stride=(1, 1),
                            padding="valid")

    def forward(self, x):
        return super().forward(x)

model = Net()
model1 = Net()  # another Module object
save_parameters(model.state_dict(), "tmp.model")
model_para = load_parameters("tmp.model")
model1.load_state_dict(model_para)

ModuleList

class pyvqnet.xtensor.module.ModuleList([pyvqnet.xtensor.module.Module])

将子模块保存在列表中。 ModuleList 可以像普通的 Python 列表一样被索引, 它包含的Module的内部参数等可以被保存起来。

Parameters:

modules – nn.Modules 列表

Returns:

一个模块列表

Example:

from pyvqnet.xtensor import Module, Linear, ModuleList

class M(Module):
    def __init__(self):
        super(M, self).__init__()
        self.dense = ModuleList([Linear(4, 2), Linear(4, 2)])

    def forward(self, x, *args, **kwargs):
        y = self.dense[0](x) + self.dense[1](x)
        return y

mm = M()

print(mm.state_dict())
"""
OrderedDict([('dense.0.weights',
[[ 0.8224208  0.3421015  0.2118234  0.1082053]
[-0.8264768  1.1017226 -0.3860411 -1.6656817]]
<Parameter 2x4 cpu(0) kfloat32>), ('dense.0.bias',
[0.4125615 0.4414732]
<Parameter 2 cpu(0) kfloat32>), ('dense.1.weights',
[[ 1.8939902  0.8871605 -0.3880418 -0.4815852]
[-0.0956827  0.2667428  0.2900301  0.4039476]]
<Parameter 2x4 cpu(0) kfloat32>), ('dense.1.bias',
[-0.0544764  0.0289595]
<Parameter 2 cpu(0) kfloat32>)])
"""

经典神经网络层

以下实现了一些经典神经网络层:卷积,转置卷积,池化,归一化,循环神经网络等。

Conv1D

class pyvqnet.xtensor.Conv1D(input_channels: int, output_channels: int, kernel_size: int, stride: int = 1, padding='valid', use_bias: bool = True, kernel_initializer=None, bias_initializer=None, dilation_rate: int = 1, group: int = 1, dtype=None, name='')

在输入上进行一维卷积运算。 Conv1D模块的输入具有形状(batch_size、input_channels、in_height)。

Parameters:
  • input_channelsint - 输入数据的通道数。

  • output_channelsint - 输出数据的通道数。

  • kernel_sizeint - 卷积核的尺寸. 卷积核形状 = [output_channels,input_channels/group,kernel_size,1]。

  • strideint - 步长, 默认为1。

  • paddingstr|int - 填充选项, 它可以是一个字符串 {‘valid’, ‘same’} 或一个整数,给出应用在输入上的填充量。 默认 “valid”。

  • use_biasbool - 是否使用偏置项, 默认使用。

  • kernel_initializercallable - 卷积核初始化方法。默认为空,使用kaiming_uniform。

  • bias_initializercallable - 偏置初始化方法。默认为空,使用kaiming_uniform。

  • dilation_rateint - 空洞大小,defaults: 1。

  • groupint - 分组卷积的分组数. Default: 1。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 模块的名字,default:””。

Returns:

一维卷积实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的out_height 为 = ceil(in_height / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import Conv1D
import pyvqnet
b= 2
ic =3
oc = 2
test_conv = Conv1D(ic,oc,3,2,"same")
x0 = XTensor(np.arange(1,b*ic*5*5 +1).reshape([b,ic,25]),dtype=pyvqnet.kfloat32)
x = test_conv.forward(x0)
print(x)
"""
[[[ 17.637825   26.841843   28.811993   30.782139   32.752293
    34.72244    36.69259    38.66274    40.63289    42.603035
    44.57319    46.543335   36.481537 ]
6274   106.63289                            707144  -4.07236
108.60304   110.57319   112.54334   114.5789382  -3.58058381349   116.48363
118.45379   120.423935   85.522644 ]
[ 34.14579    -0.6791078  -0.5807535  -0.46274   106.63289823973  -0.384041                           1349   116.48363
    -0.2856848  -0.1873342  -0.088978    0.0093744   0.107725                           823973  -0.384041
    0.2060831   0.3044413  -1.8352301]]]   093744   0.107725
<XTensor 2x2x13 cpu(0) kfloat32>
"""

Conv2D

class pyvqnet.xtensor.Conv2D(input_channels: int, output_channels: int, kernel_size: tuple, stride: tuple = (1, 1), padding='valid', use_bias=True, kernel_initializer=None, bias_initializer=None, dilation_rate: int = 1, group: int = 1, dtype=None, name='')

在输入上进行二维卷积运算。 Conv2D模块的输入具有形状(batch_size, input_channels, height, width)。

Parameters:
  • input_channelsint - 输入数据的通道数。

  • output_channelsint - 输出数据的通道数。

  • kernel_sizetuple|list - 卷积核的尺寸. 卷积核形状 = [output_channels,input_channels/group,kernel_size,kernel_size]。

  • stridetuple|list - 步长, 默认为 (1, 1)|[1,1]。

  • paddingstr|tuple - 填充选项, 它可以是一个字符串 {‘valid’, ‘same’} 或一个整数元组,给出在两边应用的隐式填充量。 默认 “valid”。

  • use_biasbool - 是否使用偏置项, 默认使用。

  • kernel_initializercallable - 卷积核初始化方法。默认为空,使用kaiming_uniform。

  • bias_initializercallable - 偏置初始化方法。默认为空,使用kaiming_uniform。

  • dilation_rateint - 空洞大小,defaults: 1。

  • groupint - 分组卷积的分组数. Default: 1。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 模块的名字,default:””。

Returns:

二维卷积实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的height 为 = ceil(height / stride), 输出的width 为 = ceil(width / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import Conv2D
import pyvqnet
b= 2
ic =3
oc = 2
test_conv = Conv2D(ic,oc,(3,3),(2,2),"same")
x0 = XTensor(np.arange(1,b*ic*5*5+1).reshape([b,ic,5,5]),dtype=pyvqnet.kfloat32)
x = test_conv.forward(x0)
print(x)
"""
[[[[13.091256  16.252321   6.009256 ]
[25.834864  29.57479   10.406249 ]
[17.177385  27.90065   11.024535 ]]

[[ 9.705042  11.656831   8.584356 ]
[23.186415  29.151287  17.489706 ]
[23.500261  23.620876  15.1604395]]]


[[[55.944958  66.7173    31.89055  ]
[86.231346  99.19392   44.14594  ]
[53.740646  83.22319   33.986828 ]]

[[44.75199   41.64939   35.985905 ]
[54.717422  73.95048   48.546726 ]
[33.874504  40.06319   31.02438  ]]]]
<XTensor 2x2x3x3 cpu(0) kfloat32>
"""

ConvT2D

class pyvqnet.xtensor.ConvT2D(input_channels, output_channels, kernel_size, stride=[1, 1], padding='valid', use_bias='True', kernel_initializer=None, bias_initializer=None, dilation_rate: int = 1, group: int = 1, dtype=None, name='')

在输入上进行二维转置卷积运算。 Conv2D模块的输入具有形状(batch_size, input_channels, height, width)。

Parameters:
  • input_channelsint - 输入数据的通道数。

  • output_channelsint - 输出数据的通道数。

  • kernel_sizetuple|list - 卷积核的尺寸,卷积核形状 = [input_channels,output_channels/group,kernel_size,kernel_size]。

  • stridetuple|list - 步长, 默认为 (1, 1)|[1,1]。

  • paddingstr|tuple - 填充选项, 它可以是一个字符串 {‘valid’, ‘same’} 或一个整数元组,给出在两边应用的隐式填充量。 默认 “valid”。

  • use_biasbool - 是否使用偏置项, 默认使用。

  • kernel_initializercallable - 卷积核初始化方法。默认为空,使用kaiming_uniform。

  • bias_initializercallable - 偏置项初始化方法。默认为空,使用kaiming_uniform。

  • dilation_rateint - 空洞大小,defaults: 1。

  • groupint - 分组卷积的分组数. Default: 1。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 模块的名字,default:””。

Returns:

二维转置卷积实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的height 为 = ceil(height / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import ConvT2D
import pyvqnet
test_conv = ConvT2D(3, 2, (3, 3), (1, 1), "valid")
x = XTensor(np.arange(1, 1 * 3 * 5 * 5+1).reshape([1, 3, 5, 5]), dtype=pyvqnet.kfloat32)
y = test_conv.forward(x)
print(y)
"""

[[[[  5.4529057  -3.32444     9.211117    9.587392    9.963668
    4.5622444  14.397371 ]
[ 18.834743   21.769156   36.432068   37.726788   39.021515
    18.737175   16.340559 ]
[ 29.79763    39.767223   61.934864   63.825333   65.715805
    34.09302    23.981941 ]
[ 33.684406   45.685955   71.38721    73.27768    75.16815
    39.658592   27.515562 ]
[ 37.571186   51.604687   80.839554   82.730034   84.6205
    45.224167   31.049183 ]
[ 33.69648    61.94682    71.845085   73.359276   74.873474
    39.471508   10.021905 ]
[ 12.103746   23.482103   31.11521    31.710955   32.306698
    19.998552    7.940914 ]]

[[  4.769257    6.5511374   9.029368    9.207671    9.385972
    3.762906    2.1653163]
[ -8.366173    0.0307169  -0.3826299  -0.5054388  -0.6282487
    8.602992   -0.3027873]
[ -9.106487   -4.8349705   1.0091982   0.9871688   0.9651423
    12.1995535   6.483701 ]
[-11.156897   -5.4630694   0.8990631   0.8770366   0.855011
    14.13983     7.001668 ]
[-13.207303   -6.09117     0.7889295   0.7669029   0.7448754
    16.080103    7.5196342]
[-25.585697  -18.799192  -12.708595  -12.908926  -13.109252
    15.557721    7.1425896]
[ -4.400727   -4.76725     4.1210976   4.2218823   4.322665
    10.08579     9.516866 ]]]]
<XTensor 1x2x7x7 cpu(0) kfloat32>
"""

AvgPool1D

class pyvqnet.xtensor.AvgPool1D(kernel, stride, padding='valid', name='')

对一维输入进行平均池化。输入具有形状(batch_size, input_channels, in_height)。

Parameters:
  • kernel – 平均池化的窗口大小。

  • strides – 窗口移动的步长。

  • padding – 填充选项, “valid” or “same” 或者整数指定填充长度。 默认 “valid”。

  • name – 模块的名字,default:””。

Returns:

一维平均池化层实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的out_height 为 = ceil(in_height / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import AvgPool1D
test_mp = AvgPool1D(3,2,"same")
x= XTensor(np.array([0, 1, 0, 4, 5,
                            2, 3, 2, 1, 3,
                            4, 4, 0, 4, 3,
                            2, 5, 2, 6, 4,
                            1, 0, 0, 5, 7],dtype=float).reshape([1,5,5]),requires_grad=True)

y= test_mp.forward(x)
print(y)
# [
# [[0.3333333, 1.6666666, 3.],
#  [1.6666666, 2., 1.3333334],
#  [2.6666667, 2.6666667, 2.3333333],
#  [2.3333333, 4.3333335, 3.3333333],
#  [0.3333333, 1.6666666, 4.]]
# ]

MaxPool1D

class pyvqnet.xtensor.MaxPool1D(kernel, stride, padding='valid', name='')

对一维输入进行最大池化。输入具有形状(batch_size, input_channels, in_height)。

Parameters:
  • kernel – 最大池化的窗口大小。

  • strides – 窗口移动的步长。

  • padding – 填充选项, “valid” or “same” 或者整数指定填充长度。 默认 “valid”。

  • name – 命名,默认为””。

Returns:

一维最大池化层实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的out_height 为 = ceil(in_height / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import MaxPool1D
test_mp = MaxPool1D(3,2,"same")
x= XTensor(np.array([0, 1, 0, 4, 5,
                            2, 3, 2, 1, 3,
                            4, 4, 0, 4, 3,
                            2, 5, 2, 6, 4,
                            1, 0, 0, 5, 7],dtype=float).reshape([1,5,5]),requires_grad=True)

y= test_mp.forward(x)
print(y)
#[[[1. 4. 5.]
#   [3. 3. 3.]
#   [4. 4. 4.]
#   [5. 6. 6.]
#   [1. 5. 7.]]]

AvgPool2D

class pyvqnet.xtensor.AvgPool2D(kernel, stride, padding='valid', name='')

对二维输入进行平均池化。输入具有形状(batch_size, input_channels, height, width)。

Parameters:
  • kernel – 平均池化的窗口大小。

  • strides – 窗口移动的步长。

  • padding – 填充选项, “valid” or “same” 或包含2个整数的元组,整数为两个维度上的填充长度。 默认 “valid”。

  • name – 命名,默认为””。

Returns:

二维平均池化层实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的height 为 = ceil(height / stride), 输出的width 为 = ceil(width / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import AvgPool2D
test_mp = AvgPool2D((2,2),(2,2),"valid")
x= XTensor(np.array([0, 1, 0, 4, 5,
                            2, 3, 2, 1, 3,
                            4, 4, 0, 4, 3,
                            2, 5, 2, 6, 4,
                            1, 0, 0, 5, 7],dtype=float).reshape([1,1,5,5]),requires_grad=True)

y= test_mp.forward(x)
print(y)
#[[[[1.5  1.75]
#    [3.75 3.  ]]]]

MaxPool2D

class pyvqnet.xtensor.MaxPool2D(kernel, stride, padding='valid', name='')

对二维输入进行最大池化。输入具有形状(batch_size, input_channels, height, width)。

Parameters:
  • kernel – 最大池化的窗口大小。

  • strides – 窗口移动的步长。

  • padding – 填充选项, “valid” or “same” 或包含2个整数的元组,整数为两个维度上的填充长度。 默认 “valid”。

  • name – 命名,默认为””。

Returns:

二维最大池化层实例。

Note

padding='valid' 不进行填充。

padding='same' 补零填充输入,输出的height 为 = ceil(height / stride), 输出的width 为 = ceil(width / stride)。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import MaxPool2D
test_mp = MaxPool2D((2,2),(2,2),"valid")
x= XTensor(np.array([0, 1, 0, 4, 5,
                            2, 3, 2, 1, 3,
                            4, 4, 0, 4, 3,
                            2, 5, 2, 6, 4,
                            1, 0, 0, 5, 7],dtype=float).reshape([1,1,5,5]),requires_grad=True)

y= test_mp.forward(x)
print(y)
# [[[[3. 4.]
#    [5. 6.]]]]

Embedding

class pyvqnet.xtensor.Embedding(num_embeddings, embedding_dim, weight_initializer=xavier_normal, dtype=None, name: str = '')

该模块通常用于存储词嵌入并使用索引检索它们。模块的输入是索引列表,输出是对应的词嵌入。

Parameters:
  • num_embeddingsint - 嵌入字典的大小。

  • embedding_dimint - 每个嵌入向量的大小

  • weight_initializercallable - 参数初始化方式,默认正态分布。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 嵌入层的命名,默认为””。

Returns:

a Embedding 实例。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import Embedding
import pyvqnet
vlayer = Embedding(30,3)
x = XTensor(np.arange(1,25).reshape([2,3,2,2]),dtype= pyvqnet.kint64)
y = vlayer(x)
print(y)

# [
# [[[[-0.3168081, 0.0329394, -0.2934906],
#  [0.1057295, -0.2844988, -0.1687456]],
# [[-0.2382513, -0.3642318, -0.2257225],
#  [0.1563180, 0.1567665, 0.3038477]]],
# [[[-0.4131152, -0.0564500, -0.2804018],
#  [-0.2955172, -0.0009581, -0.1641144]],
# [[0.0692555, 0.1094901, 0.4099118],
#  [0.4348361, 0.0304361, -0.0061203]]],
# [[[-0.3310401, -0.1836129, 0.1098949],
#  [-0.1840732, 0.0332474, -0.0261806]],
# [[-0.1489778, 0.2519453, 0.3299376],
#  [-0.1942692, -0.1540277, -0.2335350]]]],
# [[[[-0.2620637, -0.3181309, -0.1857461],
#  [-0.0878164, -0.4180320, -0.1831555]],
# [[-0.0738970, -0.1888980, -0.3034399],
#  [0.1955448, -0.0409723, 0.3023460]]],
# [[[0.2430045, 0.0880465, 0.4309453],
#  [-0.1796514, -0.1432367, -0.1253638]],
# [[-0.5266719, 0.2386262, -0.0329155],
#  [0.1033449, -0.3442690, -0.0471130]]],
# [[[-0.5336705, -0.1939755, -0.3000667],
#  [0.0059001, 0.5567381, 0.1926173]],
# [[-0.2385869, -0.3910453, 0.2521235],
#  [-0.0246447, -0.0241158, -0.1402829]]]]
# ]

BatchNorm2d

class pyvqnet.xtensor.BatchNorm2d(channel_num: int, momentum: float = 0.1, epsilon: float = 1e-05, beta_initializer=zeros, gamma_initializer=ones, dtype=None, name='')

在 4D 输入(B、C、H、W)上应用批归一化。参照论文 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

\[y = \frac{x - \mathrm{E}[x]}{\sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta\]

其中 \(\gamma\)\(\beta\) 为待训练参数。在训练期间,该层会继续运行估计其计算的均值和方差,然后在评估期间用于归一化。平均方差均值保持默认动量 0.1。

Note

当使用 with autograd.tape() 时候,BatchNorm2d进入train模式,使用local_mean,local_variance,gamma,beta进行批归一化。

当不使用以上代码时候,BatchNorm2d使用eval模式,使用缓存的global_mean,global_variance,gamma,beta进行批归一化。

Parameters:
  • channel_numint - 输入通道数。

  • momentumfloat - 计算指数加权平均时的动量,默认为 0.1。

  • beta_initializercallable - beta的初始化方式,默认全零初始化。

  • gamma_initializercallable - gamma的的初始化方式,默认全一初始化。

  • epsilonfloat - 数值稳定参数, 默认 1e-5。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 批归一化层命名,默认为””。

Returns:

二维批归一化层实例。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import BatchNorm2d,autograd

b = 2
ic = 2
test_conv = BatchNorm2d(ic)

x = XTensor(np.arange(1, 17).reshape([b, ic, 4, 1]))
x.requires_grad = True
with autograd.tape():
    y = test_conv.forward(x)
print(y)

# [
# [[[-1.3242440],
#  [-1.0834724],
#  [-0.8427007],
#  [-0.6019291]],
# [[-1.3242440],
#  [-1.0834724],
#  [-0.8427007],
#  [-0.6019291]]],
# [[[0.6019291],
#  [0.8427007],
#  [1.0834724],
#  [1.3242440]],
# [[0.6019291],
#  [0.8427007],
#  [1.0834724],
#  [1.3242440]]]
# ]

BatchNorm1d

class pyvqnet.xtensor.BatchNorm1d(channel_num: int, momentum: float = 0.1, epsilon: float = 1e-05, beta_initializer=zeros, gamma_initializer=ones, dtype=None, name='')

在 2D 输入 (B,C) 上进行批归一化操作。 参照论文 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

\[y = \frac{x - \mathrm{E}[x]}{\sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta\]

其中 \(\gamma\)\(\beta\) 为待训练参数。在训练期间,该层会继续运行估计其计算的均值和方差,然后在评估期间用于归一化。平均方差均值保持默认动量 0.1。

Note

当使用 with autograd.tape() 时候,BatchNorm2d进入train模式,使用local_mean,local_variance,gamma,beta进行批归一化。

当不使用以上代码时候,BatchNorm2d使用eval模式,使用缓存的global_mean,global_variance,gamma,beta进行批归一化。

Parameters:
  • channel_numint - 输入通道数。

  • momentumfloat - 计算指数加权平均时的动量,默认为 0.1。

  • beta_initializercallable - beta的初始化方式,默认全零初始化。

  • gamma_initializercallable - gamma的的初始化方式,默认全一初始化。

  • epsilonfloat - 数值稳定性常数,默认为 1e-5。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 批归一化层命名,默认为””。

Returns:

一维批归一化层实例。

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import BatchNorm1d,autograd

test_conv = BatchNorm1d(4)

x = XTensor(np.arange(1, 17).reshape([4, 4]))
with autograd.tape():
    y = test_conv.forward(x)
print(y)

# [
# [-1.3416405, -1.3416405, -1.3416405, -1.3416405],
# [-0.4472135, -0.4472135, -0.4472135, -0.4472135],
# [0.4472135, 0.4472135, 0.4472135, 0.4472135],
# [1.3416405, 1.3416405, 1.3416405, 1.3416405]
# ]

LayerNormNd

class pyvqnet.xtensor.LayerNormNd(normalized_shape: list, epsilon: float = 1e-05, affine: bool = True, dtype=None, name='')

在任意输入的后D个维度上进行层归一化。具体方式如论文所述: Layer Normalization

\[y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta\]

对于像 (B,C,H,W,D) 这样的输入, norm_shape 可以是 [C,H,W,D],[H,W,D],[W,D] 或 [D] .

Parameters:
  • norm_shapefloat - 标准化形状。

  • epsilonfloat - 数值稳定性常数,默认为 1e-5。

  • affinebool - 是否使用应用仿射变换,默认为 True。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

一个 LayerNormNd 类

Example:

import numpy as np
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import LayerNormNd
ic = 4
test_conv = LayerNormNd([2,2])
x = XTensor(np.arange(1,17).reshape([2,2,2,2]))
y = test_conv.forward(x)
print(y)
# [
# [[[-1.3416355, -0.4472118],
#  [0.4472118, 1.3416355]],
# [[-1.3416355, -0.4472118],
#  [0.4472118, 1.3416355]]],
# [[[-1.3416355, -0.4472118],
#  [0.4472118, 1.3416355]],
# [[-1.3416355, -0.4472118],
#  [0.4472118, 1.3416355]]]
# ]

LayerNorm2d

class pyvqnet.xtensor.LayerNorm2d(norm_size: int, epsilon: float = 1e-05, affine: bool = True, dtype=None, name='')

在 4D 输入上进行层归一化。具体方式如论文所述: Layer Normalization

\[y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta\]

平均值和标准差是在除去第一个维度以外的剩余维度数据上计算的。对于像 (B,C,H,W) 这样的输入, norm_size 应该等于 C * H * W。

Parameters:
  • norm_sizefloat - 归一化大小,应该等于 C * H * W。

  • epsilonfloat - 数值稳定性常数,默认为 1e-5。

  • affinebool - 是否使用应用仿射变换,默认为 True。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

二维层归一化实例。

Example:

import numpy as np
import pyvqnet
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import LayerNorm2d
ic = 4
test_conv = LayerNorm2d(8)
x = XTensor(np.arange(1,17).reshape([2,2,4,1]))
y = test_conv.forward(x)
print(y)

# [
# [[[-1.5275238],
#  [-1.0910884],
#  [-0.6546531],
#  [-0.2182177]],
# [[0.2182177],
#  [0.6546531],
#  [1.0910884],
#  [1.5275238]]],
# [[[-1.5275238],
#  [-1.0910884],
#  [-0.6546531],
#  [-0.2182177]],
# [[0.2182177],
#  [0.6546531],
#  [1.0910884],
#  [1.5275238]]]
# ]

LayerNorm1d

class pyvqnet.xtensor.LayerNorm1d(norm_size: int, epsilon: float = 1e-05, affine: bool = True, dtype=None, name='')

在 2D 输入上进行层归一化。具体方式如论文所述: Layer Normalization

\[y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta\]

均值和标准差是在最后一个维度大小上计算的,其中“norm_size” 是 norm_size 的值。

Parameters:
  • norm_sizefloat - 归一化大小,应该等于最后一维大小。

  • epsilonfloat - 数值稳定性常数,默认为 1e-5。

  • affinebool - 是否使用应用仿射变换,默认为 True。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

一维层归一化实例。

Example:

import numpy as np
import pyvqnet
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import LayerNorm1d
test_conv = LayerNorm1d(4)
x = XTensor(np.arange(1,17).reshape([4,4]))
y = test_conv.forward(x)
print(y)

# [
# [-1.3416355, -0.4472118, 0.4472118, 1.3416355],
# [-1.3416355, -0.4472118, 0.4472118, 1.3416355],
# [-1.3416355, -0.4472118, 0.4472118, 1.3416355],
# [-1.3416355, -0.4472118, 0.4472118, 1.3416355]
# ]

Linear

class pyvqnet.xtensor.Linear(input_channels, output_channels, weight_initializer=None, bias_initializer=None, use_bias=True, dtype=None, name: str = '')

线性模块(全连接层)。 \(y = x*A + b\)

Parameters:
  • input_channelsint - 输入数据通道数。

  • output_channelsint - 输出数据通道数。

  • weight_initializercallable - 权重初始化函数,默认为空,使用he_uniform。

  • bias_initializercallable - 偏置初始化参数,默认为空,使用he_uniform。

  • use_biasbool - 是否使用偏置项, 默认使用。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 线性层的命名,默认为””。

Returns:

线性层实例。

Example:

import numpy as np
import pyvqnet
from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import Linear
c1 =2
c2 = 3
cin = 7
cout = 5
n = Linear(cin,cout)
input = XTensor(np.arange(1,c1*c2*cin+1).reshape((c1,c2,cin)),dtype=pyvqnet.kfloat32)
y = n.forward(input)
print(y)

# [
# [[4.3084583, -1.9228780, -0.3428757, 1.2840536, -0.5865945],
#  [9.8339605, -5.5135884, -3.1228657, 4.3025794, -4.1492314],
#  [15.3594627, -9.1042995, -5.9028554, 7.3211040, -7.7118683]],
# [[20.8849659, -12.6950111, -8.6828451, 10.3396301, -11.2745066],
#  [26.4104652, -16.2857227, -11.4628344, 13.3581581, -14.8371439],
#  [31.9359703, -19.8764324, -14.2428246, 16.3766804, -18.3997803]]
# ]

Dropout

class pyvqnet.xtensor.Dropout(dropout_rate=0.5)

Dropout 模块。dropout 模块将一些单元的输出随机设置为零,同时根据给定的 dropout_rate 概率升级其他单元。

Note

当使用 with autograd.tape() 时候,Dropout进入train模式,将一些单元的输出随机设置为零。

当不使用以上代码时候,时候,Dropout进入train模式使用eval模式,原样输出。

Parameters:
  • dropout_ratefloat - 神经元被设置为零的概率。

  • name – 这个模块的名字, 默认为””。

Returns:

Dropout实例。

Example:

import numpy as np
from pyvqnet.xtensor import Dropout
from pyvqnet.xtensor import XTensor
b = 2
ic = 2
x = XTensor(np.arange(-1 * ic * 2 * 2,
                    (b - 1) * ic * 2 * 2).reshape([b, ic, 2, 2]))

droplayer = Dropout(0.5)

y = droplayer(x)
print(y)
"""
[[[[-0. -0.]
[-0. -0.]]

[[-0. -0.]
[-0. -0.]]]


[[[ 0.  0.]
[ 0.  6.]]

[[ 8. 10.]
[ 0. 14.]]]]
<XTensor 2x2x2x2 cpu(0) kfloat32>
"""

Pixel_Shuffle

class pyvqnet.xtensor.Pixel_Shuffle(upscale_factors)

重新排列形状为:(*, C * r^2, H, W) 的张量 到形状为 (*, C, H * r, W * r) 的张量,其中 r 是尺度变换因子。

Parameters:

upscale_factors – 增加尺度变换的因子

Returns:

Pixel_Shuffle 模块

Example:

from pyvqnet.xtensor import Pixel_Shuffle
from pyvqnet.xtensor import ones
ps = Pixel_Shuffle(3)
inx = ones([5,2,3,18,4,4])
inx.requires_grad=  True
y = ps(inx)
print(y.shape)
#[5, 2, 3, 2, 12, 12]

Pixel_Unshuffle

class pyvqnet.xtensor.Pixel_Unshuffle(downscale_factors)

通过重新排列元素来反转 Pixel_Shuffle 操作. 将 (, C, H * r, W * r) 形状的张量变化为 (, C * r^2, H, W) ,其中 r 是缩小因子。

Parameters:

downscale_factors – 增加尺度变换的因子

Returns:

Pixel_Unshuffle 模块

Example:

from pyvqnet.xtensor import Pixel_Unshuffle
from pyvqnet.xtensor import ones
ps = Pixel_Unshuffle(3)
inx = ones([5, 2, 3, 2, 12, 12])
inx.requires_grad = True
y = ps(inx)
print(y.shape)
#[5, 2, 3, 18, 4, 4]

GRU

class pyvqnet.xtensor.GRU(input_size, hidden_size, num_layers=1, nonlinearity='tanh', batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

门控循环单元 (GRU) 模块。支持多层堆叠,双向配置。单层单向GRU的计算公式如下:

\[\begin{split}\begin{array}{ll} r_t = \sigma(W_{ir} x_t + b_{ir} + W_{hr} h_{(t-1)} + b_{hr}) \\ z_t = \sigma(W_{iz} x_t + b_{iz} + W_{hz} h_{(t-1)} + b_{hz}) \\ n_t = \tanh(W_{in} x_t + b_{in} + r_t * (W_{hn} h_{(t-1)}+ b_{hn})) \\ h_t = (1 - z_t) * n_t + z_t * h_{(t-1)} \end{array}\end{split}\]
Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏特征维度。

  • num_layers – 堆叠GRU层数, 默认: 1。

  • batch_first – 如果为 True, 则输入形状为 [batch_size,seq_len,feature_dim], 如果为 False, 则输入形状为 [seq_len,batch_size,feature_dim],默认为 True。

  • use_bias – 如果为 False,该模块不适用偏置项,默认: True。

  • bidirectional – 如果为 True, 变为双向GRU, 默认: False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

GRU 实例

Example:

from pyvqnet.xtensor import GRU
import pyvqnet.xtensor as tensor

rnn2 = GRU(4, 6, 2, batch_first=False, bidirectional=True)

input = tensor.ones([5, 3, 4])
h0 = tensor.ones([4, 3, 6])

output, hn = rnn2(input, h0)
print(output)
print(hn)
# [[[-0.3525755 -0.2587337  0.149786   0.461374   0.1449795  0.4734624
#    -0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]
#   [-0.3525755 -0.2587337  0.149786   0.461374   0.1449795  0.4734624
#    -0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]
#   [-0.3525755 -0.2587337  0.149786   0.461374   0.1449796  0.4734623
#    -0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]]

#  [[-0.5718066 -0.2159877 -0.2978141  0.1441837 -0.0761072  0.3096682
#     0.0115526 -0.2295886 -0.1917011  0.5739203  0.5765471  0.3173765]
#   [-0.5718066 -0.2159877 -0.2978141  0.1441837 -0.0761072  0.3096682
#     0.0115526 -0.2295886 -0.1917011  0.5739203  0.5765471  0.3173765]
#   [-0.5718066 -0.2159877 -0.2978141  0.1441837 -0.0761071  0.3096681
#     0.0115526 -0.2295886 -0.1917011  0.5739203  0.5765471  0.3173765]]

#  [[-0.5341613 -0.0807438 -0.2697436 -0.0872668 -0.2630565  0.2262028
#     0.1108652 -0.0301746 -0.0453528  0.5952781  0.5141098  0.3779774]
#   [-0.5341613 -0.0807438 -0.2697436 -0.0872668 -0.2630565  0.2262028
#     0.1108652 -0.0301746 -0.0453528  0.5952781  0.5141098  0.3779774]
#   [-0.5341613 -0.0807438 -0.2697436 -0.0872668 -0.2630565  0.2262028
#     0.1108652 -0.0301746 -0.0453528  0.5952781  0.5141098  0.3779774]]

#  [[-0.4394189  0.0851144 -0.0413915 -0.2225544 -0.4341614  0.1345865
#     0.241122   0.2335991  0.1918445  0.6587436  0.4840603  0.4863765]
#   [-0.4394189  0.0851144 -0.0413915 -0.2225544 -0.4341614  0.1345865
#     0.241122   0.2335991  0.1918445  0.6587436  0.4840603  0.4863765]
#   [-0.4394189  0.0851144 -0.0413915 -0.2225544 -0.4341614  0.1345865
#     0.241122   0.2335991  0.1918445  0.6587436  0.4840603  0.4863765]]

#  [[-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008
#     0.4682454  0.5807121  0.5288119  0.7821091  0.5577921  0.6762444]
#   [-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008
#     0.4682454  0.5807121  0.5288119  0.7821091  0.5577921  0.6762444]
#   [-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008
#     0.4682454  0.5807121  0.5288119  0.7821091  0.5577921  0.6762444]]]
# <XTensor 5x3x12 cpu(0) kfloat32>

# [[[ 0.0388437 -0.0772902 -0.3355273 -0.143957   0.0520131 -0.323649 ]
#   [ 0.0388437 -0.0772902 -0.3355273 -0.143957   0.0520131 -0.323649 ]
#   [ 0.0388437 -0.0772902 -0.3355273 -0.143957   0.0520131 -0.323649 ]]

#  [[-0.4715263 -0.5740314 -0.6212391 -0.20578    0.8116962 -0.1011644]
#   [-0.4715263 -0.5740314 -0.6212391 -0.20578    0.8116962 -0.1011644]
#   [-0.4715263 -0.5740314 -0.6212391 -0.20578    0.8116962 -0.1011644]]

#  [[-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008]
#   [-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008]
#   [-0.335566   0.2576246  0.2983787 -0.3105901 -0.5880742 -0.0203008]]

#  [[-0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]
#   [-0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]
#   [-0.0581852 -0.3912893 -0.2553828  0.5960887  0.6639917  0.2783016]]]
# <XTensor 4x3x6 cpu(0) kfloat32>

RNN

class pyvqnet.xtensor.RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

循环神经网络(RNN)模块,使用 \(\tanh\)\(\text{relu}\) 作为激活函数。支持双向,多层配置。 单层单向RNN计算公式如下:

\[h_t = \tanh(W_{ih} x_t + b_{ih} + W_{hh} h_{(t-1)} + b_{hh})\]

如果 nonlinearity'relu', 则 \(\text{relu}\) 将替代 \(\tanh\)

Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏特征维度。

  • num_layers – 堆叠RNN层数, 默认: 1。

  • nonlinearity – 非线性激活函数,默认为 'tanh'

  • batch_first – 如果为 True, 则输入形状为 [batch_size,seq_len,feature_dim], 如果为 False, 则输入形状为 [seq_len,batch_size,feature_dim],默认为 True。

  • use_bias – 如果为 False, 该模块不适用偏置项,默认: True。

  • bidirectional – 如果为 True,变为双向RNN,默认: False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

RNN 实例

Example:

from pyvqnet.xtensor import RNN
import pyvqnet.xtensor as tensor

rnn2 = RNN(4, 6, 2, batch_first=False, bidirectional = True)

input = tensor.ones([5, 3, 4])
h0 = tensor.ones([4, 3, 6])
output, hn = rnn2(input, h0)
print(output)
print(hn)

# [[[ 0.2618747  0.5377525  0.5129814 -0.0242058 -0.6311338  0.655068
#    -0.7402378 -0.1209883 -0.2462614  0.1552387  0.433101  -0.3321311]
#   [ 0.2618747  0.5377525  0.5129814 -0.0242058 -0.6311338  0.655068
#    -0.7402378 -0.1209883 -0.2462614  0.1552387  0.433101  -0.3321311]
#   [ 0.2618747  0.5377525  0.5129814 -0.0242058 -0.6311338  0.655068
#    -0.7402378 -0.1209883 -0.2462614  0.1552387  0.4331009 -0.3321312]]

#  [[ 0.4478737  0.8829155 -0.0466572 -0.1412439 -0.0311011  0.3848146
#    -0.710574   0.0830743 -0.2802465 -0.0228663  0.1831353 -0.3086829]
#   [ 0.4478737  0.8829155 -0.0466572 -0.1412439 -0.0311011  0.3848146
#    -0.710574   0.0830743 -0.2802465 -0.0228663  0.1831353 -0.3086829]
#   [ 0.4478737  0.8829155 -0.0466572 -0.1412439 -0.0311011  0.3848146
#    -0.710574   0.0830743 -0.2802465 -0.0228663  0.1831353 -0.3086829]]

#  [[ 0.581092   0.8708823  0.2848003 -0.154836  -0.4118715  0.5057767
#    -0.8474038  0.0595496 -0.5158566 -0.1731871  0.3361979 -0.2265194]
#   [ 0.581092   0.8708823  0.2848003 -0.154836  -0.4118715  0.5057767
#    -0.8474038  0.0595496 -0.5158566 -0.1731871  0.3361979 -0.2265194]
#   [ 0.581092   0.8708823  0.2848004 -0.154836  -0.4118715  0.5057766
#    -0.8474038  0.0595496 -0.5158566 -0.1731871  0.3361979 -0.2265194]]

#  [[ 0.5710331  0.8946801 -0.0285869 -0.032192  -0.2297462  0.4527371
#    -0.7243505  0.2147861 -0.3519893 -0.1745383 -0.5063711 -0.7420927]
#   [ 0.5710331  0.8946801 -0.0285869 -0.032192  -0.2297462  0.4527371
#    -0.7243505  0.2147861 -0.3519893 -0.1745383 -0.5063711 -0.7420927]
#   [ 0.5710331  0.8946801 -0.0285869 -0.032192  -0.2297462  0.4527371
#    -0.7243505  0.2147861 -0.3519893 -0.1745383 -0.5063711 -0.7420927]]

#  [[ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097
#    -0.4387358 -0.9216538 -0.3471112 -0.9059284  0.9011658 -0.6876704]
#   [ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097
#    -0.4387358 -0.9216538 -0.3471112 -0.9059284  0.9011658 -0.6876704]
#   [ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097
#    -0.4387358 -0.9216538 -0.3471112 -0.9059284  0.9011658 -0.6876704]]]
# <XTensor 5x3x12 cpu(0) kfloat32>

# [[[-0.1595494 -0.4154228  0.6991262  0.634046   0.6960769 -0.4966849]
#   [-0.1595494 -0.4154228  0.6991262  0.634046   0.6960769 -0.4966849]
#   [-0.1595494 -0.4154228  0.6991262  0.634046   0.6960769 -0.4966849]]

#  [[ 0.2330922 -0.7264591 -0.7571693  0.3780781  0.4115383  0.7572027]
#   [ 0.2330922 -0.7264591 -0.7571693  0.3780781  0.4115383  0.7572027]
#   [ 0.2330922 -0.7264591 -0.7571693  0.3780781  0.4115383  0.7572027]]

#  [[ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097]
#   [ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097]
#   [ 0.6136605  0.8351185 -0.0997602 -0.4209205  0.0391619  0.6528097]]

#  [[-0.7402378 -0.1209883 -0.2462614  0.1552387  0.433101  -0.3321311]
#   [-0.7402378 -0.1209883 -0.2462614  0.1552387  0.433101  -0.3321311]
#   [-0.7402378 -0.1209883 -0.2462614  0.1552387  0.4331009 -0.3321312]]]
# <XTensor 4x3x6 cpu(0) kfloat32>

LSTM

class pyvqnet.xtensor.LSTM(input_size, hidden_size, num_layers=1, batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

长短期记忆(LSTM)模块。支持双向LSTM, 堆叠多层LSTM等配置。单层单向LSTM计算公式如下:

\[\begin{split}\begin{array}{ll} \\ i_t = \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi}) \\ f_t = \sigma(W_{if} x_t + b_{if} + W_{hf} h_{t-1} + b_{hf}) \\ g_t = \tanh(W_{ig} x_t + b_{ig} + W_{hg} h_{t-1} + b_{hg}) \\ o_t = \sigma(W_{io} x_t + b_{io} + W_{ho} h_{t-1} + b_{ho}) \\ c_t = f_t \odot c_{t-1} + i_t \odot g_t \\ h_t = o_t \odot \tanh(c_t) \\ \end{array}\end{split}\]
Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏特征维度。

  • num_layers – 堆叠LSTM层数,默认: 1。

  • batch_first – 如果为 True,则输入形状为 [batch_size,seq_len,feature_dim], 如果为 False, 则输入形状为 [seq_len,batch_size,feature_dim],默认为 True。

  • use_bias – 如果为 False,该模块不适用偏置项, 默认: True。

  • bidirectional – 如果为 True,变为双向LSTM, 默认: False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

LSTM 实例

Example:

from pyvqnet.xtensor import LSTM
import pyvqnet.xtensor as tensor

rnn2 = LSTM(4, 6, 2, batch_first=False, bidirectional = True)

input = tensor.ones([5, 3, 4])
h0 = tensor.ones([4, 3, 6])
c0 = tensor.ones([4, 3, 6])
output, (hn, cn) = rnn2(input, (h0, c0))

print(output)
print(hn)
print(cn)

"""
[[[ 0.0952653  0.2589843  0.2486762  0.1287942  0.1021227  0.1911968
-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]
[ 0.0952653  0.2589843  0.2486762  0.1287942  0.1021227  0.1911968
-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]
[ 0.0952653  0.2589843  0.2486762  0.1287942  0.1021227  0.1911968
-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]]

[[ 0.085497   0.1925259  0.3265719 -0.0792181  0.0310715  0.1398373
-0.0023391 -0.3675225  0.3450475  0.2388555 -0.0579962 -0.0536785]
[ 0.085497   0.1925259  0.3265719 -0.0792181  0.0310715  0.1398373
-0.0023391 -0.3675225  0.3450475  0.2388555 -0.0579962 -0.0536785]
[ 0.085497   0.1925259  0.3265719 -0.0792181  0.0310715  0.1398373
-0.0023391 -0.3675225  0.3450475  0.2388555 -0.0579962 -0.0536785]]

[[ 0.0788613  0.1431215  0.3656158 -0.1339753  0.0101364  0.0694154
    0.0299196 -0.329112   0.4189231  0.2440841  0.0078633 -0.091286 ]
[ 0.0788613  0.1431215  0.3656158 -0.1339753  0.0101364  0.0694154
    0.0299196 -0.329112   0.4189231  0.2440841  0.0078633 -0.091286 ]
[ 0.0788613  0.1431215  0.3656158 -0.1339753  0.0101364  0.0694154
    0.0299196 -0.329112   0.4189231  0.2440841  0.0078633 -0.091286 ]]

[[ 0.0730032  0.1006287  0.3992919 -0.1526794 -0.0077587  0.0049352
    0.0684287 -0.2034638  0.4807869  0.2429611  0.1062173 -0.100478 ]
[ 0.0730032  0.1006287  0.3992919 -0.1526794 -0.0077587  0.0049352
    0.0684287 -0.2034638  0.4807869  0.2429611  0.1062173 -0.100478 ]
[ 0.0730032  0.1006287  0.3992919 -0.1526794 -0.0077587  0.0049352
    0.0684287 -0.2034638  0.4807869  0.2429611  0.1062173 -0.100478 ]]

[[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961
    0.1292751  0.0901535  0.5008832  0.1749451  0.2660664  0.0133356]
[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961
    0.1292751  0.0901535  0.5008832  0.1749451  0.2660664  0.0133356]
[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961
    0.1292751  0.0901535  0.5008832  0.1749451  0.2660664  0.0133356]]]
<XTensor 5x3x12 cpu(0) kfloat32>

[[[-0.1111576 -0.0410911 -0.1360135 -0.2142551  0.3879747 -0.4244705]
[-0.1111576 -0.0410911 -0.1360135 -0.2142551  0.3879747 -0.4244705]
[-0.1111576 -0.0410911 -0.1360135 -0.2142551  0.3879747 -0.4244705]]

[[ 0.2689943  0.3063364 -0.2738754  0.2168426 -0.4891826  0.2454725]
[ 0.2689943  0.3063364 -0.2738754  0.2168426 -0.4891826  0.2454725]
[ 0.2689943  0.3063364 -0.2738754  0.2168426 -0.4891826  0.2454725]]

[[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961]
[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961]
[ 0.0421946  0.0219641  0.4280343 -0.1918173 -0.0422104 -0.0659961]]

[[-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]
[-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]
[-0.0414362 -0.3521166  0.2783869  0.2294379 -0.0897322 -0.0056688]]]
<XTensor 4x3x6 cpu(0) kfloat32>

[[[-0.1973301 -0.2033432 -0.4812729 -0.3186268  0.7220416 -0.6785325]
[-0.1973301 -0.2033432 -0.4812729 -0.3186268  0.7220416 -0.6785325]
[-0.1973301 -0.2033432 -0.4812729 -0.3186268  0.7220416 -0.6785325]]

[[ 1.6790413  0.4572753 -0.4843928  0.3902704 -0.9931879  0.4607614]
[ 1.6790413  0.4572753 -0.4843928  0.3902704 -0.9931879  0.4607614]
[ 1.6790413  0.4572753 -0.4843928  0.3902704 -0.9931879  0.4607614]]

[[ 0.0753609  0.0477858  0.7334676 -0.3433677 -0.1412639 -0.1365461]
[ 0.0753609  0.0477858  0.7334676 -0.3433677 -0.1412639 -0.1365461]
[ 0.0753609  0.0477858  0.7334676 -0.3433677 -0.1412639 -0.1365461]]

[[-0.104733  -0.6896871  0.4874932  0.4806345 -0.167628  -0.0125997]
[-0.104733  -0.6896871  0.4874932  0.4806345 -0.167628  -0.0125997]
[-0.104733  -0.6896871  0.4874932  0.4806345 -0.167628  -0.0125997]]]
<XTensor 4x3x6 cpu(0) kfloat32>
"""

Dynamic_GRU

class pyvqnet.xtensor.Dynamic_GRU(input_size, hidden_size, num_layers=1, batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

将多层门控循环单元 (GRU) RNN 应用于动态长度输入序列。

第一个输入应该是定义了可变长度的批处理序列输入 通过 xtensor.PackedSequence 类。 xtensor.PackedSequence 类可以构造为 连续调用下一个函数: pad_sequencepack_pad_sequence

Dynamic_GRU 的第一个输出也是一个 xtensor.PackedSequence 类, 可以使用 xtensor.pad_pack_sequence 将其解压缩为普通 XTensor。

对于输入序列中的每个元素,每一层计算以下公式:

\[\begin{split}\begin{array}{ll} r_t = \sigma(W_{ir} x_t + b_{ir} + W_{hr} h_{(t-1)} + b_{hr}) \\ z_t = \sigma(W_{iz} x_t + b_{iz} + W_{hz} h_{(t-1)} + b_{hz}) \\ n_t = \tanh(W_{in} x_t + b_{in} + r_t * (W_{hn} h_{(t-1)}+ b_{hn})) \\ h_t = (1 - z_t) * n_t + z_t * h_{(t-1)} \end{array}\end{split}\]
Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏的特征维度。

  • num_layers – 循环层数。 默认值:1

  • batch_first – 如果为 True,输入形状提供为 [批大小,序列长度,特征维度]。如果为 False,输入形状提供为 [序列长度,批大小,特征维度],默认为 True。

  • use_bias – 如果为False,则该层不使用偏置权重b_ih和b_hh。 默认值:True。

  • bidirectional – 如果为真,则成为双向 GRU。 默认值:False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

一个 Dynamic_GRU 类

Example:

from pyvqnet.xtensor import Dynamic_GRU
import pyvqnet.xtensor as tensor
seq_len = [4,1,2]
input_size = 4
batch_size =3
hidden_size = 2
ml = 2
rnn2 = Dynamic_GRU(input_size,
                hidden_size=2,
                num_layers=2,
                batch_first=False,
                bidirectional=True)

a = tensor.arange(1, seq_len[0] * input_size + 1).reshape(
    [seq_len[0], input_size])
b = tensor.arange(1, seq_len[1] * input_size + 1).reshape(
    [seq_len[1], input_size])
c = tensor.arange(1, seq_len[2] * input_size + 1).reshape(
    [seq_len[2], input_size])

y = tensor.pad_sequence([a, b, c], False)

input = tensor.pack_pad_sequence(y,
                                seq_len,
                                batch_first=False,
                                enforce_sorted=False)

h0 = tensor.ones([ml * 2, batch_size, hidden_size])

output, hn = rnn2(input, h0)

seq_unpacked, lens_unpacked = \
tensor.pad_packed_sequence(output, batch_first=False)
print(seq_unpacked)
print(lens_unpacked)

# [[[ 0.872566   0.8611314 -0.5047759  0.9130142]
#   [ 0.5690175  0.9443005 -0.3432685  0.9585502]
#   [ 0.8512535  0.8650243 -0.487494   0.9192616]]

#  [[ 0.7886224  0.7501922 -0.4578349  0.919861 ]
#   [ 0.         0.         0.         0.       ]
#   [ 0.712998   0.749097  -0.2539869  0.9405512]]

#  [[ 0.7242796  0.6568378 -0.4209562  0.9258339]
#   [ 0.         0.         0.         0.       ]
#   [ 0.         0.         0.         0.       ]]

#  [[ 0.6601164  0.5651093 -0.2040557  0.9421862]
#   [ 0.         0.         0.         0.       ]
#   [ 0.         0.         0.         0.       ]]]
# <XTensor 4x3x4 cpu(0) kfloat32>
# [4 1 2]

Dynamic_RNN

class pyvqnet.xtensor.Dynamic_RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

将循环神经网络 RNN 应用于动态长度输入序列。

第一个输入应该是定义了可变长度的批处理序列输入 通过 tensor.PackedSequence 类。 tensor.PackedSequence 类可以构造为 连续调用下一个函数: pad_sequencepack_pad_sequence

Dynamic_RNN 的第一个输出也是一个 tensor.PackedSequence 类, 可以使用 tensor.pad_pack_sequence 将其解压缩为普通 XTensor。

循环神经网络(RNN)模块,使用 \(\tanh\)\(\text{ReLU}\) 作为激活函数。支持双向,多层配置。 单层单向RNN计算公式如下:

\[h_t = \tanh(W_{ih} x_t + b_{ih} + W_{hh} h_{(t-1)} + b_{hh})\]

如果 nonlinearity'relu', 则 \(\text{ReLU}\) 将替代 \(\tanh\)

Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏特征维度。

  • num_layers – 堆叠RNN层数, 默认: 1。

  • nonlinearity – 非线性激活函数,默认为 'tanh'

  • batch_first – 如果为 True, 则输入形状为 [批大小,序列长度,特征维度], 如果为 False, 则输入形状为 [序列长度,批大小,特征维度],默认为 True。

  • use_bias – 如果为 False, 该模块不适用偏置项,默认: True。

  • bidirectional – 如果为 True,变为双向RNN,默认: False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

Dynamic_RNN 实例

Example:

from pyvqnet.xtensor import Dynamic_RNN
import pyvqnet.xtensor as tensor
seq_len = [4,1,2]
input_size = 4
batch_size =3
hidden_size = 2
ml = 2
rnn2 = Dynamic_RNN(input_size,
                hidden_size=2,
                num_layers=2,
                batch_first=False,
                bidirectional=True,
                nonlinearity='relu')

a = tensor.arange(1, seq_len[0] * input_size + 1).reshape(
    [seq_len[0], input_size])
b = tensor.arange(1, seq_len[1] * input_size + 1).reshape(
    [seq_len[1], input_size])
c = tensor.arange(1, seq_len[2] * input_size + 1).reshape(
    [seq_len[2], input_size])

y = tensor.pad_sequence([a, b, c], False)

input = tensor.pack_pad_sequence(y,
                                seq_len,
                                batch_first=False,
                                enforce_sorted=False)

h0 = tensor.ones([ml * 2, batch_size, hidden_size])

output, hn = rnn2(input, h0)

seq_unpacked, lens_unpacked = \
tensor.pad_packed_sequence(output, batch_first=False)
print(seq_unpacked)
print(lens_unpacked)

"""
[[[ 2.283666   2.1524734  0.         0.8799834]
[ 2.9422705  2.6565394  0.         0.8055274]
[ 2.9554236  2.1205678  0.         1.1741859]]

[[ 6.396565   3.8327866  0.         2.6239884]
[ 0.         0.         0.         0.       ]
[ 7.37332    4.7455616  0.         2.6786256]]

[[12.521921   5.239943   0.         4.62357  ]
[ 0.         0.         0.         0.       ]
[ 0.         0.         0.         0.       ]]

[[19.627499   8.675274   0.         6.6746845]
[ 0.         0.         0.         0.       ]
[ 0.         0.         0.         0.       ]]]
<XTensor 4x3x4 cpu(0) kfloat32>
[4 1 2]
"""

Dynamic_LSTM

class pyvqnet.xtensor.Dynamic_LSTM(input_size, hidden_size, num_layers=1, batch_first=True, use_bias=True, bidirectional=False, dtype=None, name: str = '')

将长短期记忆(LSTM) RNN 应用于动态长度输入序列。

第一个输入应该是定义了可变长度的批处理序列输入 通过 tensor.PackedSequence 类。 tensor.PackedSequence 类可以构造为 连续调用下一个函数: pad_sequencepack_pad_sequence

Dynamic_LSTM 的第一个输出也是一个 tensor.PackedSequence 类, 可以使用 tensor.pad_pack_sequence 将其解压缩为普通 XTensor。

循环神经网络(RNN)模块,使用 \(\tanh\)\(\text{ReLU}\) 作为激活函数。支持双向,多层配置。 单层单向RNN计算公式如下:

\[\begin{split}\begin{array}{ll} \\ i_t = \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi}) \\ f_t = \sigma(W_{if} x_t + b_{if} + W_{hf} h_{t-1} + b_{hf}) \\ g_t = \tanh(W_{ig} x_t + b_{ig} + W_{hg} h_{t-1} + b_{hg}) \\ o_t = \sigma(W_{io} x_t + b_{io} + W_{ho} h_{t-1} + b_{ho}) \\ c_t = f_t \odot c_{t-1} + i_t \odot g_t \\ h_t = o_t \odot \tanh(c_t) \\ \end{array}\end{split}\]
Parameters:
  • input_size – 输入特征维度。

  • hidden_size – 隐藏特征维度。

  • num_layers – 堆叠LSTM层数,默认: 1。

  • batch_first – 如果为 True,则输入形状为 [批大小,序列长度,特征维度], 如果为 False, 则输入形状为 [序列长度,批大小,特征维度],默认为 True。

  • use_bias – 如果为 False,该模块不适用偏置项, 默认: True。

  • bidirectional – 如果为 True,变为双向LSTM, 默认: False。

  • dtype – 参数的数据类型,defaults:None,使用默认数据类型:kfloat32,代表32位浮点数。

  • name – 这个模块的名字, 默认为””。

Returns:

Dynamic_LSTM 实例

Example:

from pyvqnet.xtensor import Dynamic_LSTM
import pyvqnet.xtensor as tensor

input_size = 2
hidden_size = 2
ml = 2
seq_len = [3, 4, 1]
batch_size = 3
rnn2 = Dynamic_LSTM(input_size,
                    hidden_size=hidden_size,
                    num_layers=ml,
                    batch_first=False,
                    bidirectional=True)

a = tensor.arange(1, seq_len[0] * input_size + 1).reshape(
    [seq_len[0], input_size])
b = tensor.arange(1, seq_len[1] * input_size + 1).reshape(
    [seq_len[1], input_size])
c = tensor.arange(1, seq_len[2] * input_size + 1).reshape(
    [seq_len[2], input_size])
a.requires_grad = True
b.requires_grad = True
c.requires_grad = True
y = tensor.pad_sequence([a, b, c], False)

input = tensor.pack_pad_sequence(y,
                                seq_len,
                                batch_first=False,
                                enforce_sorted=False)

h0 = tensor.ones([ml * 2, batch_size, hidden_size])
c0 = tensor.ones([ml * 2, batch_size, hidden_size])

output, (hn, cn) = rnn2(input, (h0, c0))

seq_unpacked, lens_unpacked = \
tensor.pad_packed_sequence(output, batch_first=False)

print(seq_unpacked)
print(lens_unpacked)
"""
[[[ 0.1970974  0.2246606  0.2627596 -0.080385 ]
[ 0.2071671  0.2119733  0.2301395 -0.2693036]
[ 0.1106544  0.3478935  0.4335948  0.378578 ]]

[[ 0.1176731 -0.0304668  0.2993484  0.0920533]
[ 0.1386266 -0.0483974  0.2384422 -0.1798031]
[ 0.         0.         0.         0.       ]]

[[ 0.0798466 -0.1468595  0.4139522  0.3376699]
[ 0.1303781 -0.1537685  0.2934605  0.0475375]
[ 0.         0.         0.         0.       ]]

[[ 0.         0.         0.         0.       ]
[ 0.0958745 -0.2243107  0.4114271  0.3248508]
[ 0.         0.         0.         0.       ]]]
<XTensor 4x3x4 cpu(0) kfloat32>
[3 4 1]
"""

损失函数层

以下为神经网络常用的损失层。

Note

请注意,跟pytorch等框架不同的是,以下loss函数的前向函数中,第一个参数为标签,第二个参数为预测值。

MeanSquaredError

class pyvqnet.xtensor.MeanSquaredError(name='')

计算输入 \(x\) 和目标值 \(y\) 之间的均方根误差。

若平方根误差可由如下函数描述:

\[\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = \left( x_n - y_n \right)^2,\]

\(x\)\(y\) 是任意形状的 XTensor , 总 \(n\) 个元素的均方根误差由下式计算。

\[\ell(x, y) = \operatorname{mean}(L)\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

一个均方根误差实例。

均方根误差前向计算函数的所需参数:

x: \((N, *)\) 预测值,其中 \(*\) 表示任意维度。

y: \((N, *)\), 目标值, 和输入一样维度的 XTensor 。

Note

请注意,跟pytorch等框架不同的是,以下MeanSquaredError函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor, kfloat64
from pyvqnet.xtensor import MeanSquaredError
y = XTensor([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]],
            dtype=kfloat64)
x = XTensor([[0.1, 0.05, 0.7, 0, 0.05, 0.1, 0, 0, 0, 0]],

            dtype=kfloat64)

loss_result = MeanSquaredError()
result = loss_result(y, x)
print(result)
# [0.0115000]

BinaryCrossEntropy

class pyvqnet.xtensor.BinaryCrossEntropy(name='')

测量目标和输入之间的平均二元交叉熵损失。

未做平均运算的二元交叉熵如下式:

\[\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_n \left[ y_n \cdot \log x_n + (1 - y_n) \cdot \log (1 - x_n) \right],\]

\(N\) 为批的大小,则平均二元交叉熵.

\[\ell(x, y) = \operatorname{mean}(L)\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

一个平均二元交叉熵实例。

平均二元交叉熵误差前向计算函数的所需参数:

x: \((N, *)\) 预测值,其中 \(*\) 表示任意维度。

y: \((N, *)\), 目标值,和输入一样维度的 XTensor 。

Note

请注意,跟pytorch等框架不同的是,BinaryCrossEntropy函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor
from pyvqnet.xtensor import BinaryCrossEntropy
x = XTensor([[0.3, 0.7, 0.2], [0.2, 0.3, 0.1]] )
y = XTensor([[0.0, 1.0, 0], [0.0, 0, 1]] )

loss_result = BinaryCrossEntropy()
result = loss_result(y, x)
print(result)
# [0.6364825]

CategoricalCrossEntropy

class pyvqnet.xtensor.CategoricalCrossEntropy(name='')

该损失函数将 LogSoftmax 和 NLLLoss 同时计算的平均分类交叉熵。

损失函数计算方式如下,其中 class 为目标值的对应分类标签:

\[\text{loss}(x, y) = -\log\left(\frac{\exp(x[class])}{\sum_j \exp(x[j])}\right) = -x[class] + \log\left(\sum_j \exp(x[j])\right)\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

平均分类交叉熵实例。

误差前向计算函数的所需参数:

x: \((N, *)\) 预测值,其中 \(*\) 表示任意维度。

y: \((N, *)\), 目标值,和输入一样维度的 XTensor 。

Note

请注意,跟pytorch等框架不同的是,CategoricalCrossEntropy函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor,kfloat32,kint64
from pyvqnet.xtensor import CategoricalCrossEntropy
x = XTensor([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]], dtype=kfloat32)
y = XTensor([[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [1, 0, 0, 0, 0]],
dtype=kfloat32)
loss_result = CategoricalCrossEntropy()
result = loss_result(y, x)
print(result)
# [3.7852428]

SoftmaxCrossEntropy

class pyvqnet.xtensor.SoftmaxCrossEntropy(name='')

该损失函数将 LogSoftmax 和 NLLLoss 同时计算的平均分类交叉熵,并具有更高的数值稳定性。

损失函数计算方式如下,其中 class 为目标值的对应分类标签:

\[\text{loss}(x, y) = -\log\left(\frac{\exp(x[class])}{\sum_j \exp(x[j])}\right) = -x[class] + \log\left(\sum_j \exp(x[j])\right)\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

一个Softmax交叉熵损失函数实例

误差前向计算函数的所需参数:

x: \((N, *)\) 预测值,其中 \(*\) 表示任意维度。

y: \((N, *)\), 目标值,和输入一样维度的 XTensor 。

Note

请注意,跟pytorch等框架不同的是,SoftmaxCrossEntropy函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor, kfloat32, kint64
from pyvqnet.xtensor import SoftmaxCrossEntropy
x = XTensor([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
            dtype=kfloat32)
y = XTensor([[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [1, 0, 0, 0, 0]],
            dtype=kfloat32)
loss_result = SoftmaxCrossEntropy()
result = loss_result(y, x)
print(result)

# [3.7852478]

NLL_Loss

class pyvqnet.xtensor.NLL_Loss(name='')

平均负对数似然损失。 对C个类别的分类问题很有用。

x 是模型给出的概率形式的似然量。其尺寸可以是 \((N, C)\) or \((N, C, d_1, d_2, ..., d_K)\)y 是损失函数期望的真值,包含 \([0, C-1]\) 的类别索引。

\[\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - \sum_{n=1}^N \frac{1}{N}x_{n,y_n} \quad\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

一个NLL_Loss损失函数实例

误差前向计算函数的所需参数:

x: \((N, *)\),损失函数的输出预测值,可以为多维变量。

y: \((N, *)\),损失函数目标值。

Note

请注意,跟pytorch等框架不同的是,NLL_Loss函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor, kint64
from pyvqnet.xtensor import NLL_Loss

x = XTensor([
    0.9476322568516703, 0.226547421131723, 0.5944201443911326,
    0.42830868492969476, 0.76414068655387, 0.00286059168094277,
    0.3574236812873617, 0.9096948856639084, 0.4560809854582528,
    0.9818027091583286, 0.8673569904602182, 0.9860275114020933,
    0.9232667066664217, 0.303693313961628, 0.8461034903175555
]).reshape([1, 3, 1, 5])

x.requires_grad = True
y = XTensor([[[2, 1, 0, 0, 2]]])

loss_result = NLL_Loss()
result = loss_result(y, x)
print(result)
#[-0.6187226]

CrossEntropyLoss

class pyvqnet.xtensor.CrossEntropyLoss(name='')

该函数计算LogSoftmax以及NLL_Loss在一起的损失。

x 是包含未做归一化的输出.它的尺寸可以为 \((C)\) , \((N, C)\) 二维或 \((N, C, d_1, d_2, ..., d_K)\) 多维。

损失函数的公式如下,其中 class 为目标值的对应分类标签:

\[\text{loss}(x, y) = -\log\left(\frac{\exp(x[class])}{\sum_j \exp(x[j])}\right) = -x[class] + \log\left(\sum_j \exp(x[j])\right)\]
Parameters:

name – 这个模块的名字, 默认为””。

Returns:

一个CrossEntropyLoss损失函数实例

误差前向计算函数的所需参数:

x: \((N, *)\),损失函数的输出,可以为多维变量。

y: \((N, *)\),损失函数期望的真值。

Note

请注意,跟pytorch等框架不同的是,CrossEntropyLoss函数的前向函数中,第一个参数为目标值,第二个参数为预测值。

Example:

from pyvqnet.xtensor import XTensor, kfloat32
from pyvqnet.xtensor import CrossEntropyLoss
x = XTensor([
    0.9476322568516703, 0.226547421131723, 0.5944201443911326,
    0.42830868492969476, 0.76414068655387, 0.00286059168094277,
    0.3574236812873617, 0.9096948856639084, 0.4560809854582528,
    0.9818027091583286, 0.8673569904602182, 0.9860275114020933,
    0.9232667066664217, 0.303693313961628, 0.8461034903175555
]).reshape([1, 3, 1, 5])

x.requires_grad = True
y = XTensor([[[2, 1, 0, 0, 2]]], dtype=kfloat32)

loss_result = CrossEntropyLoss()
result = loss_result(y, x)
print(result)

#[1.1508200]

激活函数

sigmoid

pyvqnet.xtensor.sigmoid(x)

Sigmoid激活函数层。

\[\text{Sigmoid}(x) = \frac{1}{1 + \exp(-x)}\]
Parameters:

x – 输入。

Returns:

Sigmoid激活函数结果。

Examples:

from pyvqnet.xtensor import sigmoid
from pyvqnet.xtensor import XTensor

y = sigmoid(XTensor([1.0, 2.0, 3.0, 4.0]))
print(y)

# [0.7310586, 0.8807970, 0.9525741, 0.9820138]

softplus

class pyvqnet.xtensor.softplus(x)

Softplus激活函数层。

\[\text{Softplus}(x) = \log(1 + \exp(x))\]
Parameters:

x – 输入。

Returns:

softplus激活函数层结果。

Examples:

from pyvqnet.xtensor import softplus
from pyvqnet.xtensor import XTensor
y = softplus(XTensor([1.0, 2.0, 3.0, 4.0]))
print(y)

# [1.3132616, 2.1269281, 3.0485873, 4.0181499]

softsign

class pyvqnet.xtensor.softsign(x)

Softsign 激活函数层。

\[\text{SoftSign}(x) = \frac{x}{ 1 + |x|}\]
Parameters:

x – 输入。

Returns:

Softsign 激活函数结果。

Examples:

from pyvqnet.xtensor import softsign
from pyvqnet.xtensor import XTensor
y = softsign(XTensor([1.0, 2.0, 3.0, 4.0]))
print(y)

# [0.5000000, 0.6666667, 0.7500000, 0.8000000]

softmax

class pyvqnet.xtensor.softmax(x, axis: int = -1)

Softmax 激活函数层。

\[\text{Softmax}(x_{i}) = \frac{\exp(x_i)}{\sum_j \exp(x_j)}\]
Parameters:
  • x – 输入。

  • axis – 计算的维度(最后一个轴为-1),默认值 = -1。

Returns:

Softmax 激活函数层结果。

Examples:

from pyvqnet.xtensor import softmax
from pyvqnet.xtensor import XTensor

y = softmax(XTensor([1.0, 2.0, 3.0, 4.0]))
print(y)

# [0.0320586, 0.0871443, 0.2368828, 0.6439142]

hard_sigmoid

class pyvqnet.xtensor.hard_sigmoid(x)

HardSigmoid 激活函数层。

\[\begin{split}\text{Hardsigmoid}(x) = \begin{cases} 0 & \text{ if } x \le -3, \\ 1 & \text{ if } x \ge +3, \\ x / 6 + 1 / 2 & \text{otherwise} \end{cases}\end{split}\]
Parameters:

x – 输入。

Returns:

HardSigmoid 激活函数层结果。

Examples:

from pyvqnet.xtensor import hard_sigmoid
from pyvqnet.xtensor import XTensor

y = hard_sigmoid(XTensor([1.0, 2.0, 3.0, 4.0]))
print(y)

# [0.6666667, 0.8333334, 1., 1.]

relu

class pyvqnet.xtensor.relu(x)

ReLu 整流线性单元激活函数层。

\[\begin{split}\text{ReLu}(x) = \begin{cases} x, & \text{ if } x > 0\\ 0, & \text{ if } x \leq 0 \end{cases}\end{split}\]
Parameters:

x – 输入。

Returns:

ReLu 激活函数层实例。

Examples:

from pyvqnet.xtensor import relu
from pyvqnet.xtensor import XTensor

y = relu(XTensor([-1, 2.0, -3, 4.0]))
print(y)

# [0., 2., 0., 4.]

leaky_relu

class pyvqnet.xtensor.leaky_relu(x, alpha: float = 0.01)

LeakyReLu 带泄露的修正线性单元激活函数层。

\[\begin{split}\text{LeakyRelu}(x) = \begin{cases} x, & \text{ if } x \geq 0 \\ \alpha * x, & \text{ otherwise } \end{cases}\end{split}\]
Parameters:
  • x – 输入。

  • alpha – LeakyRelu 系数,默认:0.01。

Returns:

LeakyReLu 激活函数层结果。

Examples:

from pyvqnet.xtensor import leaky_relu
from pyvqnet.xtensor import XTensor
y = leaky_relu(XTensor([-1, 2.0, -3, 4.0]))
print(y)

# [-0.0100000, 2., -0.0300000, 4.]

elu

class pyvqnet.xtensor.elu(x, alpha: float = 1)

ELU 指数线性单位激活函数层。

\[\begin{split}\text{ELU}(x) = \begin{cases} x, & \text{ if } x > 0\\ \alpha * (\exp(x) - 1), & \text{ if } x \leq 0 \end{cases}\end{split}\]
Parameters:
  • x – 输入。

  • alpha – ELU 系数,默认:1。

Returns:

ELU 激活函数层结果。

Examples:

from pyvqnet.xtensor import elu
from pyvqnet.xtensor import XTensor

y = elu(XTensor([-1, 2.0, -3, 4.0]))
print(y)

# [-0.6321205, 2., -0.9502130, 4.]

tanh

class pyvqnet.xtensor.tanh(x)

Tanh双曲正切激活函数.

\[\text{Tanh}(x) = \frac{\exp(x) - \exp(-x)} {\exp(x) + \exp(-x)}\]
Parameters:

x – 输入。

Returns:

Tanh 激活函数层结果。

Examples:

from pyvqnet.xtensor import tanh
from pyvqnet.xtensor import XTensor
y = tanh(XTensor([-1, 2.0, -3, 4.0]))
print(y)

# [-0.7615942, 0.9640276, -0.9950548, 0.9993293]

优化器模块

Optimizer

class pyvqnet.xtensor.optimizer.Optimizer(params, lr=0.01)

所有优化器的基类。

Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率,默认值:0.01。

step

pyvqnet.xtensor.optimizer.Optimizer.step()

使用对应优化器的更新方法进行参数更新。

Adadelta

class pyvqnet.xtensor.optimizer.Adadelta(params, lr=0.01, beta=0.99, epsilon=1e-08)

ADADELTA: An Adaptive Learning Rate Method。

参考:https://arxiv.org/abs/1212.5701

\[\begin{split}E(g_t^2) &= \beta * E(g_{t-1}^2) + (1-\beta) * g^2\\ Square\_avg &= \sqrt{ ( E(dx_{t-1}^2) + \epsilon ) / ( E(g_t^2) + \epsilon ) }\\ E(dx_t^2) &= \beta * E(dx_{t-1}^2) + (1-\beta) * (-g*square\_avg)^2 \\ param\_new &= param - lr * Square\_avg\end{split}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • beta – 用于计算平方梯度的运行平均值(默认值:0.99)。

  • epsilon – 添加到分母以提高数值稳定性的常数(默认值:1e-8)。

Returns:

一个 Adadelta 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import Adadelta,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = Adadelta(MM.parameters(),lr=100)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4).astype(np.float64)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()

    opti.step()
    print(MM.a1.weights)
"""
[[ 0.7224208  0.2421015  0.1118234  0.0082053]
[-0.9264768  1.0017226 -0.4860411 -1.7656817]
[ 0.282856   1.7939901  0.7871605 -0.4880418]]
<Parameter 3x4 cpu(0) kfloat32>

[[ 0.6221698  0.1418506  0.0115724 -0.0920456]
[-1.0267278  0.9014716 -0.586292  -1.8659327]
[ 0.1826051  1.6937392  0.6869095 -0.5882927]]
<Parameter 3x4 cpu(0) kfloat32>
"""

Adagrad

class pyvqnet.xtensor.optimizer.Adagrad(params, lr=0.01, epsilon=1e-08)

Adagrad自适应梯度优化器。

参考:https://databricks.com/glossary/adagrad

\[\begin{split}\begin{align} moment\_new &= moment + g * g\\param\_new &= param - \frac{lr * g}{\sqrt{moment\_new} + \epsilon} \end{align}\end{split}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • epsilon – 添加到分母以提高数值稳定性的常数(默认值:1e-8)。

Returns:

一个 Adagrad 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import Adagrad,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = Adagrad(MM.parameters(),lr=100)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()
    opti.step()
    print(MM.a1.weights)
"""
[[ -99.17758  -99.6579   -99.78818  -99.89179]
[-100.82648  -98.89828 -100.38604 -101.66568]
[ -99.61714  -98.10601  -99.11284 -100.38804]]
<Parameter 3x4 cpu(0) kfloat32>

[[-169.88826 -170.36858 -170.49886 -170.60248]
[-171.53716 -169.60895 -171.09671 -172.37637]
[-170.32782 -168.81668 -169.82352 -171.09872]]
<Parameter 3x4 cpu(0) kfloat32>
"""

Adam

class pyvqnet.xtensor.optimizer.Adam(params, lr=0.01, beta1=0.9, beta2=0.999, epsilon=1e-08, amsgrad: bool = False)

Adam优化器,它可以使用一阶矩估计动态调整每个参数的学习率和梯度的二阶矩估计。

参考:https://arxiv.org/abs/1412.6980

\[t = t + 1\]
\[moment\_1\_new=\beta1∗moment\_1+(1−\beta1)g\]
\[moment\_2\_new=\beta2∗moment\_2+(1−\beta2)g*g\]
\[lr = lr*\frac{\sqrt{1-\beta2^t}}{1-\beta1^t}\]

如果参数 amsgrad 为 True

\[moment\_2\_max = max(moment\_2\_max,moment\_2)\]
\[param\_new=param-lr*\frac{moment\_1}{\sqrt{moment\_2\_max}+\epsilon}\]

否则

\[param\_new=param-lr*\frac{moment\_1}{\sqrt{moment\_2}+\epsilon}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • beta1 – 用于计算梯度及其平方的运行平均值的系数(默认值:0.9)。

  • beta2 – 用于计算梯度及其平方的运行平均值的系数(默认值:0.999)。

  • epsilon – 添加到分母以提高数值稳定性的常数(默认值:1e-8)。

  • amsgrad – 是否使用该算法的 AMSGrad 变体(默认值:False)。

Returns:

一个 Adam 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import Adam,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = Adam(MM.parameters(),lr=100)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()

    opti.step()
    print(MM.a1.weights)
"""
[[ -99.17759   -99.6579    -99.788185  -99.8918  ]
[-100.826485  -98.89828  -100.38605  -101.66569 ]
[ -99.61715   -98.10601   -99.11285  -100.38805 ]]
<Parameter 3x4 cpu(0) kfloat32>

[[-199.17725 -199.65756 -199.78784 -199.89145]
[-200.82614 -198.89795 -200.38571 -201.66534]
[-199.61682 -198.10568 -199.1125  -200.3877 ]]
"""

Adamax

class pyvqnet.xtensor.optimizer.Adamax(params, lr=0.01, beta1=0.9, beta2=0.999, epsilon=1e-08)

实现 Adamax 优化器(基于无穷范数的 Adam 变体)。

参考:https://arxiv.org/abs/1412.6980

\[\begin{split}\\t = t + 1\end{split}\]
\[moment\_new=\beta1∗moment+(1−\beta1)g\]
\[norm\_new = \max{(\beta1∗norm+\epsilon, \left|g\right|)}\]
\[lr = \frac{lr}{1-\beta1^t}\]
\[\begin{split}param\_new = param − lr*\frac{moment\_new}{norm\_new}\\\end{split}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • beta1 – 用于计算梯度及其平方的运行平均值的系数(默认值:0.9)。

  • beta2 – 用于计算梯度及其平方的运行平均值的系数(默认值:0.999)。

  • epsilon – 添加到分母以提高数值稳定性的常数(默认值:1e-8)。

Returns:

一个 Adamax 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import Adamax,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = Adamax(MM.parameters(),lr=100)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()

    opti.step()
    print(MM.a1.weights)
"""
[[ -99.17758   -99.6579    -99.788185  -99.89179 ]
[-100.82648   -98.89828  -100.38605  -101.66568 ]
[ -99.61714   -98.10601   -99.11285  -100.38804 ]]
<Parameter 3x4 cpu(0) kfloat32>

[[-199.17758 -199.6579  -199.7882  -199.89178]
[-200.82648 -198.89827 -200.38605 -201.66568]
[-199.61714 -198.106   -199.11285 -200.38803]]
<Parameter 3x4 cpu(0) kfloat32>
"""

RMSProp

class pyvqnet.xtensor.optimizer.RMSProp(params, lr=0.01, beta=0.99, epsilon=1e-08)

RMSprop 均方根传播算法优化器。

参考:https://arxiv.org/pdf/1308.0850v5.pdf

\[s_{t+1} = s_{t} + (1 - \beta)*(g)^2\]
\[param_new = param - \frac{g}{\sqrt{s_{t+1}} + epsilon}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • beta – 用于计算梯度及其平方的运行平均值的系数(默认值:0.99)。

  • epsilon – 添加到分母以提高数值稳定性的常数(默认值:1e-8)。

Returns:

一个 RMSProp 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import RMSProp,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = RMSProp(MM.parameters(),lr=100)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()

    opti.step()
    print(MM.a1.weights)
"""
[[ -999.17804  -999.6584   -999.78864  -999.8923 ]
[-1000.82697  -998.89874 -1000.38654 -1001.6662 ]
[ -999.6176   -998.1065   -999.11334 -1000.38855]]
<Parameter 3x4 cpu(0) kfloat32>

[[-1708.0596 -1708.54   -1708.6702 -1708.7738]
[-1709.7085 -1707.7803 -1709.2681 -1710.5477]
[-1708.4991 -1706.988  -1707.9949 -1709.27  ]]
<Parameter 3x4 cpu(0) kfloat32>
"""

SGD

class pyvqnet.xtensor.optimizer.SGD(params, lr=0.01, momentum=0, nesterov=False)

随机梯度下降优化器。

参考:https://en.wikipedia.org/wiki/Stochastic_gradient_descent

\[\begin{split}\\param\_new=param-lr*g\\\end{split}\]
Parameters:
  • params – 需要优化的模型参数列表。

  • lr – 学习率(默认值:0.01)。

  • momentum – 动量因子(默认值:0)。

  • nesterov – 启用 Nesterov 动量 (默认: False)。

Returns:

一个 SGD 优化器。

Example:

import numpy as np
from pyvqnet.xtensor import SGD,Linear,Module,autograd
from pyvqnet.xtensor import XTensor

class model(Module):
    def __init__(self, name=""):
        super().__init__(name)
        self.a1 = Linear(4,3)
    def forward(self, x, *args, **kwargs):
        return self.a1(x)

MM = model()
opti = SGD(MM.parameters(),lr=100,momentum=0.2)

for i in range(1, 3):
    w = np.arange(24).reshape(1, 2, 3, 4)
    param = XTensor(w)
    param.requires_grad = True
    with autograd.tape():
        y = MM(param)
    y.backward()

    opti.step()
    print(MM.a1.weights)
"""
[[-5999.1777 -6599.6577 -7199.788  -7799.8916]
[-6000.8267 -6598.8984 -7200.386  -7801.6655]
[-5999.617  -6598.106  -7199.113  -7800.388 ]]
<Parameter 3x4 cpu(0) kfloat32>

[[-13199.178 -14519.658 -15839.788 -17159.89 ]
[-13200.826 -14518.898 -15840.387 -17161.666]
[-13199.617 -14518.105 -15839.113 -17160.389]]
<Parameter 3x4 cpu(0) kfloat32>
"""