提高模型复用性,让模型对应的配置更加清晰,代码书写条理
学习自https://zhuanlan.zhihu.com/p/409662511
Project
├── checkpoints # 存放模型
├── data # 定义各种用于训练测试的数据集
├── eval.py # 测试代码
├── loss.py # 定义的各种loss
├── metrics.py # 定义约定俗成的评价指标
├── model/src # 定义实验中的模型
├── options.py # 定义各种实验的参数,以命令行形式传入
├── README.md # 介绍report
├── scripts # 训练、测试脚本(训练、测试的运行命令)
├── train.py # 训练代码
└── utils # 训练工具代码
文章目录
- Checkpoints
- Scripts
- options.py
- train.py
Checkpoints
训练好的模型放在checkpoints里面,通常保存训练过程中的中间结果。主要包括:模型权重文件、模型配置文件、优化器和日志文件等。
Scripts
每次训练或者测试用的脚本命令。
- 训练脚本:用于执行模型训练的脚本文件,通常包括定义模型、加载数据、设置损失函数和优化器、执行循环等步骤。
- 评估脚本:用于评估模型性能的脚本文件。加载训练好的模型或者指定的checkpoints文件,对模型在测试集或验证集上的表现进行评估。
- 预测脚本:……
- 数据预处理脚本:用于数据预处理和准备的脚本文件。
options.py
- 定义实验参数。
def parse_common_args(parser):
parser.add_argument('--model_type', type=str, default='base_model', help='used in model_entry.py')
parser.add_argument('--data_type', type=str, default='base_dataset', help='used in data_entry.py')
parser.add_argument('--save_prefix', type=str, default='pref', help='some comment for model or test result dir')
parser.add_argument('--load_model_path', type=str, default='checkpoints/base_model_pref/0.pth', help='model path for pretrain or test')
parser.add_argument('--load_not_strict', action='store_true', help='allow to load only common state dicts')
parser.add_argument('--val_list', type=str, default='/data/dataset1/list/base/val.txt', help='val list in train, test list path in test')
parser.add_argument('--gpus', nargs='+', type=int)
return parser
def parse_train_args(parser):
parser = parse_common_args(parser)
...
return parser
def parse_test_args(parser):
parser = parse_common_args(parser)
...
return parser
- 路径配置:定义数据集、模型、日志文件等路径
DATA_PATH = '/path/to/dataset/'
MODEL_PATH = '/path/to/models/'
LOG_PATH = '/path/to/logs/'
- 数据处理
IMAGE_SIZE = (256, 256)
DATA_AUGMENTATION = True
- 加载模型超参
LEARNING_RATE = 0.001
BATCH_SIZE = 32
MAX_EPOCHS = 10
- 其他配置
train.py
主要任务是把整体写好的内容串起来
- 导入必要的库和模块
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from model import MyModel # 假设模型定义在model.py中
from options import * # 导入配置选项
- 数据加载和预处理
# 定义数据预处理和增强方式
transform = transforms.Compose([
transforms.Resize(IMAGE_SIZE),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# 加载数据集
train_dataset = datasets.ImageFolder(root=DATA_PATH, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
- 模型定义和初始化
# 定义模型
model = MyModel()
# 如果有预训练模型,加载参数
# model.load_state_dict(torch.load(PRETRAINED_MODEL_PATH))
- 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
- 保存模型
torch.save(model.state_dict(), MODEL_SAVE_PATH)
- 可选的评估和测试
# 评估模型
model.eval()
with torch.no_grad():
# 执行评估代码