GPU加速 卷积网络MNIST模型训练

学习记录

import torch
from  model_mnist.Net import  ConvNet
from data.data_ import transform
from  torch.utils.data import  DataLoader
from torchvision.datasets import mnist
from torchvision import transforms
import time

MOMENTUM=0.5
LR = 0.01

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize([0.1307],[0.3081])
     # 对于每个通道,从该通道的每个像素值中减去均值`0.1307`。
     #然后,将结果除以该通道的标准差`0.3081`。
     ]
)

if torch.cuda.is_available():
    print(f"Using GPU: {torch.cuda.get_device_name(0)}")  # 0是设备索引,通常是主设备
else:
    print("Using CPU")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")


train_set = mnist.MNIST('./data', train=True, transform=transform, download=False)

train_loader = DataLoader(dataset = train_set,shuffle=True,batch_size=128,drop_last=True)

test_set = mnist.MNIST('./data', train=False, transform=transform, download=False)
test_loader = DataLoader(dataset = test_set,shuffle=True,batch_size=64,drop_last=True)


#实例化模型
model = ConvNet()
model.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),lr = LR, momentum=MOMENTUM)

def train(epoch):
    '''训练'''

    for index, data in enumerate(train_loader, 0):
        inputs, target = data# 取数据

        inputs = inputs.to(device)  # 将输入数据放到GPU上

        #print(inputs.device)
        target = target.to(device)  # 将标签放到GPU上
       #print(target.device)
        optimizer.zero_grad()  # 梯度清零
        outputs = model(inputs)  # 训练
        loss = criterion(outputs, target)  # 算损失
        loss.backward()  # 反向传播
        optimizer.step()  # 优化梯度

        # 累计loss ,这里要用item()取数据要不回构建计算图
        if epoch% 20== 19:
            torch.save(model.state_dict(), "model_mnist/model_GPU.pth")  # 保存模型
            torch.save(optimizer.state_dict(), "model_mnist/optimize_GPUr.pth")
            print("训练次数为:{},损失值为:{}".format(index, loss.item()))

if __name__ == '__main__':
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    start = time.time()
    for epoch in range(20):

        print({"————————第{}轮测试开始——————".format(epoch+ 1)})
        train(epoch)
    end = time.time()
    print('Time cost:', end - start, 's')

batch_size =64  训练20轮 CPU与GPU对比

bacth_size=128 训练20轮 CPU与GPU对比

GPU缩短了一半时间

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辜月十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值