1. GPU優化的點
網絡模型
數據(輸入、標注)
損失函數
- .cuda方式
代碼:
import torch.optim
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# 1. 準備數據集
train_data = torchvision.datasets.CIFAR10('data',train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10('data',train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 數據集大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print('訓練數據集的長度為{}'.format(train_data_size))
print('測試數據集的長度為{}'.format(test_data_size))# 2 利用DataLoader加載數據集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)# 3 搭建神經網絡
# 3 搭建神經網絡
class Tudui(nn.Module):def __init__(self):super().__init__()self.model = nn.Sequential(nn.Conv2d(3,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024,64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x# 4 創建網絡模型
tudui = Tudui()
# --------------------------
if torch.cuda.is_available():tudui = tudui.cuda()# 5 損失函數
loss_fn = nn.CrossEntropyLoss()
# ---------------------------
if torch.cuda.is_available():loss_fn = loss_fn.cuda()# 6 優化器 1e-2=1x10^(-2)
learning_rate = 0.01
optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)# 7 設置訓練網絡的一些參數
total_train_step = 0 # 記錄訓練次數
total_test_step = 0 # 記錄測試次數
epoch = 10 #訓練輪數
# 添加tensorboard
writer = SummaryWriter('logs_model')
for i in range(epoch):print('-----------第{}輪訓練開始-----------'.format(i+1))# 訓練開始# 訓練步驟開始 dropout batchNorm僅對某些層次有作用tudui.train()for data in train_dataloader:imgs, targets = data# ---------------------------if torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()output = tudui(imgs) #訓練模型的預測輸出loss = loss_fn(output,targets)# 優化器優化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print('訓練次數是{}時,loss是{}'.format(total_train_step,loss.item()))# 加了item() tensor變成了數字writer.add_scalar('train_loss',loss.item(),total_train_step)# 訓練完一輪,看是否訓練好,有沒有達到想要的需求,測試數據集中跑一篇看準確率或者損失# 測試步驟開始tudui.eval()total_test_loss = 0total_accuracy = 0# 測試不需要對梯度進行調整with torch.no_grad():for data in test_dataloader:imgs,targets = data# ---------------------------if torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()outputs = tudui(imgs)loss = loss_fn(outputs,targets)total_test_loss += loss.item()accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracyprint('整體測試集上的loss是{}'.format(total_test_loss))print('整體測試集上的正確率是{}'.format(total_accuracy/test_data_size))writer.add_scalar('test_loss',total_test_loss,total_test_step)writer.add_scalar('test_accuracy', total_accuracy, total_test_step)total_test_step+=1torch.save(tudui,'tudui_{}.pth'.format(i))print('模型已保存')writer.close()
3…to(device)方式
device = torch.device("cpu")
# 第一張顯卡
torch.device("cuda")
torch.device("cuda:0")
# 第二張
torch.device("cuda:1")
代碼:
import torch.optim
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# 定義訓練的設備
device = torch.device('cuda')# 1. 準備數據集
train_data = torchvision.datasets.CIFAR10('data',train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10('data',train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 數據集大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print('訓練數據集的長度為{}'.format(train_data_size))
print('測試數據集的長度為{}'.format(test_data_size))# 2 利用DataLoader加載數據集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)# 3 搭建神經網絡
# 3 搭建神經網絡
class Tudui(nn.Module):def __init__(self):super().__init__()self.model = nn.Sequential(nn.Conv2d(3,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024,64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x# 4 創建網絡模型
tudui = Tudui()
# --------------------------
# if torch.cuda.is_available():
# tudui = tudui.cuda()
tudui = tudui.to(device)# 5 損失函數
loss_fn = nn.CrossEntropyLoss()
# ---------------------------
# if torch.cuda.is_available():
# loss_fn = loss_fn.cuda()
loss_fn = loss_fn.to(device)# 6 優化器 1e-2=1x10^(-2)
learning_rate = 0.01
optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)# 7 設置訓練網絡的一些參數
total_train_step = 0 # 記錄訓練次數
total_test_step = 0 # 記錄測試次數
epoch = 10 #訓練輪數
# 添加tensorboard
writer = SummaryWriter('logs_model')
for i in range(epoch):print('-----------第{}輪訓練開始-----------'.format(i+1))# 訓練開始# 訓練步驟開始 dropout batchNorm僅對某些層次有作用tudui.train()for data in train_dataloader:imgs, targets = data# ---------------------------# if torch.cuda.is_available():# imgs = imgs.cuda()# targets = targets.cuda()imgs = imgs.to(device)targets = targets.to(device)output = tudui(imgs) #訓練模型的預測輸出loss = loss_fn(output,targets)# 優化器優化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print('訓練次數是{}時,loss是{}'.format(total_train_step,loss.item()))# 加了item() tensor變成了數字writer.add_scalar('train_loss',loss.item(),total_train_step)# 訓練完一輪,看是否訓練好,有沒有達到想要的需求,測試數據集中跑一篇看準確率或者損失# 測試步驟開始tudui.eval()total_test_loss = 0total_accuracy = 0# 測試不需要對梯度進行調整with torch.no_grad():for data in test_dataloader:imgs,targets = data# ---------------------------# if torch.cuda.is_available():# imgs = imgs.cuda()# targets = targets.cuda()imgs = imgs.to(device)targets = targets.to(device)outputs = tudui(imgs)loss = loss_fn(outputs,targets)total_test_loss += loss.item()accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracyprint('整體測試集上的loss是{}'.format(total_test_loss))print('整體測試集上的正確率是{}'.format(total_accuracy/test_data_size))writer.add_scalar('test_loss',total_test_loss,total_test_step)writer.add_scalar('test_accuracy', total_accuracy, total_test_step)total_test_step+=1torch.save(tudui,'tudui_{}.pth'.format(i))print('模型已保存')writer.close()