关于深度学习:炼丹侠如何用GPU服务器实现ResNet训练

4次阅读

共计 3302 个字符,预计需要花费 9 分钟才能阅读完成。

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 torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import torchvision.models as models

# 初始化 ResNet 模型
model = models.resnet18(pretrained=False)
num_ftrs = model.fc.in_features
model.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 = 10

for 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 torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import torchvision.models as models

# 初始化 ResNet 模型
model = models.resnet18(pretrained=False)
num_ftrs = model.fc.in_features
model.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 = 10

for 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 倍。

正文完
 0