1.基本流程
pytorch在训练过程有一个很基本的流程,正常情况下就按这个流程就能够训练模型:
1.加载模型,2初始化数据,3.预定义优化器,4.训练
# 模型加载
model = Darknet(opt.model_config_path)
# pytroch函数 Module.apply 对所有子模型初始化
# https://pytorch.org/docs/stable/nn.html?highlight=apply#torch.nn.Module.apply
model.apply(weights_init_normal)
if torch.cuda.is_available() and opt.use_cuda:
model = model.cuda()
# 优化器
optimizer = torch.optim.Adam(
filter(lambda p: p.requires_grad, model.parameters()))
for epoch in range(opt.epochs):
for ii, (_, imgs, targets) in tqdm(enumerate(dataloader)):
imgs = imgs.cuda()
targets = targets.type(torch.cuda.FloatTensor)
optimizer.zero_grad()
loss = model(imgs, targets)
loss.backward()
optimizer.step()
2.模型
本图引用:https://blog.csdn.net/leviopku/article/details/82660381
yolov3采用了配置文件来构制网络层,由于yolov3较大的网络层数目,由配置文件来编写网络层可以使得代码量少很多.配置文件中每个网络块都有一个题名,按照题名划分来构建网络层.一共六种模块,对应与yolov3网络的不同结构
def create_modules(module_defs):
# yolov3网络使用了非常多的卷积层,为了减少构建模型的麻烦,
# 原作者使用配置文件来辅助构建网络,减小了模型构建所需要的代码量
hyperparams = module_defs.pop(0)
output_filters = [int(hyperparams["channels"])]
module_list = nn.ModuleList() # 模型序列
for i, module_def in enumerate(module_defs):
modules = nn.Sequential() # 子序列 代表一个子结构
if module_def["type"] == "convolutional": # 卷积块 conv bn leaky
bn