Pytorchによる深層学習(ディープラーニング)。ネットワークモデル定義例と手書き文字画像分類とモデルの評価

python

深層学習(ディープラーニング)手法を用いて画像認識してみたいです。

このような要望にお応えします。

今回は画像認識タスクの一つである画像分類を深層学習手法を用いて行います。
また、Pytorchを利用します。
Pytorchは、ニューラルネットワークモデルの構築をサポートしてくれます。
このライブラリを使用して、画像分類のモデル構築と評価を行います。

画像分類に使用するデータは、画像認識のサンプルデータとして頻繁に使用されるMNIST手書き文字画像データセットを使用します。

画像分類のモデルは、NN(Neural Network)、CNN(Convolutional Neural Network)を使用します。

Pytorchの実行環境は、Google Colaboratoryを利用しました。

PythonライブラリKerasを用いた手書き文字分類も行っていますので、こちらも興味のある方は確認してみてください。

今回使用するライブラリのバージョンは以下になります。

  • python 3.7
  • torch 1.5.1
  • torchvision 0.6.1

画像認識をはじめていきます。手順は、大きく以下のようになります。

  • 画像データの準備
  • モデルの定義
  • モデルの学習/評価
  • 画像分類結果出力

画像データの準備

各手書き数字画像は、28*28ピクセル(=784ピクセル)で構成されています。
学習データには60000個の画像が用意され、検証用データには10000個の画像を使用することができます。そして、0~9までの10クラスがあり、これらのクラスに正しく分類できるようにモデルの学習を行います。

NNの入力はベクトルですので、画像をベクトルデータになるように変換します。
CNNの入力は2次元画像のままできますので、Convolution層への入力は、そのまま画像データを使用することができます。そして、Convolution層の出力をNNに入力する際に、1次元のベクトルに変換します。

今回の問題は、画像が0~9の整数のうち、どれに相当するのかを学習するマルチクラス分類の問題になりますので、学習時に必要となる0~9のクラスを示すベクトルを用意することになります。

-1~1の範囲で、平均0.5, 標準偏差0.5になるように正規化し、
学習用データと検証用データをtrainloader, testloaderに読み出します。

これでデータの準備は完了です。

今回はMNISTの手書き文字画像を使用していますが、これ以外の自前画像データを用いたい場合もあるかと思います。
下記の記事にて自前画像データを扱ったプログラムを紹介しておりますので、興味のある方は確認してみてはいかがでしょうか。

モデルの定義

次は学習モデルを定義していきます。
NN, CNNのモデルを定義します。

まずは、NNを定義します。
入力層を784(画像ベクトル表現の次元数)、中間層ユニット64、活性化関数としてrelu、出力層を10としたsoftmaxを使用します。

Kerasを用いてネットワークを表現した場合は、下記のようになります。

Pytorchを用いてネットワークを表現した場合は、下記のようになります。

次にCNNを定義します。
CNNでは、畳み込み層と多層ニューラルネットワークを組み合わせたモデルを構築します。

ざっくりとCNNのモデル構築について整理します。
畳み込み層を用いて、分類に役立つ特徴的な箇所を抽出し、分類に役立たない箇所を除去するような特徴量を獲得したうえで、これを多層ニューラルネットワークの入力として使用します。

畳み込み層は、Conv2D, MaxPooling2Dを用いて構築します。

Kerasを用いてネットワークを表現した場合は、以下のようになります。

Conv2D(32, (3, 3), activation=’relu’, input_shape=(28, 28, 1))では、入力画像のサイズを指定し、フィルタ数32、フィルタサイズ3*3を指定しています。この処理により、サイズ26(=28-2)*26(=28-2)の特徴マップが32個作成されます。MaxPooling2D((2, 2))では、ダウンサンプリングを行い、サイズ13*13の特徴マップが32個作成されます。

Conv2D(64, (3, 3), activation=’relu’)では、サイズ11(=13-2)*11(=13-2)の特徴マップが64個作成されます。 MaxPooling2D((2, 2))では、ダウンサンプリングを行い、サイズ5*5の特徴マップが64個作成されます。

Conv2D(64, (3, 3), activation=’relu’)では、サイズ3(=5-2)*3(=5-2)の特徴マップが64個作成されます。このように、ネットワークが深くなるに従い、データのサイズが圧縮されます。

このような畳み込み層から得られた特徴ベクトルを多層ニューラルネットワークに入力します。
そのために、Conv2D(64, (3, 3), activation=’relu’)で獲得した特徴量は(3, 3, 64)の3次元ですので、これをFlatten()を用いて入力できるようにベクトルに変換します。
次にshape(3, 3, 64)を一つ以上のDenseレイヤーを用意して分類を実行します。

MNISTは10クラスですので、Denseレイヤーの出力を10にし、softmax関数を指定します。

Pytorchを用いてネットワークを表現した場合は、下記のようになります。

これでモデルの定義は完了です。

モデルの学習/評価

モデルを学習し、検証用データでモデルを評価してみます。
学習方法を定義します。

上記の学習を指定したepoch数だけ実施します。

学習済みのモデルを保存することができます。

保存したモデルを読み出して使用することもできます。

モデル評価を行います。

NNモデルの評価結果です。

CNNのモデル評価結果です。

CNNモデルのほうが分類性能が高いようですね。

画像分類結果

画像分類の結果は、以下のようになりました。
NN, CNNでの分類結果を載せます。

画像下に出力したラベルの色が青の場合、正解データと予測値が一致し、赤色の場合は、一致しないように出力しています。

NNモデルの画像分類結果

CNNモデルの画像分類結果

いかがでしょうか。このように、Pytorchを使用すれば比較的簡単にディープラーニングモデルを構築できます。また、モデルの学習/評価も簡単にできます。今回は、MNISTの手書き画像分類を行いましたが、自前画像を用意して試すこともできますので活用してみてはいかがでしょうか。

NN, CNNモデルのモデル定義、学習、評価のソースコード全体を載せます。

NNモデルのソースコード

CNNモデルのソースコード

ディープラーニングの発展・応用手法のアイディアを与えてくれつつ、Pytorchの利用方法も知ることができる本があります。

下記のタスクにおける深層ニューラルネットワークモデルの定義を確認することができます。

  • 転移学習、ファインチューニング:少量の画像データからディープラーニングモデルを構築
  • 物体検出(SSD): 画像の物体の位置とカテゴリを検出
  • セマンティックセグメンテーション(PSPNet): ピクセルレベルで画像内の物体を検出
  • 姿勢推定(OpenPose): 人物を検出し、人体の各部位を同定する
  • GAN(DCGAN, Self-Attention GAN): 現実に存在しないリアルな画像を生成
  • 異常検知(AnoGAN, Efficient GAN): 正常画像のみからGANで異常画像を検出
  • 自然言語処理(Transformer, BERT): テキストデータの感情分析を実施
  • 動画分類(3DCNN, ECO): 人物動作の動画データをクラス分類

各タスクのサンプルコードがGithubにて公開されていますので、
こちらを参考にしつつ、内容が気になるという方は本を手に取ってみてはいかがでしょうか。

  • https://github.com/YutaroOgawa/pytorch_advanced
タイトルとURLをコピーしました