Cara menggunakan TensorFlow dalam penyemak imbas anda

Walaupun anda dapat melatih rangkaian saraf sederhana dengan jumlah data latihan yang agak kecil dengan TensorFlow, untuk rangkaian neural dalam dengan set data latihan yang besar, anda benar-benar perlu menggunakan GPU Nvidia yang mampu CUDA, atau TPU Google, atau FPGA untuk percepatan. Alternatifnya, sehingga baru-baru ini, adalah untuk melatih kelompok CPU selama berminggu-minggu.

Salah satu inovasi yang diperkenalkan dengan TensorFlow 2.0 adalah pelaksanaan JavaScript, TensorFlow.js. Saya tidak menyangka ini dapat meningkatkan latihan atau kelajuan kesimpulan, tetapi ia berlaku, memandangkan sokongannya untuk semua GPU (bukan hanya GPU berkemampuan CUDA) melalui API WebGL.

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

Apa itu TensorFlow.js?

TensorFlow.js adalah perpustakaan untuk mengembangkan dan melatih model pembelajaran mesin dalam JavaScript, dan menyebarkannya dalam penyemak imbas atau di Node.js. Anda boleh menggunakan model yang ada, menukar model Python TensorFlow, menggunakan pembelajaran transfer untuk melatih model yang ada dengan data anda sendiri, dan mengembangkan model dari awal.

TensorFlow.js hujung belakang

TensorFlow.js menyokong beberapa hujung belakang untuk pelaksanaan, walaupun hanya satu yang boleh aktif pada satu masa. Persekitaran TensorFlow.js Node.js menyokong penggunaan binaan Python / C TensorFlow yang dipasang sebagai hujung belakang, yang seterusnya boleh menggunakan percepatan perkakasan mesin yang ada, misalnya CUDA. Terdapat juga back-end berasaskan JavaScript untuk Node.js, tetapi kemampuannya terhad.

Di penyemak imbas, TensorFlow.js mempunyai beberapa hujung belakang dengan ciri yang berbeza. Bahagian belakang WebGL memberikan sokongan GPU menggunakan tekstur WebGL untuk penyimpanan dan shader WebGL untuk pelaksanaan, dan dapat mencapai hingga 100x lebih cepat daripada bahagian belakang CPU biasa. WebGL tidak memerlukan CUDA, jadi ia dapat memanfaatkan apa sahaja GPU yang ada.

Bahagian belakang WebAssembly (WASM) TensorFlow.js untuk penyemak imbas menggunakan pustaka XNNPACK untuk pelaksanaan CPU pengendali rangkaian saraf yang dioptimumkan. Bahagian belakang WASM pada umumnya jauh lebih pantas (10x hingga 30x) daripada hujung belakang CPU JavaScript, tetapi biasanya lebih perlahan daripada hujung belakang WebGL kecuali untuk model yang sangat kecil. Jarak tempuh anda mungkin berbeza-beza, jadi uji kedua-dua hujung belakang WASM dan WebGL untuk model anda sendiri pada perkakasan anda sendiri.

Model dan lapisan TensorFlow.js

TensorFlow.js menyokong dua API untuk membina model rangkaian neural. Salah satunya adalah API Lapisan, yang pada dasarnya sama dengan Keras API di TensorFlow 2. Yang lain adalah Core API, yang pada dasarnya adalah manipulasi langsung tensor.

Seperti Keras, API Lapisan TensorFlow.js mempunyai dua cara untuk membuat model: berurutan dan berfungsi. API berurutan adalah timbunan lapisan linier, dilaksanakan dengan senarai lapisan (seperti yang ditunjukkan di bawah) atau dengan model.add()kaedah:

const model = tf. berikutnya ({

 lapisan: [

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

   tf.layers.dense ({unit: 10, pengaktifan: 'softmax'}),

 ]

});

API berfungsi menggunakan tf.model()API dan boleh membuat rangkaian DAG (grafik aciklik terarah) sewenang-wenangnya:

// Buat grafik lapisan yang sewenang-wenangnya, dengan menghubungkannya

// melalui kaedah apply ().

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

const dense1 = tf.layers.dense ({unit: 32, pengaktifan: 'relu'}). terapkan (input);

const dense2 = tf.layers.dense ({unit: 10, activation: 'softmax'}). berlaku (dense1);

const model = tf.model ({input: input, outputs: dense2});

API Teras dapat mencapai tujuan yang sama, dengan kod yang berbeza, dan tidak mempunyai hubungan intuitif dengan lapisan. Model di bawah ini mungkin kelihatan seperti operasi tensor asas, tetapi mewujudkan rangkaian yang sama dengan dua formulasi sebelumnya. Perhatikan penggunaan relu()dan softmax(), yang merupakan kedua operasi rangkaian saraf, dalam model()fungsi di bawah.

// Berat dan berat sebelah untuk dua lapisan yang 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) {

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

}

Model TensorFlow.js yang telah dibina sebelumnya

Terdapat lebih daripada selusin model TensorFlow.js pra-binaan yang didokumentasikan, tersedia di repositori, dan dihoskan di NPM (untuk digunakan di Node.js) dan unkg (untuk digunakan dalam penyemak imbas). Anda boleh menggunakan model ini seperti yang dibekalkan atau untuk pemindahan pembelajaran. Dengan sedikit kerja, anda juga dapat menggunakannya sebagai blok bangunan untuk model lain.

Beberapa model ini menggunakan kamera peranti dalam masa nyata, contohnya:

Senarai di bawah adalah indeks yang sesuai untuk sebahagian besar model TensorFlow.js yang dikemas kini.

  • Pengelasan gambar
  • Pengesanan objek
  • Segmentasi badan
  • Buat anggaran
  • Pengesanan ketoksikan teks
  • Pengekod ayat sejagat
  • Pengecaman arahan ucapan
  • Pengelaskan KNN
  • Pengesanan wajah yang sederhana
  • Segmentasi semantik
  • Pengesanan tanda muka
  • Pengesanan pose tangan
  • Soal jawab bahasa semula jadi

Apa itu ml5.js?

ml5.js adalah sumber terbuka, mesra, antara muka tahap tinggi untuk TensorFlow.js yang dibangunkan terutamanya di NYU. ml5.js menyediakan akses segera dalam penyemak imbas ke model yang sudah dilatih untuk mengesan pose manusia, menghasilkan teks, menggayakan gambar dengan yang lain, menyusun muzik, mengesan nada, hubungan kata bahasa Inggeris biasa, dan banyak lagi. Walaupun TensorFlow.js ditujukan terutamanya kepada saintis dan pemaju data, ml5.js bertujuan untuk menyokong pemahaman masyarakat yang lebih luas mengenai pembelajaran mesin dan memupuk penglibatan yang lebih mendalam dengan pengkomputeran etika, pengumpulan data yang bertanggungjawab, dan aksesibilitas dan kepelbagaian orang dan perspektif dalam teknologi dan seni .

Sebilangan besar contoh dalam 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 berbeza.

Demo: Pengelasan Iris dengan TensorFlow.js

Kumpulan data diskriminasi Iris yang terkenal, berasal dari RA Fisher pada tahun 1936 untuk menggambarkan analisis diskriminan linier, masih digunakan sebagai ujian untuk kaedah pengkelasan statistik dan pembelajaran mesin. Ini menggunakan empat ciri, panjang dan lebar sepal bunga dan kelopak, untuk mengklasifikasikan tiga spesies Iris, dengan 50 sampel setiap spesies. (Makalah asli Fisher diterbitkan dalam Annals of Eugenics , yang mengatakan lebih banyak mengenai sains pada tahun 1936 daripada yang berkaitan dengan data atau statistik.)

Sekiranya anda melakukan analisis kluster pada data ini, dua spesies akan berkongsi satu kluster, dengan yang ketiga (I. Setosa) dalam kluster yang terpisah. Sebaliknya, analisis komponen utama dapat memisahkan ketiga-tiga spesies dengan baik.

Sampel TensorFlow.js sesuai dengan data Iris dengan dua lapisan rangkaian neural yang terhubung sepenuhnya (padat), seperti yang ditunjukkan dalam ekstrak kod di bawah.

// Tentukan topologi model: dua lapisan padat.

const model = tf. berikutnya ();

model.add (tf.layers.dense (

{unit: 10, pengaktifan: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

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

model.summary ();

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

model.compile ({

pengoptimum: pengoptimum,

kerugian:'ategoricalCrossentropy ',

metrik: ['ketepatan'],

});

Seperti yang anda lihat dalam tangkapan skrin di bawah, model ini berfungsi dengan baik untuk mengklasifikasikan ketiga-tiga spesies tersebut. Sekiranya anda bermain-main dengan parameter, anda akan mendapati bahawa beberapa kekeliruan antara dua spesies (yang ada dalam kelompok yang sama) akan muncul kembali jika anda berulang selama lebih dari 40 zaman.

Menukar model Python TensorFlow ke JavaScript

Sebahagian dari repositori TensorFlow.js mengandungi penukar untuk model TensorFlow dan Keras yang disimpan. Ia menyokong tiga format: SavedModel (lalai untuk TensorFlow), HDF5 (lalai untuk Keras), dan TensorFlow Hub. Anda boleh menggunakan penukar untuk model yang disimpan dari repositori standard, model yang telah anda latih sendiri, dan model yang anda temui di tempat lain.

Sebenarnya terdapat dua langkah untuk penukaran. Langkah pertama adalah menukar model yang ada menjadi model.json dan fail berat binari. Langkah kedua adalah menggunakan API untuk memuatkan model ke dalam TensorFlow.js, baik tf.loadGraphModeluntuk model TensorFlow dan TensorFlow Hub yang tf.loadLayersModelditukar , atau untuk model Keras yang ditukar.

Menggunakan pembelajaran pemindahan

TensorFlow.js menyokong pembelajaran pemindahan pada asasnya sama dengan TensorFlow. Dokumentasi memberikan contoh untuk menyesuaikan MobileNet untuk gambar anda sendiri dan menyesuaikan model untuk pengecaman arahan ucapan untuk kelas suara anda sendiri. Pada dasarnya, apa yang anda lakukan di setiap codelab ini ialah menambahkan pengkelasan kecil khas di atas model yang dilatih, dan melatihnya.

Secara keseluruhan, TensorFlow.js dapat melakukan hampir apa sahaja yang dapat dilakukan oleh TensorFlow. Walau bagaimanapun, memandangkan persekitaran sasaran untuk TensorFlow.js (GPU pelbagai taman untuk permainan) biasanya kurang menggunakan memori GPU daripada GPU pelayan Nvidia besar yang biasanya digunakan untuk latihan pembelajaran mendalam TensorFlow, anda mungkin perlu mengurangkan saiz model untuk membuatnya berjalan di penyemak imbas. Utiliti penukaran melakukan beberapa ini untuk anda, tetapi anda mungkin perlu mengeluarkan lapisan secara manual dan mengurangkan saiz kumpulan untuk latihan anda.