見出し画像

Apache MXNet (Incubating) を用いたMNISTデータセットを使って手書き数字の分類を行うディープラーニングモデルの構築

はじめに。



PythonとGluon APIを使った、MNISTデータセットの手書き数字の分類を行うモデルの構築。Apache MXNet(もうフルフレッジしたのかな?Full-Fledgedなら「Incubating」を外さないとね(笑))

前提で、私はMKLなので、

$ pip install --upgrade mxnet-mkl gluoncv

(ここのPipに関しては、MXNetの本家サイトに行けば教えてくれる:


コード:

import mxnet as mx
from mxnet import nd, autograd, gluon
from mxnet.gluon import nn
from mxnet.gluon.data.vision import transforms
import numpy as np

# Select GPU if available
ctx = mx.gpu() if mx.context.num_gpus() > 0 else mx.cpu()

# Load the data
mnist_train = gluon.data.vision.MNIST(train=True)
mnist_test = gluon.data.vision.MNIST(train=False)

# Define the transforms
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(0.13, 0.31)
])

# Apply the transforms
train_data = mnist_train.transform_first(transform)
test_data = mnist_test.transform_first(transform)


# Create DataLoader
batch_size = 64
train_loader = gluon.data.DataLoader(train_data, batch_size, shuffle=True)
test_loader = gluon.data.DataLoader(test_data, batch_size, shuffle=False)

# Define the network
net = nn.Sequential()
net.add(nn.Conv2D(channels=6, kernel_size=(3, 3), padding=(1, 1), activation='relu'))
net.add(nn.MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
net.add(nn.Conv2D(channels=16, kernel_size=(5,5), activation='relu'))
net.add(nn.MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
net.add(nn.Flatten())
net.add(nn.Dense(120, activation='relu'))
net.add(nn.Dense(84, activation='relu'))
net.add(nn.Dense(10))

# Initialize the network
net.initialize(mx.init.Xavier(), ctx=ctx)

# Define the loss function and the trainer
loss_function = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})

# Training loop
epochs = 10

for epoch in range(epochs):
    train_loss = 0.0
    for data, label in train_loader:
        data = data.as_in_context(ctx)
        label = label.as_in_context(ctx)

        with autograd.record():
            output = net(data)
            loss = loss_function(output, label)
        loss.backward()
        trainer.step(batch_size)

        train_loss += loss.mean().asscalar()

    print(f"Epoch {epoch + 1}, Loss: {train_loss / len(train_loader)}")

# Testing the model
correct = 0
total = 0
for data, label in test_loader:
    data = data.as_in_context(ctx)
    label = label.as_in_context(ctx)

    output = net(data)
    predictions = nd.argmax(output, axis=1)
    predictions = predictions.astype('int32') 
    correct += nd.sum(predictions == label).asscalar()
    total += len(label)

print(f"Test Accuracy: {correct / total * 100}%")

Result:

Epoch 1, Loss: 0.20014777287656169
Epoch 2, Loss: 0.059892824989359286
Epoch 3, Loss: 0.0422106420697976
Epoch 4, Loss: 0.03274029154594971
Epoch 5, Loss: 0.026563966428387667
Epoch 6, Loss: 0.02082600708179206
Epoch 7, Loss: 0.016873689909285776
Epoch 8, Loss: 0.013512258920589274
Epoch 9, Loss: 0.014132531894310907
Epoch 10, Loss: 0.01030987791778968
Test Accuracy: 99.11%


一応、

GPT-4モデルのChatGPTさんによる解説

を以下:

このコードは、MNISTデータセットを使用して手書き数字の分類を行うための畳み込みニューラルネットワーク(CNN)を構築し、学習および評価を行っています。結果として、10エポックの学習後、テストデータに対して約99.11%の正確さが達成されています。

コードの主な部分は以下のとおりです。

  1. 必要なライブラリをインポートします。

  2. GPUが利用可能であれば、GPUを使用するように設定します。

  3. MNISTデータセットをロードし、データ変換を定義して適用します。

  4. DataLoaderを作成して、データのバッチ処理を行います。

  5. 畳み込みニューラルネットワーク(CNN)を定義します。

  6. ネットワークを初期化し、損失関数とオプティマイザを定義します。

  7. トレーニングループを実行して、モデルを学習させます。

  8. 学習されたモデルを使用して、テストデータで評価を行います。

この実装は、畳み込みニューラルネットワーク(CNN)を使用してMNISTデータセットに対する高い性能を達成しており、手書き数字の認識タスクに適しています。

テストデータに対して99.11%の正解率が得られました。この結果は、ニューラルネットワークがMNISTデータセットに対して非常に良い性能を発揮していることを示しています。


What is Apache MXNet??

MXNetは、スケーラブルで効率的なディープラーニングフレームワークです。Apacheソフトウェア財団が開発しており、柔軟で効率的なディープラーニングアプリケーションを構築することを目的としています。MXNetは、Python、R、Scala、Go、Julia、Perl、C++など複数のプログラミング言語でサポートされています。また、AWS(Amazon Web Services)でも公式にサポートされています。

MXNetの主な特徴は以下の通りです:

パフォーマンスとスケーラビリティ:MXNetは、マルチコアCPUとGPUを効率的に活用し、大規模な分散システムでのトレーニングと推論をサポートしています。

シンボリックとインペリアティブAPI:MXNetは、シンボリック(グラフベース)APIとインペリアティブ(Eager Execution)APIを提供しており、開発者はどちらか好みのスタイルでモデルを構築できます。

Gluon:MXNetの高レベルAPIであるGluonは、ニューラルネットワークの定義とトレーニングを簡単にするために設計されています。Gluonは、プリトレーニングされたモデルのコレクションも提供しており、独自のディープラーニングモデルを素早く開発できます。

ONNXサポート:MXNetは、ONNX(Open Neural Network Exchange)形式をサポートしており、他のディープラーニングフレームワークと相互運用性があります。

自動微分:MXNetは、自動微分をサポートしており、ニューラルネットワークの勾配計算を自動化します。

これらの特徴により、MXNetは、幅広いディープラーニングアプリケーション開発に適したフレームワークです。

ChatGPT (GPT-4)

おそらく、今後の主流は、
Apache MXNet, Apache TVM, OpenVINO、みたいな感じになっていくと思われるので。まあ特にOpenVINOは、Intelって選択肢だと欠かせないだろうし。

こういうの:
https://jellyware.jp/openvino/

(USBスティック型の、Vision Processing Unit(VPU))


Appendix:

表紙写真:タイのLong Neck Karen族の女の子。

AI美女編(笑)


マハーラーイ(タイの女学生)っす(笑)

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!