PyTorch基础:构建神经网络全流程解析
立即解锁
发布时间: 2025-09-01 01:16:37 阅读量: 5 订阅数: 15 AIGC 


现代计算机视觉与PyTorch
### PyTorch 基础:构建神经网络全流程解析
在深度学习领域,PyTorch 是一个强大且广泛使用的框架。本文将详细介绍如何使用 PyTorch 构建神经网络,从基础的数据集初始化到模型训练,再到预测和自定义损失函数的实现,为你呈现一个完整的神经网络构建流程。
#### 1. 使用 PyTorch 构建神经网络
在深入使用 PyTorch 之前,我们先了解一下神经网络的基本组件:
- 隐藏层的数量
- 隐藏层中的单元数量
- 各层执行的激活函数
- 我们试图优化的损失函数
- 与神经网络相关的学习率
- 用于构建神经网络的数据批量大小
- 前向和反向传播的轮数
接下来,我们将使用 PyTorch 在一个简单的玩具数据集上实现这些组件。这个玩具问题是两个数字的简单加法,以下是具体步骤:
##### 1.1 定义输入和输出值
```python
import torch
x = [[1,2],[3,4],[5,6],[7,8]]
y = [[3],[7],[11],[15]]
```
这里输入和输出都是列表的列表,输入列表中值的总和等于输出列表中的值。
##### 1.2 将输入列表转换为张量对象
```python
X = torch.tensor(x).float()
Y = torch.tensor(y).float()
```
将张量对象转换为浮点对象是一个好习惯,因为它们最终会与小数(权重)相乘。同时,我们将输入和输出数据注册到设备上(如果有 GPU 则使用 `cuda`,否则使用 `cpu`):
```python
device = 'cuda' if torch.cuda.is_available() else 'cpu'
X = X.to(device)
Y = Y.to(device)
```
##### 1.3 定义神经网络架构
- **导入 `torch.nn` 模块**:该模块包含有助于构建神经网络模型的函数。
```python
import torch.nn as nn
```
- **创建神经网络类**:我们创建一个名为 `MyNeuralNet` 的类,继承自 `nn.Module`,这是所有神经网络模块的基类。
```python
class MyNeuralNet(nn.Module):
def __init__(self):
super().__init__()
self.input_to_hidden_layer = nn.Linear(2,8)
self.hidden_layer_activation = nn.ReLU()
self.hidden_to_output_layer = nn.Linear(8,1)
def forward(self, x):
x = self.input_to_hidden_layer(x)
x = self.hidden_layer_activation(x)
x = self.hidden_to_output_layer(x)
return x
```
这里定义了一个包含输入到隐藏层、隐藏层激活函数(ReLU)和隐藏到输出层的神经网络。目前,层的数量和激活函数的选择是任意的。
为了更好地理解 `nn.Linear` 方法,我们可以打印其输出:
```python
print(nn.Linear(2, 7))
```
输出结果为:
```
Linear(in_features=2, out_features=7, bias=True)
```
这表明该线性方法接受两个输入值并输出七个值,并且还有一个偏置参数。除了 ReLU 激活函数,常用的激活函数还包括 Sigmoid、Softmax 和 Tanh。
##### 1.4 访问初始权重
- **创建模型实例**:
```python
mynet = MyNeuralNet().to(device)
```
- **访问各层的权重和偏置**:
```python
# 访问输入到隐藏层的权重
print(mynet.input_to_hidden_layer.weight)
```
- **获取神经网络的所有参数**:
```python
for par in mynet.parameters():
print(par)
```
如果希望每次运行代码时权重初始化保持一致,可以在创建类对象实例之前使用 `torch.manual_seed(0)` 设置随机种子。
另外,我们还可以使用 `nn.Parameter` 函数来定义模型:
```python
class MyNeuralNet(nn.Module):
def __init__(self):
super().__init__()
self.input_to_hidden_layer = nn.Parameter(torch.rand(2,8))
self.hidden_layer_activation = nn.ReLU()
self.hidden_to_output_layer = nn.Parameter(torch.rand(8,1))
def forward(self, x):
x = x @ self.input_to_hidden_layer
x = self.hidden_layer_activation(x)
x = x @ self.hidden_to_output_layer
return x
```
##### 1.5 定义损失函数
由于我们要预测连续输出,因此选择均方误差(MSE)作为损失函数:
```python
loss_func = nn.MSELoss()
_Y = mynet(X)
loss_value = loss_func(_Y,Y)
print(loss_value)
```
其他常见的损失函数包括 `CrossEntropyLoss`(用于多分类问题)和 `BCELoss`(用于二分类问题)。
##### 1.6 定义优化器
我们使用随机梯度下降(SGD)作为优化器,它的输入是神经网络的参数和学习率:
```python
from torch.optim import SGD
opt = SGD(mynet.parameters(), lr = 0.001)
```
##### 1.7 执行训练步骤
```python
loss_history = []
for _ in range(50):
opt.zero_grad()
loss_value = loss_func(mynet(X),Y)
loss_value.backward()
opt.step()
loss_history.append(loss_value.item())
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(loss_history)
plt.title('Loss variation over increasing epochs')
plt.xlabel('epochs')
plt.ylabel('loss value')
```
随着训练轮数的增加,损失值会逐渐减小。
#### 2. 数据集、数据加载器和批量大小
在神经网络中,批量大小是一个重要的超参数,它指的是用于计算损失值或更新权重的数据点数量。当数据集非常大时,使用全部数据进行一次权重更新可能会导致内存不足,而使用批量大小可以解决这个问题。以下是具体步骤:
##### 2.1 导入必要的模块
```python
from torch.utils.data
```
0
0
复制全文
相关推荐










