自用——python代码学习(杂乱)

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) 

这行代码执行了两个主要的操作:

  1. 创建了一个均方误差(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=1N(yiy^i)2

    其中,( N ) 是样本数量,( y_i ) 是真实值,( \hat{y}_i ) 是预测值。

  2. 使用 .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)问题的输入数据点。

详细解释:

  1. self.pde_x:这是一个属性,用于存储生成的张量。在Python中,self 关键字用于引用类实例的属性。

  2. 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 之间的浮点数。

  1. requires_grad=True:这个参数设置为 True 表示张量将参与梯度计算。在神经网络训练过程中,这允许PyTorch自动计算相对于这些张量的梯度,这对于反向传播算法是必要的。

  2. dtype=torch.float32:这指定了张量的数据类型为32位浮点数。这是深度学习中最常用的数据类型,提供了足够的精度来进行数值计算。

  3. device=self.device:这指定了张量应该存储在哪个设备上。self.device 是类的另一个属性,它应该在类的其他地方被定义,并且指向了张量应该被存储的设备(例如CPU或GPU)。

最后,整个表达式 2 * torch.rand(N_pde, 1) - 1 的结果是创建一个形状为 (N_pde, 1) 的张量,其中的每个元素都是从均匀分布 U(-1, 1) 中随机抽取的。这种类型的数据通常用于生成PDE问题中的输入点,其中输入通常被限制在一个特定的范围内,例如在 -11 之间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值