PyTorch神经网络构建与图像分类基础
立即解锁
发布时间: 2025-09-01 01:19:27 阅读量: 3 订阅数: 17 AIGC 

# PyTorch 神经网络构建与图像分类基础
## 1. PyTorch 神经网络基础操作
### 1.1 中间层值的获取
在某些场景下,获取神经网络中间层的值是很有帮助的。PyTorch 提供了两种方式来获取神经网络的中间值:
- **直接调用层**:将层当作函数直接调用。示例代码如下:
```python
input_to_hidden = mynet.input_to_hidden_layer(X)
hidden_activation = mynet.hidden_layer_activation(input_to_hidden)
print(hidden_activation)
```
需要注意的是,要先调用 `input_to_hidden_layer` 激活函数,因为其输出是 `hidden_layer_activation` 层的输入。
- **在 forward 方法中指定**:以一个简单的神经网络为例,代码如下:
```python
import torch
import torch.nn as nn
class NeuralNet(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):
hidden1 = self.input_to_hidden_layer(x)
hidden2 = self.hidden_layer_activation(hidden1)
output = self.hidden_to_output_layer(hidden2)
return output, hidden2
device = 'cuda' if torch.cuda.is_available() else 'cpu'
mynet = NeuralNet().to(device)
# 获取隐藏层值
mynet(X)[1]
```
这里 `mynet(X)[0]` 是网络前向传播的最终输出,而 `mynet(X)[1]` 是隐藏层激活后的输出。
### 1.2 使用 Sequential 方法构建神经网络
之前我们通过手动构建神经网络的每个层来实现神经网络。现在,我们可以使用 `Sequential` 类来简化神经网络架构的定义。以下是具体步骤:
1. **定义玩具数据集**:
```python
x = [[1, 2], [3, 4], [5, 6], [7, 8]]
y = [[3], [7], [11], [15]]
```
2. **导入相关包并定义设备**:
```python
import torch
import torch.nn as nn
import numpy as np
from torch.utils.data import Dataset, DataLoader
device = 'cuda' if torch.cuda.is_available() else 'cpu'
```
3. **定义数据集类**:
```python
class MyDataset(Dataset):
def __init__(self, x, y):
self.x = torch.tensor(x).float().to(device)
self.y = torch.tensor(y).float().to(device)
def __getitem__(self, ix):
return self.x[ix], self.y[ix]
def __len__(self):
return len(self.x)
```
4. **定义数据集和数据加载器对象**:
```python
ds = MyDataset(x, y)
dl = DataLoader(ds, batch_size=2, shuffle=True)
```
5. **使用 Sequential 方法定义模型架构**:
```python
model = nn.Sequential(
nn.Linear(2, 8),
nn.ReLU(),
nn.Linear(8, 1)
).to(device)
```
这里 `nn.Linear(2, 8)` 接受二维输入并为每个数据点提供八维输出,`nn.ReLU()` 对八维输出执行 ReLU 激活,最后 `nn.Linear(8, 1)` 将八维输入转换为一维输出。
6. **打印模型摘要**:
```python
# 安装并导入打印模型摘要的包
!pip install torch_summary
from torchsummary import summary
# 打印模型摘要
summary(model, torch.zeros(1, 2))
```
输出的第一层形状为 `(-1, 8)`,其中 `-1` 表示数据点数量可以和批量大小一样多,`8` 表示每个数据点有八维输出。后续层的解释类似。
7. **定义损失函数和优化器并训练模型**:
```python
loss_func = nn.MSELoss()
from torch.optim import SGD
opt = SGD(model.parameters(), lr=0.001)
import time
loss_history = []
start = time.time()
for _ in range(50):
for ix, iy in dl:
opt.zero_grad()
loss_value = loss_func(model(ix), iy)
loss_value.backward()
o
```
0
0
复制全文
相关推荐









