PyTorchの基本的なところ

・ミニマムプログラムには、MNISTではなく、CIFAR10などを使う
MNISTの[28, 28, 1]は都合が悪い。CIFAR10は[32, 32, 3]。


・シード固定

def fix_seed(seed):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
# torch.use_deterministic_algorithms(True)

benchmarkとdeterministicはconvolutionのみに適用される。
use_deterministic_algorithmsは対応していない処理があるので、基本的に使えない。


・pretrained modelはtorchvisionではなく、timmを使う
self.base_model = timm.create_model("efficientnetv2_rw_s", pretrained=True)
※torchvisionの場合
self.base_model = models.__dict__['efficientnet_v2_s'](pretrained=True).features


・pretrained modelの一部を利用する

self.base_model = nn.Sequential(
efficient_net.conv_stem,
efficient_net.bn1,
efficient_net.act1,
efficient_net.blocks[0],
efficient_net.blocks[1],
efficient_net.blocks[2],
efficient_net.blocks[3],
)



・Accuracy計算式の意味
# [batch_size, 1]の予測ラベルを算出
pred = output.argmax(dim=1, keepdim=True)

# targetのshapeをpredと揃えてから、要素ごとにpredと比較し、Trueをカウント。
correct += pred.eq(target.view_as(pred)).sum().item()

targetのshapeが[batch_size, ]なら、以下のコードでも大丈夫。
pred = output.argmax(dim=1, keepdim=False)
correct += pred.eq(target).sum().item()


・Lossのreductionはデフォルトの'mean'を使う
'sum'だとバッチサイズに合わせて学習率を調整する必要がある。'mean'の場合、
loss_sum += loss.item() * data.shape[0]
でバッチごとにLossの和を足していき、
loss_epoch = loss_sum / len(data_loader.dataset)
で1データ当たりのlossを算出する。

・ネットワーク重みの初期化は基本的に不要
最近はHeの初期値などで初期化されているので、初期化処理は基本的に不要。
特殊なネットワークで精度を追い込みたい時だけ考慮する。


・pytorch lightning
LightingDataModuleは不要。fit関数にDataLoaderを渡せる。
seed_everything関数とTrainer(deterministic=True)で再現性。