def se_resnet101(num_classes=1_000): model = ResNet(SEBottleneck, [3, 4, 23, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
out = self.relu(out) out = self.conv3(out) out = self.bn3(out) out = self.se(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out model = ResNet(SEBottleneck, [3, 4, 6, 3], num_classes=10) print(model) def se_resnet18(num_classes=1_000): model = ResNet(SEBasicBlock, [2, 2, 2, 2], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model def se_resnet101(num_classes=1_000): model = ResNet(SEBottleneck, [3, 4, 23, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
def se_resnet18(num_classes=1_000): model = ResNet(SEBasicBlock, [2, 2, 2, 2], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
def resnet34(pretrained=False, model_root=None, **kwargs): model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) if pretrained: misc.load_state_dict(model, model_urls['resnet34'], model_root) return model
Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBasicBlock, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model def se_resnet50(num_classes=1_000, pretrained=False): """Constructs a ResNet-50 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBottleneck, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) if pretrained: model.load_state_dict( load_state_dict_from_url( "https://github.com/moskomule/senet.pytorch/releases/download/archive/seresnet50-60a8950a85b2b.pkl" )) return model def se_resnet101(num_classes=1_000): """Constructs a ResNet-101 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """
def prepare_resnet(resnet: ResNet, num_classes: int): resnet.fc = nn.Linear(resnet.fc.in_features, num_classes)
def train(model: ResNet, device: torch.device, train_loader: DataLoader, val_loader: DataLoader, arch: str, epochs: int = 160, lr: float = 0.1, momentum: float = 0.9, bn_only: bool = False) -> dict: """ :param bn_only: BN only :param model: ResNet model :param device: device to inference :param train_loader: train loader :param val_loader: validation loader :param arch: ResNet<Deep> :param epochs: number of epochs :param lr: base learning rate :param momentum: momentum :return: dict with statistics """ criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum) lr_scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[80, 120]) save_steps = (25, 50, 79, 119) stats = {"train_loss": [], "val_loss": [], "val_accuracy": []} def train_(): model.train(True) total_loss = 0 for i, (inputs, labels) in enumerate(train_loader): inputs = inputs.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) total_loss += loss.item() loss.backward() optimizer.step() if i % 50 == 0: print(f"[{epoch + 1}, {i + 1}] loss: {loss.item()}") epoch_loss = total_loss / len(train_loader) stats["train_loss"].append(epoch_loss) def save_(): local_dir = os.path.join("snapshots", arch) os.makedirs(local_dir, exist_ok=True) if bn_only: save_name = os.path.join(local_dir, f"snapshot_{epoch + 1}_BN_.pth.tar") else: save_name = os.path.join(local_dir, f"snapshot_{epoch + 1}.pth.tar") torch.save(model.state_dict(), save_name) print(f"Model {save_name} saved") def eval_(): model.train(False) total_loss = 0 total = 0 correct = 0 with torch.no_grad(): for i, (inputs, labels) in enumerate(val_loader): inputs = inputs.to(device) labels = labels.to(device) outputs = model(inputs) total_loss += criterion(outputs, labels).item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() epoch_loss = total_loss / len(val_loader) epoch_accuracy = correct / total * 100 stats["val_loss"].append(epoch_loss) stats["val_accuracy"].append(epoch_accuracy) print( f"Epoch {epoch + 1}: Accuracy: {epoch_accuracy}. Loss: {epoch_loss}" ) for epoch in tqdm(range(epochs)): train_() print(f"LR: {lr_scheduler.get_last_lr()}") lr_scheduler.step() eval_() if epoch in save_steps: save_() print("---------- TRAINING IS FINISHED ----------") return stats
def Net(num_classes): model = ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = torch.nn.AdaptiveAvgPool2d(1) return model
def se_resnet34(num_classes=1_000): """Constructs a ResNet-34 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBasicBlock, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model def se_resnet50(num_classes=1_000, pretrained=False): """Constructs a ResNet-50 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBottleneck, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) if pretrained: model.load_state_dict( model_zoo.load_url("https://www.dropbox.com/s/xpq8ne7rwa4kg4c/seresnet50-60a8950a85b2b.pkl")) return model def se_resnet101(num_classes=1_000): """Constructs a ResNet-101 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBottleneck, [3, 4, 23, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
def se_resnet34(num_classes=1000): model = ResNet(SEBasicBlock, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) out = self.se(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out def se_resnet50(num_classes=1_000, pretrained=False): """Constructs a ResNet-50 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet """ model = ResNet(SEBottleneck, [3, 4, 6, 3], num_classes=num_classes) model.avgpool = nn.AdaptiveAvgPool2d(1) if pretrained: model.load_state_dict(model_zoo.load_url("http://data.lip6.fr/cadene/pretrainedmodels/se_resnet50-ce0d4300.pth")) return model
def __init__(self, NUM_CLASSES): super(ResNet152, self).__init__() self.model_name = "ResNet152" self.model = ResNet(Bottleneck, [3, 8, 36, 3], num_classes=NUM_CLASSES)
#!/usr/bin/env python # encoding: utf-8 """ @Author: yangwenhao @Contact: [email protected] @Software: PyCharm @File: mem_load_test.py @Time: 2020/3/29 10:30 PM @Overview: """ import torch import numpy as np from torchvision.models import ResNet from torchvision.models.resnet import BasicBlock model = ResNet(BasicBlock, [1, 1, 1, 1], num_classes=1000)
def resnet18(**kwargs): """Constructs a ResNet-18 model. """ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
def resnet152(**kwargs): """Constructs a ResNet-152 model. """ model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) model.avgpool = nn.AdaptiveAvgPool2d(1) return model
def resnet34(**kwargs): """Constructs a ResNet-34 model. """ model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) model.avgpool = nn.AdaptiveAvgPool2d(1) return model