在 Python 中,lambda 是用来创建匿名函数的关键字。所谓匿名函数,即没有显式定义函数名的函数,通常用于需要临时定义简单函数的场景。
lambda 函数的语法如下:
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__ 方法:
python
class MyClass:
    def __call__(self, x):
        print("Calling MyClass with argument:", x)现在,你可以创建一个 MyClass 的实例,并将其作为函数进行调用:
python
obj = MyClass()
obj(10)输出结果将是:
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_hiddensself.params = get_params(vocab_size, num_hiddens, device)self.init_state, self.forward_fn = init_state, forward_fndef __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) 的张量为例,这个过程如下:
输入张量:假设有一个张量,其形状为 (16 \times 5 \times 5),其中 (16) 是通道数,(5) 和 (5) 是每个通道的高和宽。
展平过程:
- 按照通道、行和列的顺序,将所有元素排列成一个一维向量。
 - 例如,假设张量的元素是 ( \text{A}_{i,j,k} ),展平后你将得到一个长度为 (16 \times 5 \times 5 = 400) 的一维向量。
 
展平后的结果:
- 这个一维向量的长度为 (400),即将原张量的所有数据连续地排列在一起。
 
在实际代码中,比如在 PyTorch 中,展平通常通过 nn.Flatten() 或者在前向传播方法中使用 torch.flatten() 来完成。
轴心时代
在优化算法中,momentum 是一个技术,用于加速收敛并减少震荡。具体来说:
momentum: 是一个动量因子,它在更新参数时考虑了之前梯度的影响。它通过引入过去梯度的加权平均来调整当前的梯度更新。- 作用: 它帮助优化过程在高曲率方向上加速,在低曲率方向上减缓,从而使优化过程更稳定,减少了震荡和加速收敛。
 
在 optim.SGD 中,momentum=0.9 表示将前一步梯度的 90% 加入到当前梯度更新中。
ubuntu20.04可以装ROS 2 humble