PyTorch torchvision コンピュータビジョンモジュール
torchvision は、PyTorchエコシステムにおけるコンピュータビジョンタスク専用の拡張ライブラリで、以下のコア機能を提供します:
- 事前学習済みモデル:ResNet、VGG、AlexNet などの古典的な CNN アーキテクチャ実装を含む
- データセットツール:CIFAR10、MNIST、ImageNet などの一般的な視覚データセットを内蔵
- 画像変換:さまざまな画像前処理およびデータ拡張手法を提供
- 実用ツール:動画処理、画像操作などの補助機能を含む
# 安装 torchvision(通常与 PyTorch 一起安装) pip install torch torchvision
コアコンポーネントの解析
1. torchvision.models
事前学習済みのコンピュータビジョンモデルを提供し、転移学習に直接利用できます:
サンプル
import torchvision.models as models
# 事前学習済みモデルをロード
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
# 事前学習済みモデルをロード
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
よく使われるモデルリスト:
| モデル名 | 適用シナリオ | パラメータ数 | Top-1 精度 |
|---|---|---|---|
| ResNet | 汎用画像分類 | 11M-60M | 69%-80% |
| VGG | 特徴抽出 | 138M | 71.3% |
| MobileNet | モバイルアプリケーション | 3.4M | 70.6% |
| EfficientNet | 高効率モデル | 5M-66M | 77%-84% |
2. torchvision.datasets
よく使われるコンピュータビジョンデータセットを内蔵し、データロードのプロセスを簡素化します:
サンプル
from torchvision import datasets
# CIFAR10 データセットをロード
train_data = datasets.CIFAR10(
root='data',
train=True,
download=True,
transform=transforms.ToTensor()
)
# MNIST データセットをロード
test_data = datasets.MNIST(
root='data',
train=False,
download=True
)
# CIFAR10 データセットをロード
train_data = datasets.CIFAR10(
root='data',
train=True,
download=True,
transform=transforms.ToTensor()
)
# MNIST データセットをロード
test_data = datasets.MNIST(
root='data',
train=False,
download=True
)
サポートされているデータセットの種類:
サンプル
graph TD
A[torchvision.datasets] --> B[分類データセット]
A --> C[検出データセット]
A --> D[セグメンテーションデータセット]
B --> B1[CIFAR10/100]
B --> B2[MNIST/FashionMNIST]
B --> B3[ImageNet]
C --> C1[COCO]
C --> C2[VOC]
D --> D1[Cityscapes]
A[torchvision.datasets] --> B[分類データセット]
A --> C[検出データセット]
A --> D[セグメンテーションデータセット]
B --> B1[CIFAR10/100]
B --> B2[MNIST/FashionMNIST]
B --> B3[ImageNet]
C --> C1[COCO]
C --> C2[VOC]
D --> D1[Cityscapes]
3. torchvision.transforms
画像前処理とデータ拡張のコアツール:
サンプル
from torchvision import transforms
# 画像変換パイプラインを定義
transform = transforms.Compose([
transforms.Resize(256), # リサイズ
transforms.CenterCrop(224), # 中央クロップ
transforms.ToTensor(), # テンソルに変換
transforms.Normalize( # 標準化
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
# 画像変換パイプラインを定義
transform = transforms.Compose([
transforms.Resize(256), # リサイズ
transforms.CenterCrop(224), # 中央クロップ
transforms.ToTensor(), # テンソルに変換
transforms.Normalize( # 標準化
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
よく使われる変換方法の分類:
| カテゴリ | メソッド例 | 効果 |
|---|---|---|
| 幾何変換 | RandomRotation, RandomResizedCrop | 位置不変性を向上 |
| 色変換 | ColorJitter, Grayscale | 色のロバスト性を強化 |
| ぼかし/ノイズ | GaussianBlur, RandomErasing | 過学習を防止 |
| 複合変換 | RandomApply, RandomChoice | 柔軟な組み合わせ戦略 |
実践サンプル:画像分類フロー
1. データ準備
サンプル
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# データ変換を定義
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# データセットをロード
train_set = datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=train_transform
)
# データローダーを作成
train_loader = DataLoader(
train_set,
batch_size=32,
shuffle=True
)
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# データ変換を定義
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# データセットをロード
train_set = datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=train_transform
)
# データローダーを作成
train_loader = DataLoader(
train_set,
batch_size=32,
shuffle=True
)
2. モデルトレーニング
サンプル
import torch.nn as nn
import torch.optim as optim
# 事前学習済みモデルを使用
model = models.resnet18(pretrained=True)
# 最終層を変更(CIFAR10 の 10 分類に対応)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
# 損失関数とオプティマイザを定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# トレーニングループ
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
import torch.optim as optim
# 事前学習済みモデルを使用
model = models.resnet18(pretrained=True)
# 最終層を変更(CIFAR10 の 10 分類に対応)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
# 損失関数とオプティマイザを定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# トレーニングループ
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
高度な機能
1. カスタムデータセット
サンプル
from torchvision.datasets import VisionDataset
class CustomDataset(VisionDataset):
def __init__(self, root, transform=None):
super().__init__(root, transform=transform)
# __getitem__ と __len__ を実装
def __getitem__(self, index):
# (image, target) タプルを返す
pass
def __len__(self):
# データセットのサイズを返す
pass
class CustomDataset(VisionDataset):
def __init__(self, root, transform=None):
super().__init__(root, transform=transform)
# __getitem__ と __len__ を実装
def __getitem__(self, index):
# (image, target) タプルを返す
pass
def __len__(self):
# データセットのサイズを返す
pass
2. モデルのエクスポートとデプロイ
サンプル
# ONNX 形式にエクスポート
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
dummy_input,
"model.onnx",
input_names=["input"],
output_names=["output"]
)
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
dummy_input,
"model.onnx",
input_names=["input"],
output_names=["output"]
)
ベストプラクティス提案
1、データ拡張戦略:
- トレーニング時はランダム変換を使用してデータを拡張する
- 検証/テスト時は決定論的な変換のみを使用する
2、転移学習のテクニック:
サンプル
# 最終層以外のすべてのパラメータを凍結
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
3、パフォーマンス最適化:
- 使用
num_workersパラメータでデータロードを高速化 - 大規模データセットでは、使用を検討する
Datasetのサブセット
4、よくある間違い:
- 呼び出しを忘れる
zero_grad() - を混同した
train()とeval()モード - 画像テンソルの形状がモデルの要件を満たしていない(C×H×W であるべき)