Dualdl «Trending × 2025»
# Unlabeled step with two augmentations aug1 = augment(x_unlab) aug2 = augment(x_unlab) # different random aug
# consistency on unlabeled aug1, aug2 = aug(img_unlab), aug(img_unlab) with torch.no_grad(): predA, _ = model(aug1) _, predB = model(aug2) loss_cons = criterion_cons(predA.softmax(dim=-1), predB.softmax(dim=-1)) dualdl
Training loop (high-level):
loss_cons = MSE(softmax(predA), softmax(predB)) # Unlabeled step with two augmentations aug1 =
model = DualModel(resnet18(), num_classes=10) opt = torch.optim.Adam(model.parameters()) criterion_cons = nn.MSELoss() for epoch in range(epochs): for (img_lab, y), (img_unlab, _) in zip(labeled_loader, unlabeled_loader): # supervised logitsA, logitsB = model(img_lab) loss_sup = F.cross_entropy(logitsA, y) + F.cross_entropy(logitsB, y) aug2 = aug(img_unlab)
Here’s a solid, practical guide to — a niche but powerful term used primarily in machine learning / deep learning (especially semi-supervised or multi-task learning) and occasionally in file downloading contexts.
predA = modelA(aug1) predB = modelB(aug2)