ResNet是一种深度卷积神经网络架构,由微软研究员Kaiming He等人在2015年的论文《Deep Residual Learning for Image Recognition》中提出。ResNet旨在解决深层网络训练中的梯度隐没和进化问题,使得能够训练更深、更简单的神经网络,同时取得更好的性能。
ResNet的外围翻新在于“残差块”的引入,这种块容许网络学习残差函数,即输出与冀望输入之间的差别,而不是间接学习整个映射。这种思维背地的要害洞察是,通过残差连贯,网络能够轻松地跳过某些层,从而在训练过程中更无效地流传梯度,加重了梯度隐没问题。这种构造也使得更深的网络绝对容易训练。
ResNet的一个重要变体是带有“残差学习”的ResNet-50,其中50示意网络中的层数。ResNet-50在ImageNet图像分类工作上表现出色,成为了过后当先的模型之一。
总结ResNet的要点:

  1. 残差块:引入残差块解决梯度隐没问题,容许网络学习残差函数,即输出与冀望输入之间的差别。
  2. 解决进化问题: ResNet通过跳过某些层的形式,容许训练更深的网络,解决了进化问题,进步了网络性能。
  3. ResNet-50等变体:ResNet的不同变体(如ResNet-50、ResNet-101等)在ImageNet等数据集上获得了显著的图像分类性能。
  4. 在其余工作上的利用: ResNet的思维也被利用于其余计算机视觉工作,如指标检测、宰割等。
    ResNet的胜利为后续的深度学习钻研和利用提供了重要的启发,尤其是在设计更深、更简单的神经网络时的领导准则。
    ResNet在理论生产中具备重要作用,特地在计算机视觉畛域。其创新性的残差块构造和可能训练更深层网络的能力,使得ResNet成为深度学习中的重要工具。它在图像分类、指标检测、图像宰割、格调转换、图像生成、医疗影像剖析和主动驾驶等工作中广泛应用。在图像分类方面,ResNet可能取得更高的准确率,用于辨别和辨认不同的对象和物体。在指标检测中,作为特征提取器,ResNet能够用于定位和辨认图像中的物体。同时,ResNet也在医疗畛域进行X射线、MRI等影像剖析,帮忙医生进行疾病诊断和病灶定位。在主动驾驶中,ResNet用于物体检测和辨认,进步了车辆的感知和安全性。
    本次训练应用炼丹侠平台A100服务器。设置了模型训练对照组,一组为应用炼丹侠A100 GPU进行训练的ResNet18,另一组是应用炼丹侠CPU进行训练的ResNet18,本次训练的流程为定义模型、模型训练、模型总结,训练的内容是cifar10数据集。

GPU版本残缺代码如下:

import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionimport torchvision.transforms as transformsimport torchvision.models as models# 初始化ResNet模型model = models.resnet18(pretrained=False)num_ftrs = model.fc.in_featuresmodel.fc = nn.Linear(num_ftrs, 10)  # 10类用于MNIST分类model = model.cuda()  # 将模型移至GPU# 定义数据预处理transform = transforms.Compose([    transforms.ToTensor(),    transforms.Normalize((0.5,), (0.5,))])# 加载训练数据集train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型num_epochs = 10for epoch in range(num_epochs):    model.train()    running_loss = 0.0    for images, labels in train_loader:        images = images.cuda()        labels = labels.cuda()        optimizer.zero_grad()        outputs = model(images)        loss = criterion(outputs, labels)        loss.backward()        optimizer.step()        running_loss += loss.item()    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')

CPU版本代码如下:

import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionimport torchvision.transforms as transformsimport torchvision.models as models# 初始化ResNet模型model = models.resnet18(pretrained=False)num_ftrs = model.fc.in_featuresmodel.fc = nn.Linear(num_ftrs, 10)  # 10类用于MNIST分类# 定义数据预处理transform = transforms.Compose([    transforms.ToTensor(),    transforms.Normalize((0.5,), (0.5,))])# 加载训练数据集train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型num_epochs = 10for epoch in range(num_epochs):    model.train()    running_loss = 0.0    for images, labels in train_loader:        optimizer.zero_grad()        outputs = model(images)        loss = criterion(outputs, labels)        loss.backward()        optimizer.step()        running_loss += loss.item()    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')

训练过程后果如下:

https://www.bilibili.com/video/BV1UF411S7jt/?spm_id_from=333....

ResNet是一种深度卷积神经网络架构,这种块容许网络学习输出与冀望输入之间的差别,通过残差连贯无效流传梯度,使得更深的网络易于训练。在本次训练过程中,通过对cifar10数据集的训练,应用A100进行减速的训练时长为132s,应用CPU进行训练的时长为3362s,工夫性能晋升25倍。