API لایه‌های TensorFlow.js برای کاربران Keras

از API لایه های TensorFlow.js پس از Keras مدل و ما در تلاش برای ایجاد API لایه شبیه به Keras به عنوان معقول با توجه به تفاوت های بین جاوا اسکریپت و پایتون. این کار باعث می‌شود تا کاربران با تجربه در توسعه مدل‌های Keras در پایتون، مهاجرت به لایه‌های TensorFlow.js در جاوا اسکریپت را آسان‌تر کنند. به عنوان مثال، کد Keras زیر به جاوا اسکریپت ترجمه می شود:

# 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 '@tensorlowjs/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();

با این حال، برخی از تفاوت‌ها وجود دارد که مایلیم در این سند به آنها اشاره و توضیح دهیم. هنگامی که این تفاوت ها و منطق پشت آنها را درک کردید، مهاجرت پایتون به جاوا اسکریپت شما (یا مهاجرت در جهت معکوس) باید تجربه نسبتاً روانی باشد.

سازنده ها اشیاء جاوا اسکریپت را به عنوان پیکربندی می گیرند

مقایسه در بر داشت زیر پایتون و جاوا اسکریپت خطوط از مثال بالا: آنها هر دو ایجاد انبوه لایه.

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

توابع جاوا اسکریپت معادل آرگومان های کلمه کلیدی در توابع پایتون ندارند. ما می خواهیم برای جلوگیری از اجرای گزینه های سازنده به عنوان آرگومان موضعی در جاوا اسکریپت، خواهد بود که به خصوص دست و پا گیر به یاد داشته باشید و استفاده برای سازنده با تعداد زیادی از آرگومان های کلیدی (به عنوان مثال، LSTM ). به همین دلیل است که ما از اشیاء پیکربندی جاوا اسکریپت استفاده می کنیم. چنین اشیایی همان سطح از تغییر ناپذیری موقعیت و انعطاف پذیری آرگومان های کلمه کلیدی پایتون را ارائه می دهند.

برخی از روش های طبقه مدل، به عنوان مثال، Model.compile() ، همچنین یک شیء پیکربندی جاوا اسکریپت به عنوان ورودی است. با این حال، در نظر داشته باشید که Model.fit() ، Model.evaluate() و Model.predict() کمی متفاوت است. از آنجا که این روش را واجب x (ویژگی) و y (برچسب یا اهداف) داده به عنوان ورودی؛ x و y استدلال موضعی از شیء پیکربندی متعاقب آن که نقش آرگومان های کلیدی بازی می کند از هم جدا. مثلا:

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

Model.fit() async است

Model.fit() روش اصلی که با آن کاربران انجام آموزش های مدل در TensorFlow.js است. این روش اغلب می تواند طولانی مدت باشد و برای چند ثانیه یا چند دقیقه طول بکشد. بنابراین، ما استفاده از async از ویژگی های زبان جاوا اسکریپت، به طوری که این تابع می تواند در راه است که می کند موضوع UI اصلی متوقف کند زمانی که در حال اجرا در مرورگر استفاده می شود. این شبیه به توابع دیگر به طور بالقوه طولانی مدت در جاوا اسکریپت، مانند است async واکشی . توجه داشته باشید که async یک ساختار است که در پایتون وجود ندارد. در حالی که fit() روش در Keras یک شی تاریخچه گرداند، همتای از fit() روش در جاوا اسکریپت می گرداند وعده از تاریخ، که می تواند در انتظار ED (همانطور که در مثال بالا) و یا با استفاده از روش پس از آن () استفاده می شود.

NumPy برای TensorFlow.js وجود ندارد

کاربران پایتون Keras اغلب استفاده نامپای به انجام عددی و آرایه عملیات پایه، مانند تولید تانسورها 2D در مثال بالا.

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

در TensorFlow.js، این نوع عملیات عددی اولیه با خود بسته انجام می شود. مثلا:

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

tf.* فضای نام همچنین تعدادی از توابع دیگر برای انجام عملیات آرایه و جبر خطی مانند ضرب ماتریس فراهم می کند. را ببینید مستندات TensorFlow.js هسته برای اطلاعات بیشتر.

از روش های کارخانه ای استفاده کنید نه سازنده ها

این خط در پایتون (از مثال بالا) یک فراخوان سازنده است:

# Python:
model = keras.Sequential()

اگر به طور دقیق به جاوا اسکریپت ترجمه شود، فراخوانی سازنده معادل به شکل زیر خواهد بود:

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

با این حال، ما تصمیم گرفتیم از سازنده‌های «جدید» استفاده نکنیم زیرا 1) کلمه کلیدی «جدید» کد را متورم‌تر می‌کند و 2) سازنده «جدید» به عنوان «بخش بد» جاوا اسکریپت در نظر گرفته می‌شود: یک دام بالقوه، در استدلال قسمت های خوب: جاوا اسکریپت . برای ایجاد مدل‌ها و لایه‌ها در TensorFlow.js، شما متدهای کارخانه‌ای را فراخوانی می‌کنید که نام‌های CamelCase پایین‌تری دارند، برای مثال:

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

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

مقادیر رشته گزینه lowCamelCase است، نه snake_case

در جاوا اسکریپت، رایج تر است که مورد استفاده شتر برای نام نماد است (به عنوان مثال، و گوگل جاوا اسکریپت راهنمای سبک )، در مقایسه با پایتون، که در آن مورد مار است (به عنوان مثال، در Keras). به این ترتیب، ما تصمیم گرفتیم از lowCamelCase برای مقادیر رشته برای گزینه هایی از جمله موارد زیر استفاده کنیم:

  • DataFormat، به عنوان مثال، channelsFirst جای channels_first
  • مقدارده اولیه، به عنوان مثال، glorotNormal جای glorot_normal
  • از دست دادن و معیارهای، به عنوان مثال، meanSquaredError جای mean_squared_error ، categoricalCrossentropy جای categorical_crossentropy .

به عنوان مثال، مانند مثال بالا:

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

با توجه به سریال سازی و سریال سازی مدل، مطمئن باشید. مکانیسم داخلی TensorFlow.js تضمین می کند که موارد مار در اشیاء JSON به درستی مدیریت می شوند، به عنوان مثال، هنگام بارگیری مدل های از پیش آموزش دیده از Python Keras.

اشیاء لایه را با application() اجرا کنید، نه با فراخوانی آنها به عنوان توابع

در Keras، یک شیء لایه است __call__ روش تعریف شده است. بنابراین کاربر می تواند منطق لایه را با فراخوانی شی به عنوان یک تابع فراخوانی کند، به عنوان مثال،

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

print(flatten(my_input).shape)

این قند نحوی پایتون به عنوان متد application() در TensorFlow.js پیاده سازی شده است:

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

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

Layer.apply() از ارزیابی ضروری (اشتیاقی) روی تانسورهای بتنی پشتیبانی می کند

در حال حاضر، در Keras، روش پاسخ می توانید تنها در عمل (پایتون) TensorFlow است tf.Tensor اشیاء (با فرض باطن TensorFlow)، که نمادین هستند و مقادیر عددی واقعی را نگه ندارد. این همان چیزی است که در مثال در بخش قبل نشان داده شده است. با این حال، در TensorFlow.js، متد application() لایه‌ها می‌تواند در هر دو حالت نمادین و دستوری عمل کند. اگر apply() با SymbolicTensor (یک قیاس نزدیک tf.Tensor) استناد، مقدار بازگشتی خواهد بود SymbolicTensor. این معمولا در طول ساخت مدل اتفاق می افتد. اما اگر apply() با بتن ارزش تانسور واقعی استناد، آن را به یک بتن تانسور بازگشت. مثلا:

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

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

این ویژگی یادآور (پایتون) TensorFlow است اجرای مشتاق . این قابلیت تعامل و اشکال زدایی بیشتری را در طول توسعه مدل فراهم می کند، علاوه بر این درها را به روی ایجاد شبکه های عصبی پویا باز می کند.

بهینه سازها زیر قطار هستند. نه بهینه سازها

در Keras، سازنده برای اشیاء بهینه ساز تحت هستند keras.optimizers.* فضای نام. در TensorFlow.js لایه ها، روش کارخانه برای بهینه تحت هستند tf.train.* فضای نام. مثلا:

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

loadLayersModel () از یک URL بارگیری می شود، نه یک فایل HDF5

در Keras، مدل معمولا ذخیره به عنوان یک HDF5 (.h5) فایل، که می تواند بعد با استفاده از لود keras.models.load_model() روش. این روش مسیری به فایل .h5 می گیرد. همتای از load_model() در TensorFlow.js است tf.loadLayersModel() . از آنجا که HDF5 است یک فرمت فایل مرورگر پسند نیست، tf.loadLayersModel() طول می کشد یک فرمت TensorFlow.js خاص. tf.loadLayersModel() طول می کشد یک فایل model.json به عنوان آرگومان ورودی آن است. مدل.json را می توان از فایل Keras HDF5 با استفاده از بسته pip tensorflowjs تبدیل کرد.

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

همچنین توجه داشته باشید که tf.loadLayersModel() برمی گرداند Promise از tf.Model .

به طور کلی، ذخیره و بارگذاری tf.Model در TensorFlow.js است با استفاده از انجام tf.Model.save و tf.loadLayersModel روش بود. ما این API ها طراحی شده است که شبیه به صرفه جویی و load_model API از Keras. اما محیط مرورگر کاملاً متفاوت از محیط باطن است که چارچوب‌های یادگیری عمیق اصلی مانند Keras روی آن اجرا می‌شوند، به‌ویژه در مجموعه‌ای از مسیرها برای ماندگاری و انتقال داده‌ها. از این رو تفاوت های جالبی بین API های ذخیره/بارگذاری در TensorFlow.js و Keras وجود دارد. آموزش ما در مشاهده ذخیره و بارگذاری tf.Model برای جزئیات بیشتر.

استفاده از fitDataset() به مدل های قطار با استفاده از tf.data.Dataset اشیاء

در tf.keras پایتون TensorFlow، یک مدل را می توان با استفاده از یک آموزش دیده مجموعه داده شی. مدل fit() روش مانند یک شی به طور مستقیم می پذیرد. مدل A TensorFlow.js را می توان با معادل جاوا اسکریپت از مجموعه داده های آموزش دیده اشیاء و همچنین (نگاه کنید به مستندات API tf.data در TensorFlow.js ). با این حال، آموزش مبتنی بر مجموعه داده-بر خلاف پایتون، از طریق یک روش اختصاصی، یعنی انجام fitDataset . مناسب () تنها روش برای آموزش مبتنی بر مدل تانسور است.

مدیریت حافظه اشیاء لایه و مدل

TensorFlow.js روی WebGL در مرورگر اجرا می‌شود، جایی که وزن اشیاء لایه و مدل توسط بافت‌های WebGL پشتیبانی می‌شوند. با این حال، WebGL هیچ پشتیبانی داخلی برای جمع آوری زباله ندارد. اشیاء لایه و مدل به طور داخلی حافظه تانسور را برای کاربر در طول استنتاج و فراخوانی های آموزشی مدیریت می کنند. اما آنها همچنین به کاربر اجازه می دهند تا آنها را از بین ببرد تا حافظه WebGL را که اشغال می کند آزاد کند. این در مواردی مفید است که نمونه‌های مدل زیادی در یک بارگذاری صفحه ایجاد و منتشر می‌شوند. به دور یک لایه یا شی مدل، با استفاده از dispose() روش.