PyTorch is an open-source machine learning library for Python… [Wiki]
PyTorch e-book
pytorch
and torchvision
on official site:pip
/conda
Use conda
as package manager
conda create -n pytorch python=3
to create a virtual environment pytorch
source activate pytorch
to activate my virtual environment pytorch
conda install pytorch torchvision cudatoolkit=9.0 -c pytorch
to installpython -c 'import torch; print(torch.__version__)'
on Bash$ python -c 'import torch; print(torch.__version__)'
1.4.0
python -c 'import torch; print(torch.cuda.is_available())'
$ python -c 'import torch; print(torch.cuda.is_available())'
True
torch.Tensor
numpy.ndarray
[NumPy]list
>>> import torch
>>> x = torch.tensor([[5, 4], [8, 7]])
>>> x.shape
torch.Size([2, 2])
requires_grad=True
in a torch.Tensor
objectwith...as...
statement)
torch.set_grad_enabled(True)
or torch.set_grad_enabled(False)
torch.enable_grad()
torch.no_grad()
>>> def f(x, y):
... return x.pow(2) + 2*y
requires_grad=True
if gradient computation is needed>>> x = torch.tensor([8.], requires_grad=True)
>>> y = torch.tensor([7.], requires_grad=True)
>>> f(x, y)
tensor([78.], grad_fn=<AddBackward0>)
\[
\nabla f= \left( \dfrac{\partial f}{\partial x}, \dfrac{\partial f}{\partial y} \right) = \left( 2x, 2 \right)
\]
\[
\Rightarrow \nabla f(8, 7)=(16, 2)
\]
>>> f(x, y).backward()
>>> x
tensor([8.], requires_grad=True)
>>> x.grad
tensor([16.])
>>> y.grad
tensor([2.])
>>> x = torch.tensor([8.0])
>>> x.device
device(type='cpu')
>>> x.to(torch.device('cuda'))
tensor([8.], device='cuda:0')
>>> x.to(torch.device('cuda:1'))
tensor([8.], device='cuda:1')
torchvision.transforms
torch.utils.data.Dataset
torch.utils.data.Dataloader
torchvision.transforms
Transforms are common image transformations. They can be chained together using Compose
.
PIL.Image
ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
Resize(size, interpolation=2)
torch.Tensor
Normalize(mean, std, inplace=False)
RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
ToPILImage(mode=None)
torch.Tensor
or an numpy.ndarray
to PIL.Image
.ToTensor
PIL.Image
or numpy.ndarray
to torch.Tensor
.torchvision.transforms
data_transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])
torch.utils.data.Dataset
To use…
torch.utils.data.Dataset
__len__
for the size of the dataset__getitem__
to access the dataset with indextorch.utils.data.Dataset
torch.utils.data.Dataset
from torch.utils.data import Dataset
class PlantSeedlingDataset(Dataset):
def __init__(self, root_dir, transform=None):
self.root_dir = Path(root_dir)
self.x = []
self.y = []
self.transform = transform
self.num_classes = 0
if self.root_dir.name == 'train':
for i, _dir in enumerate(self.root_dir.glob('*')):
for file in _dir.glob('*'):
self.x.append(file)
self.y.append(i)
self.num_classes += 1
...
__len__
for the size of the dataset def __len__(self): return len(self.x)
__getitem__
to access the dataset with index def __getitem__(self, index): image = Image.open(self.x[index]).convert('RGB') if self.transform: image = self.transform(image) return image, self.y[index]
torch.utils.data.DataLoader
torch.utils.data.DataLoader(
dataset,
batch_size=1,
shuffle=False,
sampler=None,
batch_sampler=None,
num_workers=0,
...
)
torch.utils.data.DataLoader
train_set = PlantSeedlingDataset(
Path(DATASET_ROOT).joinpath('train'),
data_transform,
)
data_loader = DataLoader(
dataset=train_set,
batch_size=32,
shuffle=True,
)
To build a neural network, you need
torch.nn.Module
To use…
torch.nn.Module
forward
forward()
directlytorch.nn.Module
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
model = Model()
y = model(x)
torch.nn.*Loss
, e.g.
torch.nn.L1Loss
torch.nn.MSELoss
torch.nn.functional.*
, e.g.
torch.nn.functional.binary_cross_entropy
torch.nn.functional.binary_cross_entropy_with_logits
torch.optim
torch.optim
is a package implementing various optimization algorithms.
optimizer = torch.optim.SGD(
model.parameters(),
lr=0.01,
momentum=0.9,
)
Loop over the dataset
dataloader
(training set)Loop over the dataset
dataloader
(test set)def train(model, device, dataloader, optimizer, num_epochs):
for epoch in range(num_epochs):
for (inputs, targets) in dataloader:
inputs = inputs.to(device)
targets = targets.to(device)
# forward
outputs = model(inputs)
loss = F.cross_entropy(outputs, targets)
# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
def test(model, device, dataloader, optimizer):
with torch.no_grad():
for (inputs, targets) in dataloader:
inputs = inputs.to(device)
targets = targets.to(device)
# forward
outputs = model(inputs)
loss = F.cross_entropy(outputs, targets)
# evaluate outputs
python
guide