Hello rekan devs, apa kabar? sudah lama ga nulis disini. Kebetulan bulan lalu baru ada acara Keras Community Day yang diselenggarakan oleh teman-teman GDG Bogor. Nah dalam workshop itu pakai contoh membuat model untuk mengenali tulisan tangan alias MNIST menggunakan keras dengan bahasa python.
Nah kali ini kita akan coba lagi membuat model yang sama dengan C# menggunakan Keras.NET, bagaimana caranya? ikuti langkah berikut ya:
- Pastikan teman-teman udah install .NET di PCnya ya, cek di Download .NET (Linux, macOS, and Windows) (microsoft.com)
- Lalu install VSCode (Download Visual Studio Code – Mac, Linux, Windows) atau Visual Studio 2022 (Visual Studio 2022 Community Edition – Download Latest Free Version (microsoft.com))
- Install plugin C# DevKit (C# Dev Kit – Visual Studio Marketplace) kalau pakai VSCode dan polyglot notebook (Polyglot Notebooks – Visual Studio Marketplace)
- Install python yang versi 3.8 (Download Python | Python.org), tensorflow (Install TensorFlow 2) dan jupyter notebook (Project Jupyter | Installing Jupyter)
- Install interactive .net tool (.NET Interactive is here! | .NET Notebooks Preview 2 – .NET Blog (microsoft.com))
- Nah silakan clone projectnya dari repo berikut: Gravicode/KerasNet-Notebook: example deep learning using Keras.NET (github.com)
- Silakan buka foldernya dengan VSCode ya
Nah kita bahas ya,
- Di file MNIST.ipynb itu adalah notebook berisi code untuk membuat model MNIST dengan Keras.NET
- Nah silakan jalankan kode bloknya satu per satu, blok pertama berisi library-library yang dibutuhkan
- Blok kedua, kita jelaskan sedikit.
- kita set batch size 128, artinya ada 128 sample data sekali jalan. 1 <= batch size <= jumlah dataset
- num classes = 10, ini label outputnya berupa angka 0 sampe 9, model ini berfungsi mengklasifikasi angka
- epoch: berapa iterasi training untuk seluruh dataset
- image dimension sample datanya adalah 28 x 28 pixel
- Data di split jadi data training dan data validasi
- trus data kita normalisasi dengan membagi dengan 255, sehingga range nilai input kisaran 0-1
- untuk label kita jadi categorical, misal nilai 2 diubah jadi array [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
- trus untuk tipe networknya kita pake sequensial. 1 layer input, 2 layer CNN untuk extraksi fitur gambar, 1 layer max pooling, trus di flatten lagi jadi 1 dimensional array, 1 hidden layer dengan fungsi aktivasi relu, 1 layer output dengan fungsi aktifasi softmax (cocok tuk klasifikasi), dan kita sisipkan 2 layer drop out untuk menghindari terjadinya over fitting.
- Untuk trainingnya kita pakai loss function: categorical_crossentropy cocok untuk multi class classification, optimizer functionnya kita pake Adadelta, metric-nya akurasi.
- Setelah selesai training kita cetak nilai akurasi dan lossnya, di saya mencapai 99% akurasinya.
- Lalu model di save ke format h5.
Selanjutnya bagaimana menggunakan model ini untuk keperluan kita ?
- Baiknya kita lihat kita mau pakai model ini di aplikasi apa? mobile, web, web api, desktop, ? Nah kali ini kita akan gunakan format ONNX, format ini portable dan disupport banyak akselerator. cek di ONNX | Home
- Nah model kita dengan format h5 kita konversi dulu ke onnx dengan script python, silakan buka file converth5toonnx.py, silakan disesuaikan nama modelnya dan output file onnx-nya, lalu run kalau error berarti belum install packagenya, jalankan perintah “pip install keras2onnx” di terminal
- Nah script itu akan menghasilkan model dengan format onnx, yang siap digunakan. Untuk contoh ini saya gunakan aplikasi windows form dengan .NET
- Silakan buka projectnya dengan vscode atau visual studio pada folder MnistApp. Nah pada aplikasi ini kita gunakan library
Microsoft.ML.OnnxRuntime untuk menjalankan modelnya dengan .NET. Pada file MnistModel.cs terlihat cara melakukan inferensi dengan model onnx. Sedangkan pada form1.cs utilisasi picture box untuk menggambar angka, dan mengubahnya menjadi input gambar 28 x 28 pixel.
- Kemudian jalankan aplikasinya, silakan gambar angka pada canvas dan coba lakukan prediksi
- Semoga bermanfaat yah, ditunggu karya teman-teman