(opt, train_loader, model, model_without_ddp, optimizer, epoch)
| 157 | |
| 158 | |
| 159 | def train(opt, train_loader, model, model_without_ddp, optimizer, epoch): |
| 160 | |
| 161 | # switch to train mode |
| 162 | model.train() |
| 163 | |
| 164 | logger = logging.getLogger(__name__) |
| 165 | batch_time = AverageMeter() |
| 166 | data_time = AverageMeter() |
| 167 | train_logger = LogCollector() |
| 168 | |
| 169 | if utils.is_main_process() and epoch == 0: |
| 170 | logger.info('image encoder trainable parameters: {}M'.format(count_params(model_without_ddp.img_enc))) |
| 171 | logger.info('txt encoder trainable parameters: {}M'.format(count_params(model_without_ddp.txt_enc))) |
| 172 | logger.info('criterion trainable parameters: {}M'.format(count_params(model_without_ddp.criterion))) |
| 173 | |
| 174 | n_batch = len(train_loader) |
| 175 | |
| 176 | end = time.time() |
| 177 | |
| 178 | for i, train_data in enumerate(train_loader): |
| 179 | |
| 180 | optimizer.zero_grad() |
| 181 | |
| 182 | # warmup_alpha is [0, 1], loss = loss * warmup_alpha |
| 183 | warmup_alpha = float(i) / n_batch if epoch == opt.embedding_warmup_epochs else 1. |
| 184 | |
| 185 | # measure data loading time |
| 186 | data_time.update(time.time() - end) |
| 187 | |
| 188 | images, captions, lengths, ids, img_ids = train_data |
| 189 | |
| 190 | # to device |
| 191 | images = images.cuda(non_blocking=True) |
| 192 | captions = captions.cuda(non_blocking=True) |
| 193 | lengths = lengths.cuda(non_blocking=True) |
| 194 | img_ids = img_ids.cuda(non_blocking=True) |
| 195 | |
| 196 | loss = model(images, captions, lengths, img_ids=img_ids, warmup_alpha=warmup_alpha) |
| 197 | |
| 198 | if torch.isnan(loss) or torch.isinf(loss): |
| 199 | loss = torch.zeros([], requires_grad=True, device=images.device) |
| 200 | |
| 201 | loss.backward() |
| 202 | |
| 203 | if opt.grad_clip > 0: |
| 204 | clip_grad_norm_(model.parameters(), opt.grad_clip) |
| 205 | |
| 206 | optimizer.step() |
| 207 | |
| 208 | batch_time.update(time.time() - end) |
| 209 | end = time.time() |
| 210 | |
| 211 | model_without_ddp.logger = train_logger |
| 212 | model_without_ddp.logger.update('Iter', model_without_ddp.Eiters) |
| 213 | model_without_ddp.logger.update('lr', optimizer.param_groups[0]['lr']) |
| 214 | model_without_ddp.logger.update('Loss', loss.item(), opt.batch_size) |
| 215 | model_without_ddp.Eiters += 1 |
| 216 |
no test coverage detected