How I Keras in C ++ Diluncurkan

Belum lama ini, saya menghadapi tugas produksi meluncurkan Kesas jaringan saraf Kesas terlatih menggunakan kode C++ asli. Anehnya, solusinya sama sekali tidak sepele. Akibatnya, ada perpustakaan pribadi, memberikan kesempatan seperti itu. Tentang bagaimana itu - jaringan saraf pada salib bersih dan akan menjadi artikel pendek hari ini.


Bagi mereka yang tidak bisa menunggu - inilah repositori github, dengan deskripsi rinci tentang penggunaannya. Yah, saya meminta semua orang di bawah kucing ...


Pernyataan masalah.


Dalam prosesnya, saya perlu menjalankan model yang terlatih dalam aplikasi C++ (Unreal Engune 4) . Tapi ini nasib buruk: hari ini praktis tidak ada cara untuk menjalankan model Keras di C ++.


Opsi panggilan Python dari C++ sepertinya tidak baik bagi saya. Pilihan lain adalah mengubah model Keras menjadi model TensorFlow dan kemudian membangun TensoFflow untuk persilangan dan memanggil API TF dari kode C ++.


Proses metamorfosis ini dijelaskan dengan baik dalam artikel ini . Tetapi kesulitan juga muncul dengan ini. Pertama , TensorFlow akan melalui Bzzel . Dan bezel itu sendiri adalah hal yang aneh dan menolak untuk berkumpul di bawah UE4 . Kedua , TF itu sendiri adalah hal yang agak besar dan besar , tetapi saya menginginkan sesuatu yang lebih ringan dan produktif. Saya hanya bisa mengatakan bahwa di ruang terbuka github, sebuah proyek setengah bekerja ditemukan, dengan fungsionalitas yang saya butuhkan. Tapi, dia tidak mendukung versi Python dan Keras . Dan upaya untuk membuatnya kembali tidak berhasil: aplikasi C ++ jatuh dengan kesalahan Core Dump . Itu kebiasaan untuk menulis implementasi saya sendiri ...


Kami sedang menulis perpustakaan kami!


Mengubah batu lebih keras, melempar botol pivasa energi, saya duduk di kode. Kode TensorFlow, upaya untuk merehabilitasi kode yang ditemukan pada kode , beberapa pengetahuan tentang algoritma dan struktur data (terima kasih kepada ITMO untuk kursusnya) dan musik yang bagus di telinga saya banyak membantu saya dalam mengimplementasikan perpustakaan ini. Entah bagaimana perpustakaan itu ditulis dalam satu malam.


Dan ketemu: Keras2cpp!


Bagian pertama dari perpustakaan adalah modul Python untuk menyimpan model yang terlatih ke format binernya sendiri.


Tidak ada yang rumit dalam operasi ini. Kami baru saja membaca model Keras dan menulis sedikit demi sedikit ke dalam file: pertama , kemudian , kemudian dalam format float .


Sekarang mari kita beralih ke implementasi C ++ yang paling enak.


Pengguna memiliki 2 entitas tensor dan model .


Tensor - mendistribusikan kembali data yang digunakan jaringan saraf dan merupakan implementasi komputer tensor. Dimensi maksimum saat ini didukung dalam 4 dimensi. Dimensi setiap dimensi disimpan di std::vector<int> dims_; dan bobot masing - masing elemen tensor ada di std::vector<int> data_; . Dari metode yang tersedia, void Print() dan Tensor Select(int row) dapat dibedakan. Sisa operasi yang dapat Anda lihat dalam kode sumber. Setelah matematika untuk tensor ditulis, saya mulai menerapkan model.


Model - adalah seperangkat lapisan di mana masing-masing operasi pada tensor dan matriks bobot ditentukan. 2 fungsi tersedia untuk pengguna virtual bool LoadModel(const std::string& filename); dan virtual bool Apply(Tensor* in, Tensor* out); .


Ini adalah contoh kode lengkap.


python_model.py:


 import numpy as np from keras import Sequential from keras.layers import Dense #create random data test_x = np.random.rand(10, 10).astype('f') test_y = np.random.rand(10).astype('f') model = Sequential([ Dense(1, input_dim=10) ]) model.compile(loss='mse', optimizer='adam') #train model by 1 iteration model.fit(test_x, test_y, epochs=1, verbose=False) #predict data = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) prediction = model.predict(data) print(prediction) #save model from keras2cpp import export_model export_model(model, 'example.model') 

cpp_mpdel.cc:


 #include "keras_model.h" int main() { // Initialize model. KerasModel model; model.LoadModel("example.model"); // Create a 1D Tensor on length 10 for input data. Tensor in(10); in.data_ = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}; // Run prediction. Tensor out; model.Apply(&in, &out); out.Print(); return 0; } 

Hanya itu yang saya pikirkan. Nikmati menggunakannya, dan saya akan pergi ke C # dan Python tercinta untuk menulis jaringan saraf lebih lanjut.


PS


Saya suka menulis perpustakaan ini. Ketika Anda menulis semuanya sendiri dari awal, Anda mengerti lebih banyak, tetapi cara kerjanya ... Kami berencana untuk menambahkan dukungan untuk arsitektur dan GPU lain ...


repositori github
Sumber

Source: https://habr.com/ru/post/id438398/


All Articles