kaiming初始化
init_method = torch.nn.init.kaiming_uniform_
- 这段代码用的是PyTorch深度学习框架中的一个函数,名为
kaiming_uniform_
,用于按照Kaiming初始化(也称为He初始化)的方法填充给定的张量(Tensor)。 - Kaiming初始化是一种权重初始化策略,特别适用于ReLU激活函数及其变体的神经网络层。这种初始化方法旨在减少训练初期的梯度消失问题,从而加速网络的收敛。
函数参数解释:
def kaiming_uniform_(tensor: Tensor,
a: float = 0,
mode: str = "fan_in",
nonlinearity: str = "leaky_relu",
generator: Optional[Generator] = None) -> Tensor
tensor
: 要初始化的n维torch.Tensor
。这是函数的直接操作对象,函数会修改这个张量的值。a
: 浮点数,表示ReLU激活函数的负斜率(当使用’leaky_relu’激活函数时使用,默认为0)。mode
: 字符串,指定是使用’fan_in’(默认)还是’fan_out’。'fan_in’意味着保持前向传播中权重方差的大小,而 'fan_out’意味着保持反向传播中的方差大小。nonlinearity
: 非线性函数的名称(例如nn.functional
的名称),建议仅与’relu’或’leaky_relu’(默认)一起使用。generator
: 用于采样的torch.Generator
对象,默认为None,表示使用随机数生成器的默认设置。
Kaiming初始化的计算方式如下:
设定一个界限bound
,其计算公式为bound = gain * sqrt((3 / fan_mode))
,其中gain
是一个根据激活函数类型确定的系数(对于ReLU和Leaky ReLU,默认gain=1
),fan_mode
是输入或输出的神经元数量,取决于mode
的选择。
然后,tensor
中的每个元素将从均匀分布U(- bound, bound)
中随机采样。
这种初始化方法在He等人的论文《Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification》(2015年)中被提出,目的是为了在训练深度神经网络时,特别是在使用ReLU及其变体作为激活函数时,提供一种有效的权重初始化策略。
确定损失函数并移动到指定设备
loss_func = nn.MSELoss().to(device)
这行代码执行了两个主要的操作:
-
创建了一个均方误差(Mean Squared Error, MSE)损失函数的实例,并将其赋值给变量
loss_func
。MSE损失函数是回归问题中常用的损失函数,用于衡量预测值与真实值之间差异的平方的平均值。具体来说,MSE损失函数的计算公式为:M S E = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 MSE=N1i=1∑N(yi−y^i)2
其中,( N ) 是样本数量,( y_i ) 是真实值,( \hat{y}_i ) 是预测值。
-
使用
.to(device)
方法将损失函数实例移动到了指定的计算设备上。在PyTorch中,device
通常是一个字符串,表示模型和数据应该在哪个设备上运行,例如'cpu'
或'cuda:0'
。这一步确保了损失函数的计算将在正确的设备上执行,这在分布式训练或使用GPU加速时尤其重要。- 如果
device
设置为'cuda'
或'cuda:0'
,则损失函数将被移动到默认的GPU上。 - 如果
device
设置为'cpu'
,则损失函数将在CPU上执行计算。
- 如果
torch.randn()
- 代码:
self.pde_x = 2 * torch.rand(N_pde, 1, requires_grad=True, dtype=torch.float32, device=self. device) - 1
这行代码是在使用PyTorch库创建一个张量(Tensor),这个张量代表了一组随机生成的、用于偏微分方程(PDE)问题的输入数据点。
详细解释:
-
self.pde_x
:这是一个属性,用于存储生成的张量。在Python中,self
关键字用于引用类实例的属性。 -
2 * torch.rand(N_pde, 1)
:torch.rand
是PyTorch中的一个函数,用于生成一个给定形状的张量,其中的元素是从均匀分布 U(0, 1) 中随机抽取的。这里的N_pde
是一个整数,表示要生成的随机数的数量。1
表示生成的张量在除了第一个维度以外的其他维度上的大小,这里1
表示每个随机数是一个1维的向量。
运行 2 * torch.rand(N_pde, 1)
这行代码后,你会得到一个形状为 (N_pde, 1)
的张量,其中包含了从均匀分布 U(0, 1) 中随机抽取的浮点数。每个元素都是一个介于 0 到 1 之间的随机数,这些随机数以 1 维向量的形式排列。
例如,如果 N_pde
是 5,那么运行这段代码后,你可能会得到类似下面的张量:
tensor([[-0.0900],
[ 0.4500],
[ 0.8200],
[-0.2300],
[ 0.9900]])
这个张量有 5 行 1 列,每一行都是一个随机生成的介于 -1 和 1 之间的浮点数。
-
requires_grad=True
:这个参数设置为True
表示张量将参与梯度计算。在神经网络训练过程中,这允许PyTorch自动计算相对于这些张量的梯度,这对于反向传播算法是必要的。 -
dtype=torch.float32
:这指定了张量的数据类型为32位浮点数。这是深度学习中最常用的数据类型,提供了足够的精度来进行数值计算。 -
device=self.device
:这指定了张量应该存储在哪个设备上。self.device
是类的另一个属性,它应该在类的其他地方被定义,并且指向了张量应该被存储的设备(例如CPU或GPU)。
最后,整个表达式 2 * torch.rand(N_pde, 1) - 1
的结果是创建一个形状为 (N_pde, 1)
的张量,其中的每个元素都是从均匀分布 U(-1, 1) 中随机抽取的。这种类型的数据通常用于生成PDE问题中的输入点,其中输入通常被限制在一个特定的范围内,例如在 -1
到 1
之间。