多标签分类与回归:数据处理与模型训练全解析
立即解锁
发布时间: 2025-09-03 00:38:38 阅读量: 19 订阅数: 40 AIGC 


深度学习实战:从零开始
### 多标签分类与回归:数据处理与模型训练全解析
#### 潘达斯(Pandas)基础操作与数据准备
Pandas 是一个快速且灵活的库,是每个数据科学家 Python 工具箱的重要组成部分。不过,它的 API 可能会让人感到困惑,需要一些时间来熟悉。以下是一些简单的 Pandas 操作示例:
```python
a = [0, 1, 1, 2, 2, 3, 3, 4]
import pandas as pd
df1 = pd.DataFrame({'a': a})
df1['b'] = [10, 20, 30, 40]
print(df1['a'] + df1['b'])
```
输出结果:
```
0 11
1 22
2 33
3 44
dtype: int64
```
#### 从 DataFrame 到 DataLoaders 的转换
在进行模型训练之前,我们需要将数据转换为合适的格式。通常建议使用数据块 API 来创建 `DataLoaders` 对象,它兼具灵活性和简单性。以下是相关的步骤和概念:
- **相关类介绍**:
- **Dataset**:返回单个项目的自变量和因变量的元组。
- **DataLoader**:提供小批量数据的迭代器,每个小批量包含一批自变量和一批因变量。
- **Datasets**:包含训练集 `Dataset` 和验证集 `Dataset` 的迭代器。
- **DataLoaders**:包含训练集 `DataLoader` 和验证集 `DataLoader` 的对象。
#### 构建 DataBlock
我们逐步构建 `DataBlock`,并使用笔记本检查数据。以下是具体步骤:
1. **创建无参数的 DataBlock**:
```python
from fastai.vision.all import *
dblock = DataBlock()
dsets = dblock.datasets(df)
print(dsets.train[0])
```
默认情况下,数据块假设我们有输入和目标,因此会返回 DataFrame 的一行两次。
2. **指定 get_x 和 get_y 函数**:
```python
dblock = DataBlock(get_x = lambda r: r['fname'], get_y = lambda r: r['labels'])
dsets = dblock.datasets(df)
print(dsets.train[0])
```
这里使用了 Python 的 `lambda` 关键字,它是定义和引用函数的快捷方式。不过,`lambda` 函数不支持序列化,如果需要导出训练后的 `Learner`,建议使用更详细的函数定义方式:
```python
def get_x(r): return r['fname']
def get_y(r): return r['labels']
dblock = DataBlock(get_x = get_x, get_y = get_y)
dsets = dblock.datasets(df)
print(dsets.train[0])
```
3. **处理自变量和因变量**:
```python
path = Path('/your/path')
def get_x(r): return path/'train'/r['fname']
def get_y(r): return r['labels'].split(' ')
dblock = DataBlock(get_x = get_x, get_y = get_y)
dsets = dblock.datasets(df)
print(dsets.train[0])
```
4. **使用合适的块类型**:
由于我们需要处理多个标签,因此使用 `MultiCategoryBlock` 代替 `CategoryBlock`:
```python
dblock = DataBlock(blocks=(ImageBlock, MultiCategoryBlock),
get_x = get_x, get_y = get_y)
dsets = dblock.datasets(df)
print(dsets.train[0])
```
这里使用了独热编码(One-Hot Encoding),即用一个由 0 和 1 组成的向量来表示类别。例如:
```python
import torch
idxs = torch.where(dsets.train[0][1]==1.)[0]
print(dsets.train.vocab[idxs])
```
5. **指定验证集分割函数**:
```python
def splitter(df):
train = df.index[~df['is_valid']].tolist()
valid = df.index[df['is_valid']].tolist()
return train,valid
dblock = DataBlock(blocks=(ImageBlock, MultiCategoryBlock),
splitter=splitter,
get_x=get_x,
get_y=get_y)
dsets = dblock.datasets(df)
print(dsets.train[0])
```
6. **确保数据大小一致**:
```python
dblock = DataBlock(blocks=(ImageBlock, MultiCategoryBlock),
splitter=splitter,
```
0
0
复制全文
相关推荐









