目次
畳み込みニューラルネットワークにおける主な課題 データ拡張 ドロップアウト 正則化 学習率減衰 転移学習による微調整
畳み込みニューラルネットワークにおける主な課題
過学習はモデルが訓練データに過度に依存し、テストデータでは性能が低下する現象です。これはネットワーク構造が複雑で、トレーニングデータ量が限られている場合に特に顕著になります。局所的な特徴を学習してしまうため、汎化性能が低下します。
データ拡張
データ拡張はAlexNetなどの有名なアプローチで採用されており、画像に対してさまざまな変換を適用することで、訓練データを増やすことができます。
代表的な手法として以下のものが挙げられます:
- 任意の位置でのクロップ
- 水平・垂直方向のランダムフリップ
- 任意角度の回転
- 明るさ・コントラスト・色調のランダム変更
以下にPythonコード例を示します:
from PIL import Image
from torchvision import transforms as tfs
import matplotlib.pyplot as plt
# 画像読み込み
image = Image.open('./monkey.jpg')
# サイズ変更
print('変更前サイズ:', image.size)
resized_img = tfs.Resize((100, 200))(image)
print('変更後サイズ:', resized_img.size)
resized_img.show()
# クロップ処理
random_crop = tfs.RandomCrop(100)(resized_img)
center_crop = tfs.CenterCrop(100)(resized_img)
random_crop.show()
center_crop.show()
# 回転処理
rotated_img = tfs.RandomRotation(45)(image)
rotated_img.show()
# 明るさ変更
brightened_img = tfs.ColorJitter(brightness=0.5)(image)
brightened_img.show()
# プロット
fig, axes = plt.subplots(3, 3, figsize=(8, 8))
for i in range(3):
for j in range(3):
axes[i][j].imshow(brightened_img)
axes[i][j].axis('off')
plt.show()
ドロップアウト
ドロップアウトは訓練時にランダムにニューロンを無効化することで過学習を抑制する手法です。実装は以下の通りです:
import torch.nn as nn
# 0.5の確率でニューロンを保持
nn.Dropout(0.5)
正則化
L2正則化は損失関数に重みベクトルの二乗ノルムを加算することで、過剰な重み更新を抑える手法です。PyTorchでの実装は以下の通り:
import torch.optim as optim
# 重み減衰係数を指定
optimizer = optim.SGD(net.parameters(), lr=0.1, weight_decay=1e-4)
学習率減衰
学習率を段階的に減少させるには以下のように設定します:
from torch.optim.lr_scheduler import StepLR
# 学習率スケジューラの設定
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
scheduler.step()
転移学習による微調整
事前に学習済みモデルを使用する方法は以下の通りです:
from torchvision import models
# プレトレーニング済みモデルのロード
net = models.resnet50(pretrained=True)
# モデル構造確認
print(net)
print(net.conv1.weight)