在 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_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) 的张量为例,这个过程如下:
输入张量:假设有一个张量,其形状为 (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