HI I have tried to implement your code in my experiment on UCF101.
but I did't get any improvement and always get the zero correct.
It is a little strange.
my code
``
def train_1epoch(self):
print('==> Epoch:[{0}/{1}][training stage]'.format(self.epoch, self.nb_epochs))
batch_time = AverageMeter()
data_time = AverageMeter()
losses = AverageMeter()
top1 = AverageMeter()
top5 = AverageMeter() #switch to train mode
self.model.train()
end = time.time()
train_loss = AverageMeter()
total = 0
correct = 0
# mini-batch training
progress = tqdm(self.train_loader)
for i, (data_dict,label) in enumerate(progress):
# measure data loading time
data_time.update(time.time() - end)
# generate mixed inputs, two one-hot label vectors and mixing coefficient
# transfer the label into one-hot Encoder
# label = torch.zeros(label.shape[0], 101).scatter_(1, label.reshape(-1, 1), 1).cuda()
# print(label.shape[0])
label = label.cuda()
# compute output
output = Variable(torch.zeros(len(data_dict['img1']),101).float()).cuda()
# print(len(data_dict['img1'])
for i in range(len(data_dict)):
key = 'img'+str(i)
input_var = (data_dict[key]).cuda()
# generate mixed inputs, two one-hot label vectors and mixing coefficient
input_var, label_a, label_b, lam = mixup_data(input_var, label, args.alpha, True)
input_var, label_a, label_b = Variable(input_var), Variable(label_a), Variable(label_b)
output += self.model(input_var)
criterion = self.criterion
loss = mixup_criterion(criterion, output, label_a, label_b, lam)
# print(label_a.argmax(dim=1).data,label_b.argmax(dim=1).data)
# loss = loss_func(criterion, output)
# print(args.alpha, lam)
# compute gradient and do SGD step
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
# measure accuracy and record loss
# train_loss += loss.data[0]
train_loss.update(loss.data[0], data_dict[key].size(0))
# print(loss.data[0])
_, predicted = torch.max(output.data, 1)
total += label.size(0)
# print(label.size(0))
correct += lam * predicted.eq(label_a.data).cpu().sum() + (1 - lam) * predicted.eq(label_b.data).cpu().sum()
# print(predicted.eq(label_a.argmax(dim=1).data).cpu().sum())
# print(label_a.data)
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
info = {'Epoch':[self.epoch],
'Batch Time':[round(batch_time.avg,3)],
'Data Time':[round(data_time.avg,3)],
'Loss':[round(train_loss.avg,5)],
'correct':[round(correct,4)],
'Prec@1':[round(correct/total,4)],
'Prec@5':[round(correct/total,4)],
'lr': self.optimizer.param_groups[0]['lr'],
'weight-decay': args.decay
}
record_info(info, 'record/spatial/rgb_train.csv','train')
HI I have tried to implement your code in my experiment on UCF101.
but I did't get any improvement and always get the zero correct.
It is a little strange.
my code
``
def train_1epoch(self):
print('==> Epoch:[{0}/{1}][training stage]'.format(self.epoch, self.nb_epochs))
batch_time = AverageMeter()
data_time = AverageMeter()
losses = AverageMeter()
top1 = AverageMeter()
top5 = AverageMeter() #switch to train mode
self.model.train()
end = time.time()
train_loss = AverageMeter()
total = 0
correct = 0
# mini-batch training
progress = tqdm(self.train_loader)
for i, (data_dict,label) in enumerate(progress):
``
I did't know where is wrong....