TensorFlow.js Keras उपयोगकर्ताओं के लिए API परत करता है

TensorFlow.js की परतें एपीआई Keras के बाद मॉडलिंग की है और हम बनाने के लिए प्रयास परतें एपीआई जावास्क्रिप्ट और अजगर के बीच मतभेद को देखते हुए उचित रूप Keras के लिए इसी तरह के रूप में। इससे पाइथन में केरस मॉडल विकसित करने का अनुभव रखने वाले उपयोगकर्ताओं के लिए जावास्क्रिप्ट में TensorFlow.js Layers पर माइग्रेट करना आसान हो जाता है। उदाहरण के लिए, निम्नलिखित केरस कोड जावास्क्रिप्ट में अनुवाद करता है:

# 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 जावास्क्रिप्ट भाषा की सुविधा है, ताकि इस समारोह के लिए एक रास्ता है जब ब्राउज़र में चल रहा है कि मुख्य यूआई धागा ब्लॉक नहीं करता में इस्तेमाल किया जा सकता है। इस तरह के रूप में जावास्क्रिप्ट में अन्य संभावित लंबे समय से चल काम करता है, के समान है async लाने । ध्यान दें कि async एक निर्माण कि अजगर में मौजूद नहीं है है। जबकि fit() Keras में विधि एक इतिहास वस्तु देता है, के समकक्ष fit() जावास्क्रिप्ट में विधि एक रिटर्न वादा इतिहास के है, जो हो सकता है इंतजार (ऊपर के उदाहरण के रूप में) एड या विधि तो () के साथ प्रयोग किया।

TensorFlow.js . के लिए कोई NumPy नहीं है

अजगर Keras उपयोगकर्ताओं अक्सर उपयोग NumPy इस तरह के ऊपर के उदाहरण में 2 डी tensors पैदा करने के रूप में बुनियादी सांख्यिक और सरणी संचालन, प्रदर्शन करने के लिए।

# 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});

विकल्प स्ट्रिंग मान लोअरकैमलकेस हैं, न कि सांप_केस

जावास्क्रिप्ट में, यह प्रतीक नाम के लिए उपयोग ऊंट मामले को ज्यादा आम है (जैसे, देखना गूगल जावास्क्रिप्ट स्टाइल गाइड ), (Keras में, उदाहरण के लिए) अजगर, जहां सांप मामले आम है की तुलना में। जैसे, हमने निम्न सहित विकल्पों के लिए स्ट्रिंग मानों के लिए लोअरकैमलकेस का उपयोग करने का निर्णय लिया:

  • 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 से पूर्व-प्रशिक्षित मॉडल लोड हो रहे हों।

परत ऑब्जेक्ट्स को लागू करें () के साथ चलाएं, उन्हें फ़ंक्शन के रूप में कॉल करके नहीं

Keras में, एक परत वस्तु है __call__ विधि को परिभाषित किया। इसलिए उपयोगकर्ता ऑब्जेक्ट को फ़ंक्शन के रूप में कॉल करके परत के तर्क को लागू कर सकता है, उदाहरण के लिए,

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

print(flatten(my_input).shape)

इस पायथन सिंटैक्स चीनी को 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 में, परतों की लागू () विधि प्रतीकात्मक और अनिवार्य दोनों मोड में काम कर सकती है। यदि 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 परतें में, Optimizers के लिए कारखाने के तरीकों के तहत कर रहे 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 फ़ाइल लेता है। Model.json को tensorflowjs pip पैकेज का उपयोग करके एक Keras HDF5 फ़ाइल से परिवर्तित किया जा सकता है।

// 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 एपीआई Keras की। लेकिन ब्राउज़र का वातावरण बैकएंड के वातावरण से काफी अलग है, जिस पर केरस जैसे स्टेपल डीप लर्निंग फ्रेमवर्क चलते हैं, विशेष रूप से डेटा को बनाए रखने और प्रसारित करने के लिए मार्गों की सरणी में। इसलिए TensorFlow.js और Keras में सेव/लोड API के बीच कुछ दिलचस्प अंतर हैं। पर हमारे ट्यूटोरियल देखें सहेजा जा रहा है और tf.Model लोड हो रहा है अधिक जानकारी के लिए।

उपयोग fitDataset() का उपयोग कर ट्रेन मॉडल के लिए tf.data.Dataset वस्तुओं

अजगर TensorFlow के tf.keras में, एक मॉडल एक का उपयोग कर प्रशिक्षित किया जा सकता डेटासेट वस्तु। मॉडल के fit() विधि सीधे इस तरह के एक वस्तु स्वीकार करता है। एक TensorFlow.js मॉडल डेटासेट का जावास्क्रिप्ट बराबर के साथ प्रशिक्षित किया जा सकता के रूप में अच्छी वस्तुओं (देखें TensorFlow.js में tf.data एपीआई के प्रलेखन )। हालांकि, अजगर, के विपरीत डेटासेट आधारित प्रशिक्षण एक समर्पित विधि, अर्थात् के माध्यम से किया जाता है fitDatasetफिट () विधि केवल टेन्सर आधारित मॉडल प्रशिक्षण के लिए है।

परत और मॉडल वस्तुओं का मेमोरी प्रबंधन

TensorFlow.js ब्राउज़र में WebGL पर चलता है, जहां Layer और Model ऑब्जेक्ट के भार WebGL टेक्सचर द्वारा समर्थित होते हैं। हालाँकि, WebGL के पास कोई अंतर्निहित कचरा-संग्रह समर्थन नहीं है। परत और मॉडल ऑब्जेक्ट आंतरिक रूप से उपयोगकर्ता के लिए उनके अनुमान और प्रशिक्षण कॉल के दौरान टेंसर मेमोरी का प्रबंधन करते हैं। लेकिन वे उपयोगकर्ता को वेबजीएल मेमोरी को मुक्त करने के लिए उनका निपटान करने की भी अनुमति देते हैं, जिस पर वे कब्जा करते हैं। यह उन मामलों में उपयोगी है जहां एक ही पृष्ठ लोड के भीतर कई मॉडल इंस्टेंस बनाए और जारी किए जाते हैं। एक परत या मॉडल वस्तु निपटान करने के लिए, का उपयोग dispose() विधि।