1.RICAP
RICAP [1] randomly cut portion of the four images, and then splice them into a picture, four pictures while mixing label.
2.implementation
for i, (input, target) in tqdm(enumerate(train_loader), total=len(train_loader)):
# from original paper's appendix
if args.ricap:
I_x, I_y = input.size()[2:]
w = int(np.round(I_x * np.random.beta(args.ricap_beta, args.ricap_beta)))
h = int(np.round(I_y * np.random.beta(args.ricap_beta, args.ricap_beta)))
w_ = [w, I_x - w, w, I_x - w]
h_ = [h, h, I_y - h, I_y - h]
cropped_images = {}
c_ = {}
W_ = {}
for k in range(4):
idx = torch.randperm(input.size(0))
x_k = np.random.randint(0, I_x - w_[k] + 1)
y_k = np.random.randint(0, I_y - h_[k] + 1)
cropped_images[k] = input[idx][:, :, x_k:x_k + w_[k], y_k:y_k + h_[k]]
c_[k] = target[idx].cuda()
W_[k] = w_[k] * h_[k] / (I_x * I_y)
patched_images = torch.cat(
(torch.cat((cropped_images[0], cropped_images[1]), 2),
torch.cat((cropped_images[2], cropped_images[3]), 2)),
3)
patched_images = patched_images.cuda()
output = model(patched_images)
loss = sum([W_[k] * criterion(output, c_[k]) for k in range(4)])
acc = sum([W_[k] * accuracy(output, c_[k])[0] for k in range(4)])
3.Reference
[1] https://arxiv.org/pdf/1811.09030.pdf
[2] https://github.com/4uiiurz1/pytorch-ricap