以下是一个行人属性识别的训练代码示例,使用了PyTorch框架:
```python
import os
import argparse
import torch
from torch import nn, optim
from torch.utils.data import DataLoader
from torchvision import transforms
from dataset import PA100K
from model import BaselineModel
parser = argparse.ArgumentParser()
parser.add_argument('--data_dir', type=str, default='./data')
parser.add_argument('--batch_size', type=int, default=64)
parser.add_argument('--lr', type=float, default=0.001)
parser.add_argument('--num_epochs', type=int, default=100)
parser.add_argument('--model_dir', type=str, default='./models')
args = parser.parse_args()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
train_transforms = transforms.Compose([
transforms.Resize((256, 128)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
])
val_transforms = transforms.Compose([
transforms.Resize((256, 128)),
transforms.ToTensor(),
])
train_dataset = PA100K(args.data_dir, 'train', transform=train_transforms)
val_dataset = PA100K(args.data_dir, 'val', transform=val_transforms)
train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=args.batch_size, shuffle=False, num_workers=4)
model = BaselineModel(num_classes=26).to(device)
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=args.lr)
for epoch in range(args.num_epochs):
train_loss = 0.0
train_acc = 0.0
val_loss = 0.0
val_acc = 0.0
model.train()
for images, labels in train_loader:
images = images.to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
train_loss += loss.item() * images.size(0)
preds = (torch.sigmoid(outputs) > 0.5).float()
train_acc += torch.sum(preds == labels).item()
train_loss /= len(train_dataset)
train_acc /= len(train_dataset)
model.eval()
with torch.no_grad():
for images, labels in val_loader:
images = images.to(device)
labels = labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
val_loss += loss.item() * images.size(0)
preds = (torch.sigmoid(outputs) > 0.5).float()
val_acc += torch.sum(preds == labels).item()
val_loss /= len(val_dataset)
val_acc /= len(val_dataset)
print('Epoch [{}/{}], Train Loss: {:.4f}, Train Acc: {:.4f}, Val Loss: {:.4f}, Val Acc: {:.4f}'
.format(epoch+1, args.num_epochs, train_loss, train_acc, val_loss, val_acc))
if (epoch+1) % 10 == 0:
save_path = os.path.join(args.model_dir, 'model-{}.pt'.format(epoch+1))
torch.save(model.state_dict(), save_path)
```
这段代码使用了行人属性识别数据集PA100K,并使用了一个基线模型`BaselineModel`进行训练。具体来说,这段代码中:
- `args`用于定义一些训练的超参数,例如数据集的路径、批次大小、学习率、训练轮数等等。
- 在`train_transforms`和`val_transforms`中定义了数据预处理的方式,包括将图片大小调整为256x128、随机水平翻转、转换为张量等等。
- 使用`DataLoader`分别对训练集和验证集进行批量读取。
- 定义了一个基线模型`BaselineModel`,用于行人属性识别任务,并定义了损失函数`BCEWithLogitsLoss`和优化器`Adam`。
- 在每个训练周期内,对训练集进行迭代训练,并在验证集上进行验证。
- 输出训练过程中的损失和精度,并每10个周期保存一次模型。
这段代码只是一个示例,实际的训练过程中可能还需要进行更多的调优和改进。