Keras kullanıcıları için TensorFlow.js katmanları API'si

TensorFlow.js'nin Katmanlar API'si, Keras örnek alınarak modellenmiştir ve JavaScript ile Python arasındaki farklar göz önüne alındığında, Katmanlar API'sini Keras'a mümkün olduğunca benzer hale getirmeye çalışıyoruz. Bu, Python'da Keras modelleri geliştirme deneyimi olan kullanıcıların JavaScript'teki TensorFlow.js Katmanlarına geçişini kolaylaştırır. Örneğin, aşağıdaki Keras kodu JavaScript'e çevrilir:

# Python:
import keras
import numpy as np

# Build and compile model.
model = keras.Sequential()
model.add(keras.layers.Dense(units=1, input_shape=[1]))
model.compile(optimizer='sgd', loss='mean_squared_error')

# Generate some synthetic data for training.
xs = np.array([[1], [2], [3], [4]])
ys = np.array([[1], [3], [5], [7]])

# Train model with fit().
model.fit(xs, ys, epochs=1000)

# Run inference with predict().
print(model.predict(np.array([[5]])))
// JavaScript:
import * as tf from '@tensorflow/tfjs';

// Build and compile model.
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

// Generate some synthetic data for training.
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);
const ys = tf.tensor2d([[1], [3], [5], [7]], [4, 1]);

// Train model with fit().
await model.fit(xs, ys, {epochs: 1000});

// Run inference with predict().
model.predict(tf.tensor2d([[5]], [1, 1])).print();

Ancak bu belgede belirtmek ve açıklamak istediğimiz bazı farklılıklar var. Bu farklılıkları ve bunların ardındaki mantığı anladığınızda, Python'dan JavaScript'e geçişiniz (veya ters yönde geçişiniz) nispeten sorunsuz bir deneyim olacaktır.

Yapıcılar JavaScript Nesnelerini yapılandırma olarak alır

Yukarıdaki örnekteki aşağıdaki Python ve JavaScript satırlarını karşılaştırın: her ikisi de Yoğun katman oluşturur.

# Python:
keras.layers.Dense(units=1, inputShape=[1])
// JavaScript:
tf.layers.dense({units: 1, inputShape: [1]});

JavaScript fonksiyonları, Python fonksiyonlarındaki anahtar kelime argümanlarının eşdeğerine sahip değildir. Yapıcı seçeneklerini JavaScript'te konumsal bağımsız değişkenler olarak uygulamaktan kaçınmak istiyoruz; bu, özellikle çok sayıda anahtar kelime bağımsız değişkenine (örneğin, LSTM ) sahip yapıcılar için hatırlanması ve kullanılması zahmetli olacaktır. Bu nedenle JavaScript yapılandırma nesnelerini kullanıyoruz. Bu tür nesneler, Python anahtar kelime argümanlarıyla aynı düzeyde konumsal değişmezlik ve esneklik sağlar.

Model sınıfının bazı yöntemleri, örneğin Model.compile() , giriş olarak bir JavaScript yapılandırma nesnesini de alır. Ancak Model.fit() , Model.evaluate() ve Model.predict() öğelerinin biraz farklı olduğunu unutmayın. Bu yöntem zorunlu x (özellikler) ve y (etiketler veya hedefler) verilerini girdi olarak aldığından; x ve y anahtar kelime bağımsız değişkenlerinin rolünü oynayan sonraki yapılandırma nesnesinden ayrı konumsal bağımsız değişkenlerdir. Örneğin:

// JavaScript:
await model.fit(xs, ys, {epochs: 1000});

Model.fit() eşzamansızdır

Model.fit() kullanıcıların TensorFlow.js'de model eğitimi gerçekleştirdiği birincil yöntemdir. Bu yöntem genellikle uzun süreli olabilir, saniyeler veya dakikalar sürebilir. Bu nedenle JavaScript dilinin async özelliğini kullanıyoruz, böylece bu fonksiyon tarayıcıda çalışırken ana UI thread'ini engellemeyecek şekilde kullanılabilir. Bu, JavaScript'teki async fetch gibi potansiyel olarak uzun süre çalışan diğer işlevlere benzer. async Python'da bulunmayan bir yapı olduğunu unutmayın. Keras'taki fit() yöntemi bir History nesnesi döndürürken, JavaScript'teki fit() yönteminin karşılığı, beklenebilecek (yukarıdaki örnekte olduğu gibi) veya Then() yöntemiyle birlikte kullanılabilen bir Geçmiş Vaadi döndürür.

TensorFlow.js için NumPy yok

Python Keras kullanıcıları, yukarıdaki örnekte 2B tensörler oluşturmak gibi temel sayısal ve dizi işlemlerini gerçekleştirmek için sıklıkla NumPy'yi kullanır.

# Python:
xs = np.array([[1], [2], [3], [4]])

TensorFlow.js'de bu tür temel sayısal işlemler paketin kendisiyle yapılır. Örneğin:

// JavaScript:
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);

tf.* ad alanı aynı zamanda dizi ve doğrusal cebir işlemleri için matris çarpımı gibi bir dizi başka fonksiyon da sağlar. Daha fazla bilgi için TensorFlow.js Core belgelerine bakın.

Yapıcıları değil fabrika yöntemlerini kullanın

Python'daki bu satır (yukarıdaki örnekte) bir yapıcı çağrısıdır:

# Python:
model = keras.Sequential()

Kesin olarak JavaScript'e çevrilirse eşdeğer yapıcı çağrısı aşağıdaki gibi görünecektir:

// JavaScript:
const model = new tf.Sequential();  // !!! DON'T DO THIS !!!

Ancak "yeni" kurucuları kullanmamaya karar verdik çünkü 1) "yeni" anahtar kelime kodu daha şişirir ve 2) "yeni" kurucu JavaScript'in "kötü bir parçası" olarak kabul edilir: potansiyel bir tuzak, JavaScript'te tartışılıyor: İyi Parçalar . TensorFlow.js'de modeller ve katmanlar oluşturmak için daha düşükCamelCase adlarına sahip fabrika yöntemlerini çağırırsınız, örneğin:

// JavaScript:
const model = tf.sequential();

const layer = tf.layers.batchNormalization({axis: 1});

Seçenek dizesi değerleri, Snake_case değil, LowerCamelCase'dir

JavaScript'te, sembol adları için deve şeklinin kullanılması (örneğin, Google JavaScript Stil Kılavuzu'na bakın), yılan durumunun yaygın olduğu Python'a (örneğin, Keras'ta) kıyasla daha yaygındır. Bu nedenle, aşağıdakiler de dahil olmak üzere seçeneklere yönelik dize değerleri için LowerCamelCase'i kullanmaya karar verdik:

  • DataFormat, örneğin, channels_first yerine channelsFirst
  • Başlatıcı, örneğin glorot_normal yerine glorotNormal
  • Kayıp ve ölçümler, örneğin, mean_squared_error yerine meanSquaredError , categorical_crossentropy categoricalCrossentropy

Örneğin yukarıdaki örnekte olduğu gibi:

// JavaScript:
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

Model serileştirme ve seri durumdan çıkarma konusunda içiniz rahat olsun. TensorFlow.js'nin dahili mekanizması, örneğin Python Keras'tan önceden eğitilmiş modeller yüklenirken JSON nesnelerindeki yılan vakalarının doğru şekilde işlenmesini sağlar.

Katman nesnelerini, onları işlev olarak çağırarak değil, application() ile çalıştırın

Keras'ta, bir Katman nesnesi tanımlanmış __call__ yöntemine sahiptir. Bu nedenle kullanıcı, nesneyi bir işlev olarak çağırarak katmanın mantığını çalıştırabilir, örneğin,

# Python:
my_input = keras.Input(shape=[2, 4])
flatten = keras.layers.Flatten()

print(flatten(my_input).shape)

Bu Python sözdizimi şekeri, TensorFlow.js'de application() yöntemi olarak uygulanır:

// JavaScript:
const myInput = tf.input({shape: [2, 4]});
const flatten = tf.layers.flatten();

console.log(flatten.apply(myInput).shape);

Layer.apply(), beton tensörler üzerinde zorunlu (hevesli) değerlendirmeyi destekler

Şu anda Keras'ta çağrı yöntemi yalnızca (Python) TensorFlow'un sembolik olan ve gerçek sayısal değerleri tutmayan tf.Tensor nesneleri (TensorFlow arka ucu varsayılarak) üzerinde çalışabilir. Önceki bölümdeki örnekte gösterilen şey budur. Ancak TensorFlow.js'de katmanların application() yöntemi hem sembolik hem de emir kiplerinde çalışabilir. apply() bir SembolikTensor (tf.Tensor'a yakın bir benzetme) ile çağrılırsa, dönüş değeri bir SembolikTensor olacaktır. Bu genellikle model oluşturma sırasında olur. Ancak apply() gerçek bir somut Tensör değeriyle çağrılırsa, somut bir Tensör döndürecektir. Örneğin:

// JavaScript:
const flatten = tf.layers.flatten();

flatten.apply(tf.ones([2, 3, 4])).print();

Bu özellik (Python) TensorFlow'un Eager Execution özelliğini anımsatıyor. Dinamik sinir ağlarının oluşturulmasına kapı açmanın yanı sıra, model geliştirme sırasında daha fazla etkileşim ve hata ayıklama olanağı sağlar.

Optimize ediciler eğitiliyor. , optimize ediciler değil.

Keras'ta, Optimizer nesnelerinin yapıcıları keras.optimizers.* ad alanı altındadır. TensorFlow.js Katmanlarında, Optimize Edicilere yönelik fabrika yöntemleri tf.train.* ad alanı altındadır. Örneğin:

# Python:
my_sgd = keras.optimizers.sgd(lr=0.2)
// JavaScript:
const mySGD = tf.train.sgd({lr: 0.2});

loadLayersModel() bir HDF5 dosyasından değil, bir URL'den yüklenir

Keras'ta modeller genellikle HDF5 (.h5) dosyası olarak kaydedilir ve bu dosya daha sonra keras.models.load_model() yöntemi kullanılarak yüklenebilir. Yöntem .h5 dosyasına giden yolu alır. TensorFlow.js'deki load_model() ın karşılığı tf.loadLayersModel() dir. HDF5 tarayıcı dostu bir dosya formatı olmadığından tf.loadLayersModel() TensorFlow.js'ye özgü bir format alır. tf.loadLayersModel() giriş argümanı olarak bir model.json dosyasını alır. Model.json, tensorflowjs pip paketi kullanılarak Keras HDF5 dosyasından dönüştürülebilir.

// JavaScript:
const model = await tf.loadLayersModel('https://foo.bar/model.json');

Ayrıca tf.loadLayersModel() tf.Model Promise döndürdüğünü unutmayın.

Genel olarak, TensorFlow.js'de tf.Model s dosyasının kaydedilmesi ve yüklenmesi sırasıyla tf.Model.save ve tf.loadLayersModel yöntemleri kullanılarak yapılır. Bu API'leri Keras'ın save ve load_model API'sine benzer olacak şekilde tasarladık. Ancak tarayıcı ortamı, Keras gibi temel derin öğrenme çerçevelerinin çalıştığı arka uç ortamından, özellikle de verilerin kalıcı hale getirilmesi ve iletilmesine yönelik rota dizisinde oldukça farklıdır. Bu nedenle TensorFlow.js ve Keras'taki kaydetme/yükleme API'leri arasında bazı ilginç farklılıklar vardır. Daha fazla ayrıntı için tf.Model'i Kaydetme ve Yükleme hakkındaki eğitimimize bakın.

Modelleri tf.data.Dataset nesnelerini kullanarak eğitmek için fitDataset() kullanın

Python TensorFlow'un tf.keras'ında bir model, bir Dataset nesnesi kullanılarak eğitilebilir. Modelin fit() yöntemi böyle bir nesneyi doğrudan kabul eder. Bir TensorFlow.js modeli, Dataset nesnelerinin JavaScript eşdeğeriyle de eğitilebilir ( TensorFlow.js'deki tf.data API'sinin belgelerine bakın). Ancak Python'dan farklı olarak Veri Kümesi tabanlı eğitim, fitDataset adlı özel bir yöntemle yapılır. fit() yöntemi yalnızca tensör tabanlı model eğitimi içindir.

Katman ve Model nesnelerinin bellek yönetimi

TensorFlow.js, Katman ve Model nesnelerinin ağırlıklarının WebGL dokuları tarafından desteklendiği tarayıcıda WebGL üzerinde çalışır. Ancak WebGL'nin yerleşik çöp toplama desteği yoktur. Katman ve Model nesneleri, çıkarım ve eğitim çağrıları sırasında kullanıcı için tensör belleğini dahili olarak yönetir. Ancak aynı zamanda kullanıcının kapladıkları WebGL belleğini boşaltmak için bunları elden çıkarmasına da olanak tanır. Bu, tek bir sayfa yüklemesinde birçok model örneğinin oluşturulup yayınlandığı durumlarda kullanışlıdır. Bir Katman veya Model nesnesini elden çıkarmak için, dispose() yöntemini kullanın.