【PyTorchチュートリアル】VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD-1

チュートリアル名が長すぎて、タイトルがすぐ埋まってしまいます・・・

PyTorchのTensorBoardで訓練を可視化するチュートリアルをやるんだね。

PyTorchのチュートリアルも基本的なところはほぼ網羅してきました。今回から、「VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD」というチュートリアルをやっていきます。TensorBoardというものを利用して、訓練の可視化などができるということで早速このチュートリアルをやっていきます。

あわせて読みたい
Visualizing Models, Data, and Training with TensorBoard — PyTorch Tutorials 1.9.0+cu102 documentatio...

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・PyTorchのチュートリアルを勉強している人

・TensorBoardについて知りたい人

目次

TensorBoardについて

そもそもTensorBoardって何かがわからなかったので、チュートリアル前にあらかじめどんなものなのかを調べます。

次のサイトでちらっと確認してみました。

TensorFlow
TensorBoard  |  TensorFlow TensorBoard:TensorFlowの視覚化ツールキット

Tensorとつくので、Google系だろうなと思っていました。

TensorBoardは、「機械学習の実験に必要な可視化機能とツールを提供」してくれるようですね。なんだかとても便利そうです。これをPyTorchでも利用できるとのことですね。それでは早速チュートリアルに入っていきたいと思います。

チュートリアル事始め

このチュートリアルでは、「TensorBoard」を利用してPyTorchで作成したニューラルネットワークのトレーニング実行結果を視覚化します。チュートリアルのデータセットは、torchvision.datasetsを利用して読み込む「Fashion-MNIST」を利用します。

このチュートリアルで学ぶこと

①データを読み込み、適切な変換を行う

②TensorBoardを設定

③TensorBoardに書き込み

④TensorBoardを使用してモデルアーキテクチャを検査

⑤TensorBoardを使用して、視覚化のインタラクティブバージョンをより少ないプログラムで実装します(意味がよくわからないのですが、次の文章の内容を詳細に可視化できるようです。)

⑤について特に、以下の内容をみていきます。

・訓練データを確認するいくつかの方法

・訓練中にモデルのパフォーマンスを追跡する方法

・訓練されたモデルのパフォーマンスを評価する方法

このチュートリアルは、「60 Minute Blitz」の「CIFAR-10」チュートリアルを基本としています。これから実装するプログラムは「CIFAR-10」チュートリアルのプログラムに類似したプログラムから始めます。

本ブログでも「CIFAR-10」のチュートリアルを次の記事からやっていますので、ご参照ください。

ぱんだクリップ
【AIプログラミング】PyTorchで畳み込みニューラルネットワーク、チュートリアル Part4-1、CIFAR-10 | ぱん... PyTorchの60MinuteBlitzのチュートリアルも、最後のTraining a Classifierに入りました。 やっとここまできたね。60分どころじゃなかったね。 やっとPyTorchチュートリアル...

畳み込みニューラルネットワークの準備

畳み込みニューラルネットワークのモデル定義など、復習も兼ねて一つづつ流れを追っていきます。

まずは、インポートからです。

# imports
import matplotlib.pyplot as plt
import numpy as np

import torch
import torchvision
import torchvision.transforms as transforms

#functionalはas F とするのが一般的
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

注意点として、FashionMNISTは1チャンネルなので、ノーマライズ処理も1チャンネル用に変更されています。

#データを-1~1の範囲にノーマライズ(MNISTのため1チャンネル画像)
transform = transforms.Compose(
    [transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))])

TorchvisionでFashionMNISTを読み込みます。また、データローダーでバッチ管理の準備です。そして、ラベルの答えを文字として定義しておきます。

#FashionMNISTデータセット
trainset = torchvision.datasets.FashionMNIST('./data',
    download=True,
    train=True,
    transform=transform)
testset = torchvision.datasets.FashionMNIST('./data',
    download=True,
    train=False,
    transform=transform)

#データローダー、バッチサイズは4とする。
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                        shuffle=True, num_workers=2)


testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                        shuffle=False, num_workers=2)

#答え(ラベル)の定義
classes = ('T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
        'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle Boot')

FashionMNISTの画像を確認するための関数です。

# FashionMNISTの画像確認用関数
def matplotlib_imshow(img, one_channel=False):
    if one_channel:
        img = img.mean(dim=0)
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    if one_channel:
        plt.imshow(npimg, cmap="Greys")
    else:
        plt.imshow(np.transpose(npimg, (1, 2, 0)))

モデルの定義

次に、CNNのモデルを定義します。CIFAR10チュートリアルのモデルに似ていますが、以下の点に気をつけてモデルを変更します。

①画像チャンネルが3チャンネルから1チャンネルになったこと

②画像サイズが「32×32」から「28×28」になったこと

上記点を変更して、畳み込みニューラルネットワークのモデルを定義します。

ちなみに、画像サイズを追うためには、以下の式で計算します。

(矩形画像、矩形カーネル、ストライド1の場合の式)

畳み込み後の画像サイズ=「入力画像サイズ」ー「カーネルサイズ」+1

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #一番最初の畳み込み層の入力チャンネルが1になっている。
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        #全結合層の入力時には、画像が16チャンネルの4×4画像となっているので「4×4」に変更しています。
        #(画像サイズはforwardメソッドに記載)
        self.fc1 = nn.Linear(16 * 4 * 4, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
         #Conv①:6チャンネルの24×24画像→MaxPool:12×12画像
        x = self.pool(F.relu(self.conv1(x)))
        #Conv②:16チャンネルの8×8画像に→MaxPool:4×4画像
        x = self.pool(F.relu(self.conv2(x)))
        #全結合層に入力するためには、1画像のデータを全て横並びにする。
        #行が画像枚数、列が4×4の16チャンネルの画像ピクセルデータが横並びになったデータ
        x = x.view(-1, 16 * 4 * 4)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()

畳み込み①(Conv①)では、グレースケール1チャンネルの画像を入力して、6チャンネルの画像として「5×5」の矩形カーネルを通って画像が畳み込みされます。

畳み込み①完了時に、画像サイズは、「28-5+1」で、「24×24」となります。そして、MaxPoolingを「2×2」で行うことで画像サイズが半分になり、「12×12」の画像サイズとなります。

畳み込み②(Conv②)では、畳み込み①の出力チャンネルである6チャンネルの画像で画像サイズが「12×12」の画像を入力します。畳み込み②でも「5×5」の矩形カーネルを通るので、「12-5+1」の計算で「8×8」の画像サイズとなります。またここでは16チャンネルに出力します。MaxPoolingで画像サイズが半分となり、全結合層に入力するときには画像は16チャンネル、「4×4」となっています。

やっぱ、画像サイズを追うのは混乱しますね。

続きの記事はこちらです。

ぱんだクリップ
【PyTorchチュートリアル】VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD-2 | ぱんだクリップ TensorBoardは使いこなすととても便利そうです。 ネットワーク構造の可視化が素晴らしいですね。 PyTorchチュートリアルの「VISUALIZING MODELS, DATA, AND TRAINING WITH ...
よかったらシェアしてね!
目次
閉じる