Cara menggunakan TensorFlow di browser Anda

Meskipun Anda dapat melatih jaringan neural sederhana dengan jumlah data pelatihan yang relatif kecil dengan TensorFlow, untuk jaringan neural dalam dengan set data pelatihan yang besar, Anda benar-benar perlu menggunakan Nvidia GPU berkemampuan CUDA, atau Google TPU, atau FPGA untuk akselerasi. Alternatifnya, hingga saat ini, telah melatih pada cluster CPU selama berminggu-minggu.

Salah satu inovasi yang diperkenalkan dengan TensorFlow 2.0 adalah implementasi JavaScript, TensorFlow.js. Saya tidak akan mengharapkan itu untuk meningkatkan pelatihan atau kecepatan inferensi, tetapi itu terjadi, mengingat dukungannya untuk semua GPU (bukan hanya GPU yang mendukung CUDA) melalui API WebGL.

[Juga pada: Ulasan TensorFlow 2.0: Pembelajaran mesin yang lebih mudah]

Apa itu TensorFlow.js?

TensorFlow.js adalah library untuk mengembangkan dan melatih model machine learning dalam JavaScript, dan menerapkannya di browser atau di Node.js. Anda dapat menggunakan model yang ada, mengonversi model Python TensorFlow, menggunakan pembelajaran transfer untuk melatih kembali model yang ada dengan data Anda sendiri, dan mengembangkan model dari awal.

Bagian belakang TensorFlow.js

TensorFlow.js mendukung beberapa back end untuk eksekusi, meskipun hanya satu yang dapat aktif dalam satu waktu. Lingkungan TensorFlow.js Node.js mendukung penggunaan build Python / C TensorFlow yang diinstal sebagai back-end, yang pada gilirannya dapat menggunakan akselerasi hardware yang tersedia di mesin, misalnya CUDA. Ada juga back end berbasis JavaScript untuk Node.js, tetapi kemampuannya terbatas.

Di browser, TensorFlow.js memiliki beberapa back end dengan karakteristik berbeda. Bagian belakang WebGL menyediakan dukungan GPU menggunakan tekstur WebGL untuk penyimpanan dan shader WebGL untuk eksekusi, dan dapat mencapai 100x lebih cepat daripada bagian belakang CPU biasa. WebGL tidak memerlukan CUDA, sehingga dapat memanfaatkan GPU apa pun yang ada.

Bagian belakang TensorFlow.js WebAssembly (WASM) untuk browser menggunakan pustaka XNNPACK untuk implementasi CPU yang dioptimalkan dari operator jaringan neural. Bagian belakang WASM umumnya jauh lebih cepat (10x hingga 30x) daripada bagian belakang CPU JavaScript, tetapi biasanya lebih lambat daripada bagian belakang WebGL kecuali untuk model yang sangat kecil. Jarak tempuh Anda mungkin berbeda, jadi uji back end WASM dan WebGL untuk model Anda sendiri di perangkat keras Anda sendiri.

Model dan lapisan TensorFlow.js

TensorFlow.js mendukung dua API untuk membuat model jaringan neural. Salah satunya adalah API Lapisan, yang pada dasarnya sama dengan API Keras di TensorFlow 2. Yang lainnya adalah API Inti, yang pada dasarnya adalah manipulasi langsung tensor.

Seperti Keras, API Lapisan TensorFlow.js memiliki dua cara untuk membuat model: berurutan dan fungsional. API sekuensial adalah tumpukan lapisan linier, diimplementasikan dengan daftar lapisan (seperti yang ditunjukkan di bawah) atau dengan model.add()metode:

model const = tf.sequential ({

 lapisan: [

   tf.layers.dense ({inputShape: [784], units: 32, activation: 'relu'}),

   tf.layers.dense ({units: 10, activation: 'softmax'}),

 ]

});

API fungsional menggunakan tf.model()API dan dapat membuat jaringan DAG (grafik asiklik terarah) arbitrer:

// Buat grafik sembarang lapisan, dengan menghubungkannya

// melalui metode apply ().

const input = tf.input ({bentuk: [784]});

const dense1 = tf.layers.dense ({units: 32, aktivasi: 'relu'}). apply (masukan);

const dense2 = tf.layers.dense ({units: 10, aktivasi: 'softmax'}). apply (dense1);

model const = tf.model ({masukan: masukan, keluaran: dense2});

Core API dapat mencapai tujuan yang sama, dengan kode berbeda, dan lebih sedikit ikatan intuitif ke lapisan. Model di bawah ini mungkin terlihat seperti operasi tensor dasar, tetapi model ini membuat jaringan yang sama seperti dua formulasi sebelumnya. Perhatikan penggunaan relu()dan softmax(), yang keduanya merupakan operasi jaringan neural, dalam model()fungsi di bawah ini.

// Bobot dan bias untuk dua lapisan padat.

const w1 = tf.variable (tf.randomNormal ([784, 32]));

const b1 = tf.variable (tf.randomNormal ([32]));

const w2 = tf.variable (tf.randomNormal ([32, 10]));

const b2 = tf.variable (tf.randomNormal ([10]));

model fungsi (x) {

  return x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Model TensorFlow.js yang dibuat sebelumnya

Ada lebih dari selusin model TensorFlow.js yang telah dibuat sebelumnya yang didokumentasikan, tersedia di repositori, dan dihosting di NPM (untuk digunakan di Node.js) dan unpkg (untuk digunakan di browser). Anda dapat menggunakan model ini seperti yang disediakan atau untuk pembelajaran transfer. Dengan sedikit kerja, Anda juga dapat menggunakannya sebagai blok penyusun untuk model lain.

Beberapa model ini menggunakan kamera perangkat secara real time, misalnya handpose:

Daftar di bawah adalah indeks yang sesuai untuk sebagian besar model TensorFlow.js yang telah dikemas sebelumnya.

  • Klasifikasi gambar
  • Deteksi objek
  • Segmentasi tubuh
  • Estimasi pose
  • Deteksi toksisitas teks
  • Encoder kalimat universal
  • Pengenalan perintah ucapan
  • Pengklasifikasi KNN
  • Deteksi wajah sederhana
  • Segmentasi semantik
  • Deteksi landmark wajah
  • Deteksi pose tangan
  • Menjawab pertanyaan bahasa alami

Apa itu ml5.js?

ml5.js adalah sumber terbuka, ramah, antarmuka tingkat tinggi untuk TensorFlow.js yang dikembangkan terutama di NYU. ml5.js menyediakan akses langsung di browser ke model terlatih untuk mendeteksi pose manusia, membuat teks, menata gambar dengan yang lain, menggubah musik, mendeteksi nada, hubungan kata bahasa Inggris umum, dan banyak lagi. Meskipun TensorFlow.js ditujukan terutama untuk ilmuwan dan pengembang data, ml5.js bertujuan untuk mendukung pemahaman publik yang lebih luas tentang pembelajaran mesin dan mendorong keterlibatan yang lebih dalam dengan komputasi etis, pengumpulan data yang bertanggung jawab, serta aksesibilitas dan keragaman orang dan perspektif dalam teknologi dan seni .

Sebagian besar contoh di ml5.js bergantung pada model TensorFlow.js. Mereka telah dikemas sebagai halaman web yang dapat Anda jalankan sebagaimana adanya, atau edit, misalnya untuk menggunakan gambar yang berbeda.

Demo: Klasifikasi iris dengan TensorFlow.js

Dataset diskriminasi Iris yang terkenal, yang berasal dari RA Fisher pada tahun 1936 untuk menggambarkan analisis diskriminan linier, masih digunakan sebagai kasus uji untuk metode klasifikasi statistik dan pembelajaran mesin. Penelitian ini menggunakan empat ciri, panjang dan lebar sepal bunga dan kelopak bunga, untuk mengklasifikasikan tiga spesies Iris, dengan 50 sampel tiap spesies. (Makalah asli Fisher diterbitkan dalam Annals of Eugenics , yang mengatakan lebih banyak tentang sains pada tahun 1936 daripada tentang data atau statistik.)

Jika Anda melakukan analisis cluster pada data ini, dua spesies akan berbagi satu cluster, dengan yang ketiga (I. Setosa) dalam cluster terpisah. Di sisi lain, analisis komponen utama dapat memisahkan ketiga spesies dengan cukup baik.

Contoh TensorFlow.js menyesuaikan data Iris dengan dua lapisan jaringan neural (padat) yang terhubung sepenuhnya, seperti yang ditunjukkan pada ekstrak kode di bawah.

// Tentukan topologi model: dua lapisan padat.

model const = tf.sequential ();

model.add (tf.layers.dense (

{units: 10, aktivasi: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({units: 3, aktivasi: 'softmax'}));

model.summary ();

const pengoptimal = tf.train.adam (params.learningRate);

model.compile ({

pengoptimal: pengoptimal,

kerugian: 'kategorikalCrossentropy',

metrik: ['akurasi'],

});

Seperti yang Anda lihat pada gambar di bawah, model ini melakukan pekerjaan yang layak untuk mengklasifikasikan ketiga spesies. Namun, jika Anda bermain-main dengan parameter, Anda akan menemukan bahwa beberapa kebingungan antara dua spesies (yang ada di kluster yang sama) muncul kembali jika Anda mengulang lebih dari 40 epoch.

Mengonversi model Python TensorFlow ke JavaScript

Bagian dari repositori TensorFlow.js berisi konverter untuk model TensorFlow dan Keras yang disimpan. Ini mendukung tiga format: SavedModel (default untuk TensorFlow), HDF5 (default untuk Keras), dan TensorFlow Hub. Anda dapat menggunakan konverter untuk model yang disimpan dari repositori standar, model yang Anda latih sendiri, dan model yang Anda temukan di tempat lain.

Sebenarnya ada dua langkah menuju konversi. Langkah pertama adalah mengonversi model yang ada ke model.json dan file bobot biner. Langkah kedua adalah menggunakan API untuk memuat model ke TensorFlow.js, baik tf.loadGraphModeluntuk model TensorFlow dan TensorFlow Hub yang tf.loadLayersModeldikonversi , atau untuk model Keras yang dikonversi.

Menggunakan pembelajaran transfer

TensorFlow.js mendukung pemelajaran transfer pada dasarnya dengan cara yang sama seperti TensorFlow. Dokumentasi memberikan contoh untuk menyesuaikan MobileNet untuk gambar Anda sendiri dan menyesuaikan model untuk pengenalan perintah ucapan untuk kelas suara Anda sendiri. Pada dasarnya, apa yang Anda lakukan di setiap codelab ini adalah menambahkan pengklasifikasi khusus kecil di atas model yang dilatih, dan melatihnya.

Secara keseluruhan, TensorFlow.js dapat melakukan hampir semua hal yang dapat dilakukan TensorFlow. Namun, mengingat bahwa lingkungan target untuk TensorFlow.js (GPU taman untuk bermain game) biasanya memiliki memori GPU yang lebih sedikit daripada GPU server Nvidia besar yang biasanya digunakan untuk pelatihan deep learning TensorFlow, Anda mungkin harus mengurangi ukuran model untuk membuatnya berjalan di browser. Utilitas konversi melakukan beberapa hal ini untuk Anda, tetapi Anda mungkin harus mengeluarkan lapisan secara manual dan mengurangi ukuran kumpulan untuk pelatihan Anda.