Pytorch

在 Python 中,lambda 是用来创建匿名函数的关键字。所谓匿名函数,即没有显式定义函数名的函数,通常用于需要临时定义简单函数的场景。

lambda 函数的语法如下:

txt
lambda arguments: expression

其中:

  • arguments 是函数的参数,可以有多个参数,用逗号隔开。
  • expression 是函数的返回值计算表达式。

lambda 函数通常用于需要一个函数,但是又不想正式定义一个函数的场景,比如作为其他函数的参数传递进去,或者在一些函数式编程的场景中使用。

params = [W_xh, W_hh, b_h, W_hq, b_q]
for param in params:
param.requires_grad_(True)

目的是告诉 PyTorch 在模型训练过程中需要计算这些参数的梯度,并且在反向传播时对其进行更新。

Xt*Wxh + Ht−1*Whh=cat(Xt,Ht−1)*cat(Wxh,Whh)

torch.matmul(X, W_xh) + torch.matmul(H, W_hh)

torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))

当一个类实现了 __call__ 方法时,它的实例对象可以像函数一样进行调用。这意味着你可以使用实例对象作为函数来调用,就好像调用一个函数一样。

例如,假设有一个类 MyClass,并且实现了 __call__ 方法:

txt
python
class MyClass:
    def __call__(self, x):
        print("Calling MyClass with argument:", x)

现在,你可以创建一个 MyClass 的实例,并将其作为函数进行调用:

txt
python
obj = MyClass()
obj(10)

输出结果将是:

txt

Calling MyClass with argument: 10

所以
class RNNModelScratch: #@save
"""从零开始实现的循环神经网络模型"""
def __init__(self, vocab_size, num_hiddens, device,
get_params, init_state, forward_fn):
self.vocab_size, self.num_hiddens = vocab_size, num_hiddens
self.params = get_params(vocab_size, num_hiddens, device)
self.init_state, self.forward_fn = init_state, forward_fn
def __call__(self, X, state):
X = F.one_hot(X.T, self.vocab_size).type(torch.float32)
return self.forward_fn(X, state, self.params)

可以这样调用:

net = RNNModelScratch(len(vocab), num_hiddens, d2l.try_gpu(), get_params,
init_rnn_state, rnn)

Y, new_state = net(X.to(d2l.try_gpu()), state)

**kwargs 是 Python 中的一种特殊语法,用于接收任意数量的关键字参数(keyword arguments)。在函数或方法的定义中,**kwargs 会将传递给函数的未命名关键字参数收集到一个字典中,其中字典的键是参数名,值是参数值。

在这段代码中,**kwargs 被用作 NWKernelRegression 类的初始化方法 __init__ 的参数。通过使用 **kwargs,可以接收任意数量的关键字参数,并将它们存储为类的属性。这样做可以使代码更加灵活,允许用户在创建 NWKernelRegression 实例时传递额外的参数。

例如,如果你创建了一个 NWKernelRegression 实例时传递了额外的参数,比如 model = NWKernelRegression(param1=10, param2='abc'),那么这些额外的参数会被收集到 kwargs 字典中,字典的键是参数名,值是参数值。你可以根据需要在 __init__ 方法中使用这些参数。

总而言之,**kwargs 允许在函数或方法定义中接收任意数量的关键字参数,并将它们保存为字典以供后续使用。

在 PyTorch 中,self.fc1=nn.Linear(16*5*5,120) 定义了一个全连接层(或称为线性层)。具体来说:

  • 16*5*5 是输入特征的数量,即展平后的张量长度。
  • 120 是全连接层输出的特征数量。

这个全连接层会将形状为 400400 的输入(展平后的张量)转换为形状为 120120 的输出。这个层的作用是通过一个权重矩阵和偏置向量对输入进行线性变换,以得到最终的输出。

是如何展平的?

展平(Flatten)是将多维张量转换为一维向量的过程。以一个形状为 (16 \times 5 \times 5) 的张量为例,这个过程如下:

  1. 输入张量:假设有一个张量,其形状为 (16 \times 5 \times 5),其中 (16) 是通道数,(5) 和 (5) 是每个通道的高和宽。

  2. 展平过程

    • 按照通道、行和列的顺序,将所有元素排列成一个一维向量。
    • 例如,假设张量的元素是 ( \text{A}_{i,j,k} ),展平后你将得到一个长度为 (16 \times 5 \times 5 = 400) 的一维向量。
  3. 展平后的结果

    • 这个一维向量的长度为 (400),即将原张量的所有数据连续地排列在一起。

在实际代码中,比如在 PyTorch 中,展平通常通过 nn.Flatten() 或者在前向传播方法中使用 torch.flatten() 来完成。

轴心时代

在优化算法中,momentum 是一个技术,用于加速收敛并减少震荡。具体来说:

  • momentum: 是一个动量因子,它在更新参数时考虑了之前梯度的影响。它通过引入过去梯度的加权平均来调整当前的梯度更新。
  • 作用: 它帮助优化过程在高曲率方向上加速,在低曲率方向上减缓,从而使优化过程更稳定,减少了震荡和加速收敛。

optim.SGD 中,momentum=0.9 表示将前一步梯度的 90% 加入到当前梯度更新中。

ubuntu20.04可以装ROS 2 humble