Как да използвате TensorFlow във вашия браузър

Въпреки че можете да тренирате прости невронни мрежи с относително малко количество данни за обучение с TensorFlow, за дълбоки невронни мрежи с големи набори от данни за обучение наистина трябва да използвате графични процесори Nvidia, способни на CUDA, или Google TPU или FPGA за ускорение. Доскоро алтернативата беше да тренираме на клъстери от процесори в продължение на седмици.

Една от иновациите, въведени с TensorFlow 2.0, е внедряване на JavaScript, TensorFlow.js. Не бих очаквал това да подобри обучението или скоростта на извода, но го прави, като се има предвид неговата поддръжка за всички графични процесори (не само за графични процесори, поддържащи CUDA) чрез WebGL API.

[Също на: Преглед на TensorFlow 2.0: По-лесно машинно обучение]

Какво е TensorFlow.js?

TensorFlow.js е библиотека за разработване и обучение на модели за машинно обучение в JavaScript и разполагането им в браузър или в Node.js. Можете да използвате съществуващи модели, да конвертирате модели на Python TensorFlow, да използвате обучение за трансфер, за да преквалифицирате съществуващи модели със собствени данни и да разработите модели от нулата.

TensorFlow.js обратно завършва

TensorFlow.js поддържа множество задни краища за изпълнение, въпреки че само един може да бъде активен в даден момент. Средата TensorFlow.js Node.js поддържа използването на инсталирана компилация на Python / C TensorFlow като заден край, който от своя страна може да използва наличното хардуерно ускорение на машината, например CUDA. Има и базиран на JavaScript заден край за Node.js, но неговите възможности са ограничени.

В браузъра TensorFlow.js има няколко задни края с различни характеристики. Задният край на WebGL осигурява поддръжка на GPU, използвайки текстури на WebGL за съхранение и шейдъри на WebGL за изпълнение и може да бъде до 100 пъти по-бърз от обикновения заден край на процесора. WebGL не изисква CUDA, така че може да се възползва от каквото и да е GPU.

Обратният край на WebAssembly (WASM) TensorFlow.js за браузъра използва библиотеката XNNPACK за оптимизирано внедряване на процесора на невронни мрежови оператори. Задният край на WASM обикновено е много по-бърз (10x до 30x) от задния край на процесора на JavaScript, но обикновено е по-бавен от задния край на WebGL, с изключение на много малки модели. Вашият пробег може да варира, така че тествайте както WASM, така и WebGL обратно за вашите собствени модели на вашия собствен хардуер.

Модели и слоеве на TensorFlow.js

TensorFlow.js поддържа два API за изграждане на модели на невронни мрежи. Единият е Layers API, който по същество е същият като Keras API в TensorFlow 2. Другият е Core API, който по същество е директна манипулация на тензори.

Подобно на Keras, TensorFlow.js Layers API има два начина за създаване на модел: последователен и функционален. Последователният API е линеен стек от слоеве, реализиран със списък със слоеве (както е показано по-долу) или с model.add()метода:

const модел = tf.sequential ({

 слоеве: [

   tf.layers.dense ({inputShape: [784], единици: 32, активиране: 'relu'}),

   tf.layers.dense ({единици: 10, активиране: 'softmax'}),

 ]

});

Функционалният API използва tf.model()API и може да създава произволни DAG (насочени ациклични графики) мрежи:

// Създайте произволна графика на слоевете, като ги свържете

// чрез метода apply ().

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

const thick1 = tf.layers.dense ({единици: 32, активиране: 'relu'}). apply (input);

const thick2 = tf.layers.dense ({единици: 10, активация: 'softmax'}). apply (thick1);

const модел = tf.model ({входове: вход, изходи: плътен2});

Core API може да постигне едни и същи цели, с различен код и по-малко интуитивна връзка със слоевете. Моделът по-долу може да изглежда като основни тензорни операции, но създава същата мрежа като двете предишни формулировки. Обърнете внимание на използването на relu()и softmax(), които са и двете операции на невронна мрежа, във model()функцията по-долу.

// Теглата и отклоненията за двата плътни слоя.

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]));

модел на функция (x) {

  връщане x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Предварително изградени модели TensorFlow.js

Има над дузина предварително изградени модели TensorFlow.js, документирани, налични в хранилището и хоствани на NPM (за използване в Node.js) и unpkg (за използване в браузър). Можете да използвате тези модели, както са доставени или за обучение с трансфер. С малко работа можете да ги използвате и като градивни елементи за други модели.

Няколко от тези модели използват камерата на устройството в реално време, например ръчна употреба:

Списъкът по-долу е удобен индекс за повечето предварително опаковани модели TensorFlow.js.

  • Класификация на изображенията
  • Откриване на обект
  • Сегментация на тялото
  • Оценка на позата
  • Откриване на токсичност на текста
  • Универсален кодер на изречения
  • Разпознаване на речеви команди
  • Класификатор KNN
  • Лесно разпознаване на лица
  • Семантична сегментация
  • Откриване на ориентир на лицето
  • Откриване на поза в ръце
  • Отговор на естествен език

Какво е ml5.js?

ml5.js е приятелски настроен интерфейс с високо ниво на TensorFlow.js с отворен код, разработен предимно в Ню Йорк. ml5.js осигурява незабавен достъп в браузъра до предварително обучени модели за откриване на човешки пози, генериране на текст, оформяне на изображение с друго, композиране на музика, откриване на височина, общи връзки на думи на английски език и много други. Докато TensorFlow.js е насочен главно към изследователи на данни и разработчици, ml5.js има за цел да подкрепи по-широкото обществено разбиране за машинното обучение и да насърчи по-задълбочено участие в етичните изчисления, отговорното събиране на данни и достъпността и разнообразието на хората и перспективите в технологиите и изкуствата .

Повечето примери в ml5.js зависят от моделите TensorFlow.js. Те са опаковани като уеб страници, които можете да стартирате както е или да редактирате, например, за да използвате различни изображения.

Демонстрация: Класификация на ириса с TensorFlow.js

Известният набор от данни за дискриминация на Iris, създаден от RA Fisher през 1936 г., за да илюстрира линеен дискриминант анализ, все още се използва като тест за статистически методи и методи за класификация на машинното обучение. Той използва четири характеристики, дължината и ширината на цветните чашелистчета и листенца, за да класифицира три вида ирис, с 50 проби от всеки вид. (Оригиналната статия на Фишър е публикувана в Annals of Eugenics , която казва повече за науката през 1936 г., отколкото за данните или статистиката.)

Ако извършите клъстерен анализ на тези данни, два от видовете ще споделят един клъстер, а третия (I. Setosa) в отделен клъстер. От друга страна, анализът на основните компоненти може да раздели доста добре и трите вида.

Пробата на TensorFlow.js отговаря на данните на Iris с два напълно свързани (плътни) слоя на невронна мрежа, както е показано в извлечението на кода по-долу.

// Определете топологията на модела: два плътни слоя.

const модел = tf.sequential ();

model.add (tf.layers.dense (

{единици: 10, активиране: 'сигмоид', inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({единици: 3, активиране: 'softmax'}));

model.summary ();

const оптимизатор = tf.train.adam (params.learningRate);

model.compile ({

оптимизатор: оптимизатор,

загуба: 'categoricalCrossentropy',

показатели: ['точност'],

});

Както можете да видите на екранната снимка по-долу, този модел се справя прилично с класификацията на трите вида. Ако обаче се заиграете с параметрите, ще откриете, че някакво объркване между два от видовете (тези в един и същ клъстер) се появява отново, ако повторите повече от 40 епохи.

Преобразуване на модели на Python TensorFlow в JavaScript

Част от хранилището на TensorFlow.js съдържа конвертор за запазени модели TensorFlow и Keras. Той поддържа три формата: SavedModel (по подразбиране за TensorFlow), HDF5 (по подразбиране за Keras) и TensorFlow Hub. Можете да използвате конвертора за запазени модели от стандартните хранилища, модели, които сте обучили сами, и модели, които сте намерили другаде.

Всъщност има две стъпки към преобразуването. Първата стъпка е да конвертирате съществуващия модел във файлове model.json и двоични тежести. Втората стъпка е да се използва API за зареждане на модела в TensorFlow.js, или tf.loadGraphModelза преобразувани модели TensorFlow и TensorFlow Hub, или tf.loadLayersModelза конвертирани модели Keras.

Използване на трансферно обучение

TensorFlow.js поддържа обучение по трансфер по същество по същия начин като TensorFlow. Документацията предоставя примери за персонализиране на MobileNet за вашите собствени изображения и персонализиране на модел за разпознаване на речеви команди за вашите собствени класове звук. По същество това, което правите във всеки от тези кодови лаборатории, е добавяне на малък персонализиран класификатор върху обучения модел и обучение на това.

Като цяло TensorFlow.js може да направи почти всичко, което TensorFlow може. Въпреки това, като се има предвид, че целевите среди за TensorFlow.js (градински графични процесори за игри) обикновено имат по-малко по отношение на GPU паметта, отколкото големите графични процесори на Nvidia сървъра, обикновено използвани за обучение за дълбоко обучение на TensorFlow, може да се наложи да намалите размера на вашия модел, за да работи в браузър. Помощната програма за преобразуване прави част от това вместо вас, но може да се наложи да извадите слоевете ръчно и да намалите размера на партидите за вашето обучение.