武漢網(wǎng)站制作公司電話百度關(guān)鍵詞優(yōu)化是什么意思
原文作者:我輩李想
版權(quán)聲明:文章原創(chuàng),轉(zhuǎn)載時(shí)請務(wù)必加上原文超鏈接、作者信息和本聲明。
文章目錄
- 前言
- 一、Anaconda 中安裝 PyTorch 和 CUDA
- 二、檢查PyTorch和CUDA版本
- 三、PyTorch的基本使用
- 四、PyTorch調(diào)用cuda
- 五、Matplotlib繪制Pytorch損失函數(shù)和準(zhǔn)確率
- 六、tesorbrand顯示圖像
- 七、用Pytorch寫一個(gè)卷積神經(jīng)網(wǎng)絡(luò)
- 八、用Pytorch寫一個(gè)目標(biāo)檢測模型
前言
PyTorch是一個(gè)開源的Python深度學(xué)習(xí)框架,可以用于構(gòu)建各種類型的神經(jīng)網(wǎng)絡(luò)模型。
一、Anaconda 中安裝 PyTorch 和 CUDA
-
首先下載并安裝適用于您系統(tǒng)的 Anaconda 版本。
-
打開 Anaconda Prompt 或命令行工具,并創(chuàng)建一個(gè)名為“pytorch”或任何其他您喜歡的環(huán)境,此處假設(shè)您使用的是 Anaconda 4.5 或更高版本:
conda create -n pytorch python=3.7 anaconda
- 激活新環(huán)境:
conda activate pytorch
- 安裝 PyTorch:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
此命令將安裝適用于 CUDA 11.1 的 PyTorch 和 TorchVision,以及適用于 CUDA 11.1 的 CUDA 工具包。
- 驗(yàn)證 PyTorch 安裝是否成功:
python -c "import torch; print(torch.__version__)"
如果成功安裝,這將打印 PyTorch 的版本號。
二、檢查PyTorch和CUDA版本
可以使用以下命令:
import torchprint(torch.__version__)
print(torch.version.cuda)
這將打印出您正在使用的PyTorch和CUDA版本。
三、PyTorch的基本使用
示例
PyTorch是一個(gè)開源的Python深度學(xué)習(xí)框架,可以用于構(gòu)建各種類型的神經(jīng)網(wǎng)絡(luò)模型。要使用PyTorch,您需要首先安裝它??梢允褂靡韵旅钤诮K端中安裝PyTorch:
pip install torch
然后,您可以在Python腳本中導(dǎo)入PyTorch并開始使用它。例如,要構(gòu)建一個(gè)簡單的全連接神經(jīng)網(wǎng)絡(luò),可以使用以下代碼:
import torch
import torch.nn as nn# Define the neural network model
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(784, 256)self.fc2 = nn.Linear(256, 10)def forward(self, x):x = x.view(-1, 784)x = torch.relu(self.fc1(x))x = self.fc2(x)return x# Instantiate the model and define the loss function and optimizer
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)# Load the data and train the model
for epoch in range(10):for i, (inputs, labels) in enumerate(train_loader, 0):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# Evaluate the trained model on the test set
correct = 0
total = 0
with torch.no_grad():for inputs, labels in test_loader:outputs = net(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()
print('Accuracy: %d %%' % (100 * correct / total))
在這個(gè)例子中,我們定義了一個(gè)簡單的全連接神經(jīng)網(wǎng)絡(luò),使用MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練和測試。我們使用PyTorch內(nèi)置的nn.Module
類來定義神經(jīng)網(wǎng)絡(luò)模型,并在forward
方法中定義正向傳播的操作。我們使用交叉熵?fù)p失函數(shù)和隨機(jī)梯度下降(SGD)優(yōu)化器來訓(xùn)練模型。我們使用訓(xùn)練數(shù)據(jù)集中的數(shù)據(jù)來更新模型參數(shù),并使用測試數(shù)據(jù)集來評估模型的準(zhǔn)確性。
四、PyTorch調(diào)用cuda
在PyTorch中使用CUDA可以大大加速訓(xùn)練和推理過程。以下是使用CUDA的幾個(gè)步驟:
- 檢查CUDA是否可用:
import torchif torch.cuda.is_available():device = torch.device("cuda") # 如果GPU可用,則使用CUDA
else:device = torch.device("cpu") # 如果GPU不可用,則使用CPU
- 將模型和數(shù)據(jù)加載到CUDA設(shè)備:
model.to(device)
inputs, labels = inputs.to(device), labels.to(device)
- 將數(shù)據(jù)轉(zhuǎn)換為CUDA張量:
inputs = inputs.cuda()
labels = labels.cuda()
- 在訓(xùn)練過程中,使用CUDA加速計(jì)算:
for inputs, labels in dataloader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
請注意,在使用CUDA時(shí),您需要確保您的計(jì)算機(jī)具有兼容的GPU和正確的CUDA和cuDNN版本。您可以在PyTorch的官方文檔中找到更多詳細(xì)信息。
五、Matplotlib繪制Pytorch損失函數(shù)和準(zhǔn)確率
在Pytorch中,我們可以使用Matplotlib來繪制訓(xùn)練過程中的損失函數(shù)曲線、準(zhǔn)確率曲線等。下面是一個(gè)簡單的示例:
import matplotlib.pyplot as plt# 定義損失函數(shù)和準(zhǔn)確率列表
train_losses = [0.1, 0.08, 0.05, 0.03, 0.02]
train_accs = [90, 92, 95, 97, 98]# 繪制損失函數(shù)曲線
plt.plot(train_losses, label='Train Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()# 繪制準(zhǔn)確率曲線
plt.plot(train_accs, label='Train Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
運(yùn)行后會分別顯示訓(xùn)練過程中的損失函數(shù)曲線和準(zhǔn)確率曲線。我們可以根據(jù)自己的需要調(diào)整圖表的樣式和參數(shù),例如修改線條顏色、線條寬度、坐標(biāo)軸范圍等。
六、tesorbrand顯示圖像
PyTorch下的Tensorboard 使用
七、用Pytorch寫一個(gè)卷積神經(jīng)網(wǎng)絡(luò)
下面是一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)(CNN)的實(shí)現(xiàn),用PyTorch框架來訓(xùn)練MNIST手寫數(shù)字識別數(shù)據(jù)集。
首先,您需要導(dǎo)入所需的庫和模塊,如下所示:
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets, transforms
接下來,您需要定義網(wǎng)絡(luò)的架構(gòu)。這個(gè)CNN有兩個(gè)卷積層,一個(gè)最大池化層和兩個(gè)全連接層。代碼如下:
class Net(nn.Module):def __init__(self):super(Net, self).__init__()# 輸入為28*28*1self.conv1 = nn.Conv2d(1, 10, kernel_size=5)# 輸入為24*24*10self.conv2 = nn.Conv2d(10, 20, kernel_size=5)# 輸入為20*20*20self.mp = nn.MaxPool2d(2)# 輸入為10*10*20self.fc1 = nn.Linear(320, 50)self.fc2 = nn.Linear(50, 10)def forward(self, x):x = F.relu(self.mp(self.conv1(x)))x = F.relu(self.mp(self.conv2(x)))x = x.view(-1, 320)x = F.relu(self.fc1(x))x = self.fc2(x)return F.log_softmax(x, dim=1)
現(xiàn)在,您需要定義訓(xùn)練函數(shù)和測試函數(shù)。訓(xùn)練函數(shù)將會用來訓(xùn)練模型,而測試函數(shù)將會用來測試模型。代碼如下:
def train(model, device, train_loader, optimizer, epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))def test(model, device, test_loader):model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))
接下來,您需要加載數(shù)據(jù)集和定義訓(xùn)練和測試參數(shù)。代碼如下:
batch_size = 64train_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])test_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])train_dataset = datasets.MNIST('./data', train=True, download=True, transform=train_transforms)
test_dataset = datasets.MNIST('./data', train=False, transform=test_transforms)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)use_cuda = torch.cuda.is_available()
device = torch.device("cuda" if use_cuda else "cpu")model = Net().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
最后,您需要在循環(huán)中訓(xùn)練和測試模型。代碼如下:
epochs = 10for epoch in range(1, epochs + 1):train(model, device, train_loader, optimizer, epoch)test(model, device, test_loader)
這是一個(gè)簡單的CNN的實(shí)現(xiàn),用PyTorch訓(xùn)練MNIST數(shù)據(jù)集。您可以調(diào)整模型的超參數(shù),例如學(xué)習(xí)率、動量等,來提高模型的準(zhǔn)確性和性能。
八、用Pytorch寫一個(gè)目標(biāo)檢測模型
下面是一個(gè)基于PyTorch的目標(biāo)檢測模型的實(shí)現(xiàn),使用Faster R-CNN網(wǎng)絡(luò),并使用COCO數(shù)據(jù)集進(jìn)行訓(xùn)練和測試。
首先,您需要導(dǎo)入所需的庫和模塊,如下所示:
import torch
import torchvision
import torchvision.transforms as transforms
import torch.utils.data
import numpy as np
import matplotlib.pyplot as plt
import time
import os
import json
import torch.utils.data as data
from torchvision.datasets import CocoDetection
import torchvision.transforms.functional as F
import torch.nn as nn
import torch.optim as optim
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator
from torchvision.models.detection.backbone_utils import resnet_fpn_backbone
from torchvision.ops import MultiScaleRoIAlign
接下來,您需要定義數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)集類,以加載和預(yù)處理COCO數(shù)據(jù)集。代碼如下:
class Compose(object):def __init__(self, transforms):self.transforms = transformsdef __call__(self, img, target):for t in self.transforms:img, target = t(img, target)return img, targetclass RandomHorizontalFlip(object):def __init__(self, probability=0.5):self.probability = probabilitydef __call__(self, img, target):if np.random.rand() < self.probability:img = F.hflip(img)target["boxes"][:, [0, 2]] = img.width - target["boxes"][:, [2, 0]]return img, targetclass Resize(object):def __init__(self, max_size=900, min_size=600):self.max_size = max_sizeself.min_size = min_sizedef __call__(self, img, target):w, h = img.sizesize = self.min_sizeif w < h and max(h, w * size / w) <= self.max_size:size = int(w * size / w)elif max(h, w * size / h) <= self.max_size:size = int(h * size / h)img = F.resize(img, (size, size))target["boxes"][:, :4] *= size / self.min_sizereturn img, targetclass ToTensor(object):def __call__(self, img, target):img = F.to_tensor(img)return img, targetclass COCODataset(data.Dataset):def __init__(self, data_dir, set_name='train', transform=None):super().__init__()self.data_dir = data_dirself.images_dir = os.path.join(data_dir, set_name)self.set_name = set_nameself.transform = transformself.coco = CocoDetection(self.images_dir, os.path.join(data_dir, f'{set_name}.json'))def __getitem__(self, index):image, target = self.coco[index]image_id = self.coco.ids[index]if self.transform is not None:image, target = self.transform(image, target)return image, target, image_iddef __len__(self):return len(self.coco)
接下來,您需要定義模型的架構(gòu)。這個(gè)Faster R-CNN網(wǎng)絡(luò)使用ResNet-50 FPN作為骨干網(wǎng)絡(luò)。代碼如下:
class FasterRCNNResNetFPN(nn.Module):def __init__(self, num_classes):super(FasterRCNNResNetFPN, self).__init__()self.num_classes = num_classesbackbone = resnet_fpn_backbone('resnet50', pretrained=True)anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),aspect_ratios=((0.5, 1.0, 2.0),))roi_pooler = MultiScaleRoIAlign(featmap_names=['0', '1', '2', '3'],output_size=7,sampling_ratio=2)self.model = FasterRCNN(backbone,num_classes=num_classes + 1,rpn_anchor_generator=anchor_generator,box_roi_pool=roi_pooler)def forward(self, x, targets=None):if self.training and targets is None:raise ValueError("In training mode, targets should be passed")elif not self.training and targets is not None:raise ValueError("In inference mode, targets should not be passed")else:return self.model(x, targets)
現(xiàn)在,您需要設(shè)置訓(xùn)練和測試的超參數(shù)并進(jìn)行模型訓(xùn)練。代碼如下:
batch_size = 2
num_workers = 2
num_epochs = 10data_dir = '/path/to/coco'train_transforms = Compose([Resize(min_size=600, max_size=900),RandomHorizontalFlip(),ToTensor()])
test_transforms = Compose([Resize(min_size=800, max_size=1333),ToTensor()])train_dataset = COCODataset(data_dir, set_name='train', transform=train_transforms)
test_dataset = COCODataset(data_dir, set_name='val', transform=test_transforms)train_loader = data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, collate_fn=lambda x: tuple(zip(*x)))
test_loader = data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers, collate_fn=lambda x: tuple(zip(*x)))num_classes = 80device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = FasterRCNNResNetFPN(num_classes=num_classes).to(device)optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.0005)def train_one_epoch(model, optimizer, data_loader, device, epoch):model.train()train_loss = 0.0start_time = time.time()for step, (images, targets, image_ids) in enumerate(data_loader):images = [img.to(device) for img in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]loss_dict = model(images, targets)losses = sum(loss_dict.values())train_loss += losses.item()optimizer.zero_grad()losses.backward()optimizer.step()if step % 10 == 0:print(f'Epoch: [{epoch}/{num_epochs}] Step: [{step}/{len(data_loader)}] Loss: {losses.item()}')train_loss /= len(data_loader)end_time = time.time()print(f'Training Loss: {train_loss} Time: {end_time - start_time}')def evaluate(model, data_loader, device):model.eval()results = []for images, targets, image_ids in data_loader:images = [img.to(device) for img in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]with torch.no_grad():outputs = model(images)for i, (output, target) in enumerate(zip(outputs, targets)):result = {'image_id': image_ids[i],'boxes': output['boxes'].detach().cpu().numpy(),'scores': output['scores'].detach().cpu().numpy(),'labels': output['labels'].detach().cpu().numpy(),}target = {'image_id': image_ids[i],'boxes': target['boxes'].cpu().numpy(),'labels': target['labels'].cpu().numpy(),}results.append((result, target))return resultsfor epoch in range(num_epochs):train_one_epoch(model, optimizer, train_loader, device, epoch)results = evaluate(model, test_loader, device)
這是一個(gè)使用PyTorch實(shí)現(xiàn)的目標(biāo)檢測模型的示例,使用Faster R-CNN網(wǎng)絡(luò)和COCO數(shù)據(jù)集進(jìn)行訓(xùn)練和測試。您可以根據(jù)需要調(diào)整模型的超參數(shù),以提高模型的準(zhǔn)確性和性能。