pytorch系列 ---5以 linear_regression为例讲解神经网络实现基本步骤以及解读nn.Linear函数

本文详细解读了PyTorch中nn.Linear的源码,阐述了神经网络实现的基本步骤,并通过线性回归模型的训练过程,展示了损失函数随迭代变化的情况。

本文主要讲述最简单的线性回归函数:
y = w x + b y=wx+b y=wx+b在pytorch的实现,主要包括神经网络实现的基本步骤nn.Linear的源码解读

1. nn.Linear 源码解读

先看一下Linear类的实现:
源代码网址:https://pytorch.org/docs/stable/_modules/torch/nn/modules/linear.html

Linear继承于nn.Module,内部函数主要有__init__reset_parameters, forwardextra_repr函数

在这里插入图片描述

  1. __init__(self, in_features, out_features, bias=True)
  • in_features:前一层网络神经元的个数
  • out_features: 该网络层神经元的个数
    以上两者决定了weight的形状[out_features , in_features]
  • bias: 网络层是否有偏置,默认存在,且维度为[out_features ],若bias=False,则该网络层无偏置。

接下来看一下,输入该网络层的形状(N, *, in_features),其中N为批量处理过成中每批数据的数量,*表示,单个样本数据中间可以包含很多维度,但是单个数据的最后一个维度的形状一定是in_features.

经过该网络输出的形状为(N, *, out_features),其中计算过程为:

[ N , ∗ , i n _ f e a t u r e s ] ∗ [ o u t _ f e a t u r e s , i n _ f e a t u r e s ] T = [ N , ∗ , o u t _ f e a t u r e s ] [N, *, in\_{features}] * {[out\_{features }, in\_{features}]}^T = [N, *, out\_{features}] [N,,in_features][out_features,

<think>我们正在分析一个简单的线性回归模型类定义代码。代码使用PyTorch框架,定义了一个名为LinearRegression的类,该类继承自nn.Module。 代码片段如下: ```python class LinearRegression(nn.Module): def __init__(self): super(LinearRegression,self).__init__() self.linear = nn.Linear(13,1) ``` 我们将逐步解释这段代码的运行逻辑: 1. **类定义**: - `class LinearRegression(nn.Module):` 定义了一个新的类`LinearRegression`,它继承自PyTorch的`nn.Module`类。这意味着`LinearRegression`类将拥有`nn.Module`的所有特性,包括管理参数、提供训练方法等。 2. **`__init__`方法**: - `def __init__(self):` 是类的构造函数,在创建类的实时被调用。 - 在构造函数中,首先调用父类`nn.Module`的构造函数:`super(LinearRegression,self).__init__()`。这是Python中继承机制的关键步骤,确保父类被正确初始化[^4][^5]。如果不调用父类的构造函数,可能会导致一些内部机制无法正常工作(如,神经网络模块的参数不会被正确注册)。 3. **定义子模块**: - `self.linear = nn.Linear(13,1)` 创建了一个线性层(全连接层),并将其赋值给实变量`linear`。 - `nn.Linear(13,1)` 表示一个输入特征数为13,输出特征数为1的线性变换层。该层包含权重参数(一个13×1的矩阵)和偏置参数(一个1维向量)。这些参数会在训练过程中被优化。 4. **参数管理**: - 由于`LinearRegression`类继承自`nn.Module`,当我们在构造函数中通过`nn.Linear`创建子模块并将其赋值给实变量(如`self.linear`)时,`nn.Module`会自动检测并注册这些子模块及其参数。这样,当我们调用`model.parameters()`时,PyTorch就可以收集到整个模型的所有可训练参数(即线性层的权重和偏置)[^1][^3]。 5. **前向传播**: - 虽然这段代码没有显示定义`forward`方法,但在实际使用中,我们必须在类中定义`forward`方法,以实现从输入到输出的计算过程。如: ```python def forward(self, x): return self.linear(x) ``` - 这样,当我们创建`LinearRegression`的实并传入输入数据时(如`model(input)`),PyTorch会自动调用`forward`方法。 总结运行逻辑: - 创建`LinearRegression`实时,先调用父类`nn.Module`的构造函数,然后创建一个输入维度为13、输出维度为1的线性层。 - 该线性层具有可训练参数(权重和偏置),这些参数会被自动注册到模型中。 - 在后续使用中,需要通过定义`forward`方法来实现模型的前向计算。 如果不定义`forward`方法,直接使用模型进行前向传播会报错(因为`nn.Module`的`forward`是抽象方法)。因此,完整的类定义应该包括`forward`方法: ```python class LinearRegression(nn.Module): def __init__(self): super(LinearRegression,self).__init__() self.linear = nn.Linear(13,1) def forward(self, x): return self.linear(x) ``` 这样,我们就可以通过以下方式使用模型: ```python model = LinearRegression() # 实化模型 output = model(input_data) # 前向传播:自动调用forward方法 ``` **相关问题**: 1.PyTorch中为什么不直接调用`forward`方法而使用`__call__`? 2. 如果忘记调用`super().__init__()`会有什么后果? 3. 如何查看`LinearRegression`模型的参数? 4. 如何修改代码以实现多元线性回归(多个输出)? </think>### LinearRegression类代码运行逻辑解析 以下是您提供的线性回归模型类代码的详细运行逻辑分析: ```python class LinearRegression(nn.Module): def __init__(self): super(LinearRegression,self).__init__() self.linear = nn.Linear(13,1) ``` #### 1. 类定义 (`class LinearRegression(nn.Module):`) - 创建一个名为 `LinearRegression` 的新类 - 继承自 PyTorch 的核心神经网络模块基类 `nn.Module`[^1] - 继承使 `LinearRegression` 自动获得神经网络的所有基础功能(参数管理、GPU支持、序列化等) #### 2. 构造函数 (`def __init__(self):`) - 类的初始化方法,在创建类实时自动调用 - `self` 参数指向当前对象实 - 主要功能是初始化模型的结构和参数 #### 3. 父类初始化 (`super(LinearRegression,self).__init__()`) - **关键步骤**:调用父类 `nn.Module` 的构造函数[^4][^5] - `super()` 函数动态获取父类引用,避免硬编码类名[^2] - 确保正确初始化神经网络基础设施: - 注册模型参数(权重和偏置) - 初始化梯度计算机制 - 设置模型训练/评估状态标志 - 省略此调用会导致模型无法正常工作(如参数不被识别)[^3] #### 4. 定义线性层 (`self.linear = nn.Linear(13,1)`) - 创建具体的神经网络层: - `nn.Linear` 表示全连接层(线性变换) - 参数 `13`:输入特征维度(对应波士顿房价数据集的13个特征) - 参数 `1`:输出维度(房价预测值) - 自动初始化参数: - 权重矩阵 $W \in \mathbb{R}^{1 \times 13}$ - 偏置向量 $b \in \mathbb{R}^{1}$ - PyTorch 会自动将这些参数注册为可训练参数 #### 5. 隐含的前向传播方法 - 虽然代码中未显式定义 `forward` 方法,但实际使用时需要添加: ```python def forward(self, x): return self.linear(x) ``` - 前向传播计算:$y = Wx + b$ - 输入 $x \in \mathbb{R}^{batch\_size \times 13}$,输出 $y \in \mathbb{R}^{batch\_size \times 1}$ #### 完整模型结构示意图 ``` 输入 (13维特征) ↓ [线性层: nn.Linear(13,1)] ↓ 输出 (1维预测值) ``` ### 使用示 ```python # 创建模型实 model = LinearRegression() # 输入样本 (batch_size=4, 特征数=13) input_data = torch.randn(4, 13) # 前向传播 output = model(input_data) # 输出形状 [4, 1] ``` ### 关键点总结 1. **继承机制**:通过继承 `nn.Module` 获得神经网络基础能力 2. **父类初始化**:必须调用 `super().__init__()` 初始化底层基础设施[^5] 3. **参数注册**:`nn.Linear` 自动创建并注册可训练参数 4. **维度设计**:`nn.Linear(13,1)` 匹配波士顿数据集特征维度
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值