フラックスを用いたJuliaにおける簡単なMNIST認識


簡単な紹介


ニューラルネットワーク


リソース

IBM雲教育- What are Neural Networks?
ビデオ
ニューラルネットワークのエピソード
https://cs50.harvard.edu/ai/2020/weeks/5/

ジュリア


Juliaはオープンソースでコンパイルされた、高レベルのプログラミング言語です.(ジュリアについての詳細)
これは、例えば、VSCodeまたはhttps://github.com/julia-vscode/julia-vscode(Junoで構築されている)で、AtomのようなIDEで使用することができます.

フラックス


フラックスは、ジュリアで書かれた深い機械学習ライブラリです.詳細は、Githubリポジトリhttps://arxiv.org/pdf/1811.01457.pdfまたはホームページhttps://github.com/FluxML/Flux.jlにおいて、https://fluxml.ai/となります.

文部省


MNISTは手書き数字イメージを含むデータセットです

プログラム


インポートライブラリ


ジュリアでライブラリをインストールしてインストールするには、pkgを使うことができます.機能追加
#Example
using Pkg
Pkg.add("Flux")
またはREPLとタイプ] add Fluxを使用します.

プロジェクトファイル内のライブラリの使用


using Flux, MLDatasets, CUDA
using Flux: train!, onehotbatch

データを得る


MLDatasetsライブラリには、いくつかのVisonデータセットが含まれます.を含む.MLDatasets.MNIST.traindata()は60000の28 x 28グレースケール画像とラベルベクトル(0から9までの数字)を含む配列を返します.MLDatasets.MNIST.testdata()は10000の画像とラベルを返します.
# Load training data (images, labels)
x_train, y_train = MLDatasets.MNIST.traindata()
# Load test data (images, labels)
x_test, y_test = MLDatasets.MNIST.testdata()
# Convert grayscale to float
x_train = Float32.(x_train)
# Create labels batch
y_train = Flux.onehotbatch(y_train, 0:9)

文部省 クリエイトモデル


モデルは3層があります

  • ドル:784の入力を含んでいる層は、256の出力
  • を入力します
  • 2:256の入力と10の出力を含んでいる層
  • model = Chain(
        Dense(784, 256, relu),
        Dense(256, 10, relu), softmax
    )
    

    トレーニング


    損失関数 .プロジェクトはlogitcrossentropycross-entropy

    "This is mathematically equivalent to crossentropy(softmax(ŷ), y), but is more numerically stable than using functions crossentropy and softmax separately."
    Flux documentation


    博士:as says Flux documentation

    https://fluxml.ai/Flux.jl/stable/models/losses/ 損失関数


    loss(x, y) = Flux.Losses.logitcrossentropy(model(x), y)
    
    損失関数とパラメータを組み合わせたオプティマイザ 適応モーメント推定
    博士:Adam

    https://fluxml.ai/Flux.jl/stable/training/optimisers オプティマイザ


    optimizer = ADAM(0.0001)
    

    トレーニング


    parameters = params(model)
    # flatten() function converts array 28x28x60000 into 784x60000 (28*28x60000)
    train_data = [(Flux.flatten(x_train), Flux.flatten(y_train))]
    # Range in loop can be used smaller
    for i in 1:400
        Flux.train!(loss, parameters, train_data, optimizer)
    end
    

    チェック結果


    test_data = [(Flux.flatten(x_test), y_test)]
    accuracy = 0
    for i in 1:length(y_test)
        if findmax(model(test_data[1][1][:, i]))[2] - 1  == y_test[i]
            accuracy = accuracy + 1
        end
    end
    println(accuracy / length(y_test))
    

    試験結果

    Accuracy: 0.91

    フルコードはこちら