以下に、PyTorchを使用してMC Dropoutを実装する方法を示します。
まず、以下のような基本的なネットワークアーキテクチャを持つニューラルネットワークを定義します。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(20, 50)
self.fc2 = nn.Linear(50, 2)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
次に、MC Dropoutを適用するために、モデルの学習時と推論時で挙動を変える必要があります。以下のように、学習時には各層の後にnn.Dropout
を追加し、推論時にはモデルを評価モードに設定します。
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
# 学習ループ
for epoch in range(100):
optimizer.zero_grad()
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()
# 推論時には評価モードに設定
net.eval()
モデルを評価モードに設定した後、MC Dropoutを使用して不確実性を推定するために、推論を複数回行います。以下のコード例では、推論を10回繰り返し、各推論結果の平均を取ります。
num_samples = 10
predictions = []
for _ in range(num_samples):
output = net(input)
predictions.append(output.detach().numpy())
predictions = torch.tensor(predictions)
mean_prediction = torch.mean(predictions, dim=0)
以上がMC Dropoutの基本的な実装方法です。この手法を使用することで、モデルの予測に対する不確実性を推定することができます。