PyTorch と TensorFlow で画像分類モデルをトレーニングする方法

PyTorch と TensorFlow で画像分類モデルをトレーニングする方法

導入

画像分類は、コンピューター ビジョンの最も重要なアプリケーションの 1 つです。その応用範囲は、自動運転車における物体の分類から医療業界における血球認識、製造における不良品の特定から人がマスクを着用しているかどうかを分類できるシステムの構築まで多岐にわたります。これらすべての業界では、何らかの形で画像分類が使用されています。彼らはどうやってそれを行うのでしょうか?どのフレームワークを使用していますか?

TensorFlow、PyTorch、Keras などのさまざまなディープラーニング フレームワークの違いについて、多くのことを読んだことがあるはずです。 TensorFlow と PyTorch は間違いなく業界で最も人気のあるフレームワークです。これらのディープラーニング フレームワーク間の類似点と相違点を学ぶためのリソースは無数に見つかるはずです。

[[348640]]

この記事では、PyTorch と TensorFlow で基本的な画像分類モデルを構築する方法について説明します。まず、PyTorch と TensorFlow の簡単な概要から始めます。次に、MNIST 手書き数字分類データセットを使用し、PyTorch と TensorFlow で CNN (畳み込みニューラル ネットワーク) を使用して画像分類モデルを構築します。

これが出発点となり、その後は好きなフレームワークを選択して、他のコンピューター ビジョン モデルの構築も開始できます。

目次

  1. PyTorch の概要
  2. TensorFlow の概要
  3. 問題ステートメントの理解: MNIST
  4. PyTorch で畳み込みニューラル ネットワーク (CNN) を実装する
  5. TensorFlow で畳み込みニューラル ネットワーク (CNN) を実装する

PyTorch の概要

PyTorch はディープラーニング コミュニティで人気が高まっており、ディープラーニングの実践者によって広く使用されています。PyTorch は、Tensor コンピューティングを提供する Python パッケージです。さらに、テンソルは、NumPy の ndarray と同様に GPU でも実行できる多次元配列です。

PyTorch のユニークな機能は、動的計算グラフを使用することです。 PyTorch の Autograd パッケージは、テンソルから計算グラフを生成し、勾配を自動的に計算します。特定の機能を持つ定義済みのグラフィックではなく。

PyTorch は、実行時に計算グラフを構築し、さらにはそれを変更するためのフレームワークを提供します。特に、ニューラル ネットワークを作成するためにどれだけのメモリが必要になるかわからない場合に役立ちます。

PyTorch を使用すると、さまざまなディープラーニングの課題に取り組むことができます。課題のいくつかを以下に示します。

  1. 画像(検出、分類など)
  2. テキスト(分類、生成など)
  3. 強化学習

TensorFlow の概要

TensorFlow は、Google Brain チームの研究者とエンジニアによって開発されました。これは、ディープラーニングの分野で最も一般的に使用されているソフトウェア ライブラリからはまだまだ遠いです (ただし、他のソフトウェア ライブラリは急速に追いついています)。

TensorFlow が人気を博している最大の理由の 1 つは、Python、C++、R など、ディープラーニング モデルを作成するための複数の言語をサポートしていることです。詳細なドキュメントとガイドによるガイダンスを提供します。

TensorFlow は多くのコンポーネントで構成されています。ここに 2 つの優れた例を示します。

  1. TensorBoard : データフローグラフを使用してデータを効率的に視覚化します
  2. TensorFlow : 新しいアルゴリズムや実験を素早く展開するのに非常に便利です

TensorFlow は現在、2019 年 9 月に正式にリリースされたバージョン 2.0 を実行しています。バージョン2.0ではCNNも実装する予定です。

これで、PyTorch と TensorFlow の両方について基本的な理解が得られたと思います。それでは、これら 2 つのフレームワークを使用してディープラーニング モデルを構築し、その内部の仕組みを理解してみましょう。その前に、まずこの記事で解決する問題の定義を理解しましょう。

問題ステートメントの理解: MNIST

始める前に、データセットを理解しましょう。この記事では、人気の MNIST 問題を解決します。これは、手書きの数字の画像を 0 から 9 までの 10 個のカテゴリのいずれかに分類する数字認識タスクです。

MNIST データセットには、さまざまなスキャンされた文書から取得され、サイズが正規化され、中央に配置された数字の画像があります。その後、各画像は 28 x 28 ピクセルの正方形 (合計 784 ピクセル) になります。モデルの評価と比較にはデータセットの標準的な分割が使用され、モデルのトレーニングには 60,000 枚の画像が使用され、モデルのテストには別の 10,000 枚の画像セットが使用されます。

これで、データセットも理解できました。それでは、PyTorch と TensorFlow で CNN を使用して画像分類モデルを構築してみましょう。まずは PyTorch での実装から始めます。これらのモデルは、ディープラーニング モデルを実行するための無料の GPU を提供する Google Colab に実装されます。

PyTorch で畳み込みニューラル ネットワーク (CNN) を実装する

まず、すべてのライブラリをインポートします。

  1. # ライブラリのインポート
  2. numpyをnpとしてインポートする
  3. 輸入トーチ
  4. torchvisionをインポートする
  5. matplotlib.pyplot を plt としてインポートします
  6. 時刻からインポート時刻
  7. torchvisionからデータセットをインポートし、変換する
  8. torchインポートnn、optimから

Google colab で PyTorch のバージョンも確認してみましょう。

  1. # PyTorch のバージョン
  2. 印刷(torch.__version__)

そこで、私は PyTorch の 1.5.1 バージョンを使用しています。他のバージョンを使用すると、警告やエラーが発生する可能性があるため、このバージョンの PyTorch に更新できます。ピクセル値の正規化など、画像に対していくつかの変換を実行するので、それらも定義しましょう。

  1. # 画像に適用される変換
  2. 変換 = transforms.Compose([transforms.ToTensor(),
  3. 変換します。正規化します(( 0.5 ,), ( 0.5 ,)),
  4. ])

それでは、MNIST データセットのトレーニング セットとテスト セットを読み込んでみましょう。

  1. # トレーニングセットとテストセットの定義
  2. trainset = datasets.MNIST( './data' 、ダウンロード=True、トレーニング=True、変換=transform)
  3. テストセット = datasets.MNIST( './' 、ダウンロード=True、トレーニング=False、変換=transform)

次に、トレーニング セットとテスト セットをバッチでロードするのに役立つ、トレーニング ローダーとテスト ローダーを定義しました。バッチ サイズを 64 と定義しました。

  1. # trainloader と testloader の定義
  2. トレインローダー = torch.utils.data.DataLoader(トレインセット、バッチサイズ = 64 、シャッフル = True)
  3. testloader = torch.utils.data.DataLoader(テストセット、batch_size= 64 、shuffle=True)

まず、トレーニング セットの概要を見てみましょう。

  1. # トレーニングデータの形状
  2. dataiter = iter(trainloader)
  3. 画像、ラベル = dataiter.next()
  4.  
  5. 印刷(images.shape)
  6. 印刷(ラベル.形状)

したがって、各バッチには、サイズがそれぞれ 28,28 の画像が 64 個あり、各画像には対応するラベルがあります。トレーニング画像を視覚化して、どのように見えるか確認してみましょう。

  1. # トレーニング画像の視覚化
  2. plt.imshow(images[ 0 ].numpy().squeeze(), cmap= 'gray' )

数字の0のイメージです。同様に、テスト セットの画像を視覚化してみましょう。

  1. # 検証データの形状
  2. dataiter = iter(テストローダー)
  3. 画像、ラベル = dataiter.next()
  4.  
  5. 印刷(images.shape)
  6. 印刷(ラベル.形状)

テスト セットには、サイズ 64 のバッチもあります。ではアーキテクチャを定義しましょう

モデルアーキテクチャの定義

ここではCNNモデルを使用します。それでは、モデルを定義してトレーニングしてみましょう。

  1. # モデルアーキテクチャの定義
  2. クラスNet(nn.Module):
  3. __init__(self)を定義します。
  4. super (Net, self).__init__()
  5.  
  6. self.cnn_layers = nn.Sequential(
  7. # 2D畳み込み層の定義
  8. nn.Conv2d( 1 , 4 , カーネルサイズ= 3 , ストライド= 1 , パディング= 1 ),
  9. nn.BatchNorm2d( 4 )、
  10. nn.ReLU(インプレース=True)、
  11. nn.MaxPool2d(カーネルサイズ= 2 、ストライド= 2 )、
  12. # 別の2D畳み込み層の定義
  13. nn.Conv2d( 4 , 4 , カーネルサイズ= 3 , ストライド= 1 , パディング= 1 ),
  14. nn.BatchNorm2d( 4 )、
  15. nn.ReLU(インプレース=True)、
  16. nn.MaxPool2d(カーネルサイズ= 2 、ストライド= 2 )、
  17.  
  18. self.linear_layers = nn.Sequential(
  19. nn.線形( 4 * 7 * 7 , 10 )
  20.  
  21. # フォワードパスの定義
  22. def forward(self, x):
  23. x = 自己.cnn_layers(x)
  24. x = x.view(x.size( 0 ), - 1 )
  25. x = 自己.線形レイヤー(x)
  26. xを返す

また、オプティマイザーと損失関数を定義し、モデルの概要を見てみましょう。

  1. # モデルの定義
  2. モデル = ネット()
  3. # オプティマイザの定義
  4. オプティマイザー = optim.Adam(model.parameters(), lr= 0.01 )
  5. # 損失関数の定義
  6. 基準 = nn.CrossEntropyLoss()
  7. # GPUが利用可能かどうかを確認
  8. torch.cuda.is_available()の場合:
  9. モデル = model.cuda()
  10. 基準 = 基準.cuda()
  11.  
  12. 印刷(モデル)

したがって、画像から特徴を抽出するのに役立つ 2 つの畳み込み層があります。これらの畳み込み層からの特徴は、画像をそれぞれのカテゴリに分類する完全接続層に渡されます。モデル アーキテクチャの準備ができたので、このモデルを 10 エポックにわたってトレーニングしてみましょう。

  1. iが範囲( 10 )内にある場合:
  2. ランニングロス = 0  
  3. トレインローダー内の画像、ラベルの場合:
  4.  
  5. torch.cuda.is_available()の場合:
  6. 画像 = images.cuda()
  7. ラベル = labels.cuda()
  8.  
  9. # トレーニングパス
  10. オプティマイザ.zero_grad()
  11.  
  12. 出力 = モデル(画像)
  13. 損失 = 基準(出力、ラベル)
  14.  
  15. #ここでモデルはバックプロパゲーションによって学習します
  16. 損失.後方()
  17.  
  18. #ここで重みを最適化します
  19. オプティマイザ.ステップ()
  20.  
  21. 実行中の損失 += 損失.item()
  22. それ以外
  23. print( "エポック {} - トレーニング損失: {}" .format(i+ 1 , running_loss/len(trainloader)))

エポックが増加するにつれてトレーニングが減少することがわかります。これは、モデルがトレーニング セットからパターンを学習していることを意味します。このモデルのパフォーマンスをテスト セットで確認してみましょう。

  1. # テストセットの予測を取得し、パフォーマンスを測定する
  2. 正しいカウント、全カウント= 0、0  
  3. テストローダー内の画像、ラベルの場合:
  4. i が範囲(len(ラベル))内にある場合:
  5. torch.cuda.is_available()の場合:
  6. 画像 = images.cuda()
  7. ラベル = labels.cuda()
  8. img = 画像[i].view( 1 , 1 , 28 , 28 )
  9. torch.no_grad() の場合:
  10. logps = モデル(画像)
  11.  
  12.  
  13. ps = torch.exp(logps)
  14. 確率 = リスト(ps.cpu()[ 0 ])
  15. pred_label = probab.index(max(probab))
  16. true_label = labels.cpu()[i]
  17. true_label == pred_labelの場合:
  18. 正しい数 += 1  
  19. すべて_カウント += 1  
  20.  
  21. print( "テストした画像の数 =" , all_count)
  22. print( "\nモデル精度 =" , (correct_count/all_count))

そこで合計 10,000 枚の画像でテストしたところ、モデルはテスト画像のラベルを約 96% の精度で予測できました。

これが PyTorch で畳み込みニューラル ネットワークを構築する方法です。次のセクションでは、同じアーキテクチャを TensorFlow で実装する方法について説明します。

TensorFlow で畳み込みニューラル ネットワーク (CNN) を実装する

ここで、TensorFlow の畳み込みニューラル ネットワークを使用して同じ MNIST 問題を解決してみましょう。いつものように、ライブラリをインポートすることから始めます。

  1. # ライブラリのインポート
  2. テンソルフローをtfとしてインポートする
  3.  
  4. tensorflow.kerasからデータセット、レイヤー、モデルをインポートする
  5. tensorflow.keras.utils からto_categorical をインポートします
  6. matplotlib.pyplot を plt としてインポートします

使用している TensorFlow のバージョンを確認します。

  1. # テンソルフローのバージョン
  2. print(tf.__version__)

したがって、TensorFlow のバージョン 2.2.0 を使用します。次に、tensorflow.keras のデータセット クラスを使用して MNIST データセットをロードします。

  1. (train_images、train_labels)、(test_images、test_labels) = datasets.mnist.load_data(path= 'mnist.npz' )
  2. # ピクセル値を0から1の間に正規化する 
  3. トレーニング画像、テスト画像 = トレーニング画像 / 255.0 、テスト画像 / 255.0  

ここでは、MNIST データセットのトレーニング セットとテスト セットをロードしました。さらに、トレーニング画像とテスト画像のピクセル値を正規化しました。次に、データセットからいくつかの画像を視覚化してみましょう。

  1. # いくつかの画像を視覚化する
  2. plt.figure(図のサイズ=( 10 , 10 ))
  3. iが範囲( 9 )内にある場合:
  4. plt.subplot( 3,3 ,i+ 1 )サブプロット
  5. plt.xticks([])
  6. plt.yticks([])
  7. plt.grid(False)
  8. plt.imshow(train_images[i], cmap= 'gray' )
  9. plt.show()

これが私たちのデータセットの外観です。手書きの数字の画像があります。トレーニング セットとテスト セットの形状を見てみましょう。

  1. # トレーニングセットとテストセットの形状
  2. (train_images.shape、train_labels.shape)、(test_images.shape、test_labels.shape)

したがって、トレーニング セットには 28 x 28 の画像が 60,000 枚あり、テスト セットには同じ形状の画像が 10,000 枚あります。次に、画像のサイズを変更し、ターゲット変数をワンホットエンコードします。

  1. # 画像の変形
  2. train_images = train_images.reshape(( 60000 , 28 , 28 , 1 ))
  3. test_images = test_images.reshape(( 10000 , 28 , 28 , 1 ))
  4.  
  5. # ターゲット変数をワンホットエンコードする
  6. train_labels = to_categorical(train_labels)
  7. test_labels = to_categorical(test_labels)

モデルアーキテクチャの定義

ここで、モデルのアーキテクチャを定義します。 Pytorch で定義されているのと同じアーキテクチャを使用します。したがって、私たちのモデルは、2 つの畳み込み層と最大プーリング層の組み合わせになり、次にフラット化層があり、最後にクラスが 10 個あるため 10 個のニューロンを持つ完全接続層があります。

  1. # モデルアーキテクチャの定義
  2. モデル = models.Sequential()
  3. モデルを追加します(レイヤー.Conv2D( 4 , ( 3 , 3 ), アクティベーション= 'relu' , input_shape=( 28 , 28 , 1 )))
  4. モデルを追加します(layers.MaxPooling2D(( 2 , 2 ), ストライド= 2 ))
  5. モデルに追加(レイヤー.Conv2D( 4 , ( 3 , 3 ), アクティベーション= 'relu' ))
  6. モデルを追加します(layers.MaxPooling2D(( 2 , 2 ), ストライド= 2 ))
  7. モデルを追加します(レイヤーをフラット化します)
  8. model.add(layers.Dense( 10 , activation= 'softmax' ))

モデルの概要を簡単に見てみましょう。

  1. # モデルの概要
  2. モデル.要約()

要約すると、2 つの畳み込み層、2 つの最大プーリング層、フラット化層、および完全接続層があります。モデル内のパラメータの総数は 1198 です。モデルの準備ができたので、コンパイルします。

  1. # モデルのコンパイル
  2. model.compile(optimizer= 'adam' ,
  3. 損失 = 'カテゴリクロスエントロピー'
  4. メトリック=[ '精度' ])

Adam オプティマイザーを使用していますが、変更することもできます。多クラス分類問題を解決しているため、損失関数はカテゴリクロスエントロピーに設定され、メトリックは「精度」です。それではモデルを10エポックトレーニングしてみましょう

  1. # モデルのトレーニング
  2. 履歴 = model.fit(train_images, train_labels, エポック = 10 、検証データ = (test_images, test_labels))

要約すると、最初はトレーニング損失は約 0.46 でしたが、10 エポック後にはトレーニング損失は 0.08 に低下しました。10 エポック後のトレーニングと検証の精度はそれぞれ 97.31% と 97.48% でした。

これが TensorFlow で CNN をトレーニングする方法です。

注釈

要約すると、この記事ではまず、PyTorch と TensorFlow の概要を簡単に説明しました。次に、MNIST 手書き数字分類の課題について学び、最後に PyTorch と TensorFlow で CNN (畳み込みニューラル ネットワーク) を使用して画像分類モデルを構築しました。さて、皆さんは両方のフレームワークに精通していると思います。次に、別の画像分類の課題に取り組み、PyTorch と TensorFlow の両方を使用して解決してみます。

<<:  2020年の世界コンサルティング会社の新ランキング:AI時代の新たな課題

>>:  IT プロフェッショナルが CIO に人工知能について知ってほしい 9 つのこと

ブログ    
ブログ    
ブログ    

推薦する

ビル・ゲイツ: 生成AIは限界に達した

ビル・ゲイツ氏の暴露は機械学習コミュニティで話題となっている。 「GPT-5 は GPT-4 よりそ...

複数の都市が共同で人工知能コンピューティングネットワークを点灯し、人工知能産業の発展を促進する

Huawei Connect 2021では、中国科学技術情報研究所(CITI)、AITISA(新世代...

高度な分析とコンピューティング技術の出現が世界のインテリジェントアプリケーション市場を牽引

世界的なスマート アプリケーション市場の成長は、高度なコンピューティングおよび分析テクノロジによって...

...

MITのロボットは、浸透する無線周波数を使って隠れた物体を感知する

[[391062]]海外メディアの報道によると、世界中の研究者がロボットが周囲の状況をよりよく認識...

...

LLMLingua: LlamaIndex を統合してプロンプトを圧縮し、大規模な言語モデルに効率的な推論を提供します。

大規模言語モデル (LLM) の出現により、複数の分野でイノベーションが促進されました。しかし、思考...

Google は、DQN と同等で、より優れた一般化パフォーマンスを備えた 2 つの新しい強化学習アルゴリズムを実装しました。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

...

...

人工知能が伝統文化に新たな命を吹き込む。パンダ型ロボット「Youyou」が国境を越えて「新年クロストーク会議」に参加

「パンダはトークができる、パンダはジョークを言うことができる、パンダは書道を書ける、そしてパンダはチ...

スマートドライビングが誕生してから10年経った今、なぜ理想的なビジネスモデルの実現が難しいのでしょうか?

[[420239]] 2011年7月14日、紅旗HQ3は長沙から武漢までの286キロの高速道路を疾...

合成データとAIの「非現実的な」世界を探る

最近、アクセンチュアは「メタバースで出会う:テクノロジーとエクスペリエンスの連続体のビジネスを再構築...

詩人のような機械学習: ML の仕組みについての素晴らしい啓示

機械学習はデータ内のパターンを使用して物事にラベルを付けます。魔法のように聞こえますが、核となる概念...