কেরাস ব্যবহারকারীদের জন্য TensorFlow.js স্তর API

TensorFlow.js-এর লেয়ার এপিআই কেরাসের আদলে তৈরি করা হয়েছে এবং আমরা জাভাস্ক্রিপ্ট এবং পাইথনের মধ্যে পার্থক্যের কারণে লেয়ার এপিআই কে কেরাসের মতোই যুক্তিসঙ্গত করার চেষ্টা করি। এটি পাইথনে কেরাস মডেল তৈরির অভিজ্ঞতা সম্পন্ন ব্যবহারকারীদের জন্য জাভাস্ক্রিপ্টের TensorFlow.js লেয়ারে স্থানান্তরিত করা সহজ করে তোলে। উদাহরণস্বরূপ, নিম্নলিখিত কেরাস কোডটি জাভাস্ক্রিপ্টে অনুবাদ করে:

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

যাইহোক, কিছু পার্থক্য আছে যা আমরা এই নথিতে কল করে ব্যাখ্যা করতে চাই। একবার আপনি এই পার্থক্যগুলি এবং তাদের পিছনের যুক্তি বুঝতে পারলে, আপনার পাইথন থেকে জাভাস্ক্রিপ্ট মাইগ্রেশন (বা বিপরীত দিকে মাইগ্রেশন) তুলনামূলকভাবে মসৃণ অভিজ্ঞতা হওয়া উচিত।

কনস্ট্রাক্টররা জাভাস্ক্রিপ্ট অবজেক্টকে কনফিগারেশন হিসেবে নেয়

উপরের উদাহরণ থেকে নিম্নলিখিত পাইথন এবং জাভাস্ক্রিপ্ট লাইনের তুলনা করুন: তারা উভয়ই একটি ঘন স্তর তৈরি করে।

# 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 fetch । মনে রাখবেন যে async একটি গঠন যা পাইথনে বিদ্যমান নেই। কেরাসে fit() পদ্ধতি একটি ইতিহাস বস্তু প্রদান করে, জাভাস্ক্রিপ্টে fit() পদ্ধতির প্রতিশ্রুতি ইতিহাসের একটি প্রতিশ্রুতি প্রদান করে, যা ed এর জন্য অপেক্ষা করা যেতে পারে (উপরের উদাহরণ হিসাবে) বা তারপরে() পদ্ধতির সাথে ব্যবহার করা যেতে পারে।

TensorFlow.js এর জন্য কোন NumPy নেই

Python Keras ব্যবহারকারীরা প্রায়ই NumPy ব্যবহার করে বেসিক নিউমেরিক এবং অ্যারে অপারেশন করতে, যেমন উপরের উদাহরণে 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-এ মডেল এবং স্তর তৈরি করতে, আপনি ফ্যাক্টরি পদ্ধতিগুলিকে কল করেন, যার নাম নিম্ন ক্যামেলকেস রয়েছে, উদাহরণস্বরূপ:

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

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

অপশন স্ট্রিং এর মান হল LowerCamelCase, snake_case নয়

জাভাস্ক্রিপ্টে, চিহ্নের নামের জন্য উটের কেস ব্যবহার করা বেশি সাধারণ (যেমন, Google JavaScript স্টাইল গাইড দেখুন), পাইথনের তুলনায়, যেখানে সাপের কেস সাধারণ (যেমন, কেরাসে)। যেমন, আমরা নিম্নলিখিত সহ বিকল্পগুলির জন্য স্ট্রিং মানগুলির জন্য LowerCamelCase ব্যবহার করার সিদ্ধান্ত নিয়েছি:

  • DataFormat, যেমন, channels_first এর পরিবর্তে channelsFirst
  • ইনিশিয়ালাইজার, যেমন, glorot_normal এর পরিবর্তে glorotNormal
  • ক্ষতি এবং মেট্রিক্স, যেমন, mean_squared_error এর পরিবর্তে meanSquaredError , categoricalCrossentropy categorical_crossentropy

উদাহরণস্বরূপ, উপরের উদাহরণের মতো:

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

মডেল সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের বিষয়ে, নিশ্চিত থাকুন। TensorFlow.js-এর অভ্যন্তরীণ প্রক্রিয়া নিশ্চিত করে যে JSON অবজেক্টে স্নেক কেস সঠিকভাবে পরিচালনা করা হয়, যেমন, পাইথন কেরাস থেকে পূর্বপ্রশিক্ষিত মডেল লোড করার সময়।

প্রয়োগ () দিয়ে লেয়ার অবজেক্ট চালান, তাদের ফাংশন হিসাবে কল করে নয়

কেরাসে, একটি লেয়ার অবজেক্টের __call__ পদ্ধতি সংজ্ঞায়িত করা আছে। তাই ব্যবহারকারী বস্তুটিকে একটি ফাংশন হিসাবে কল করে স্তরের যুক্তিকে আহ্বান করতে পারে, যেমন,

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

print(flatten(my_input).shape)

এই পাইথন সিনট্যাক্স চিনি TensorFlow.js এ apply() পদ্ধতি হিসাবে প্রয়োগ করা হয়েছে:

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

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

Layer.apply() কংক্রিট টেনসরের উপর অপরিহার্য (আগ্রহী) মূল্যায়ন সমর্থন করে

বর্তমানে, কেরাসে, কল পদ্ধতিটি শুধুমাত্র (Python) 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();

এই বৈশিষ্ট্যটি (Python) TensorFlow এর Eager Execution এর কথা মনে করিয়ে দেয়। এটি মডেল ডেভেলপমেন্টের সময় আরও বেশি ইন্টারঅ্যাক্টিভিটি এবং ডিবাগবিলিটি প্রদান করে, ডায়নামিক নিউরাল নেটওয়ার্ক কম্পোজ করার দরজা খোলার পাশাপাশি।

অপটিমাইজাররা ট্রেনের নিচে আছে। , অপ্টিমাইজার নয়।

কেরাসে, অপ্টিমাইজার অবজেক্টের কনস্ট্রাক্টর keras.optimizers.* namespace-এর অধীনে থাকে। 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 ফাইল নয়

কেরাসে, মডেলগুলি সাধারণত একটি HDF5 (.h5) ফাইল হিসাবে সংরক্ষণ করা হয়, যা পরে keras.models.load_model() পদ্ধতি ব্যবহার করে লোড করা যেতে পারে। পদ্ধতিটি .h5 ফাইলে একটি পথ নেয়। TensorFlow.js-এ load_model() এর কাউন্টারপার্ট হল tf.loadLayersModel() । যেহেতু HDF5 একটি ব্রাউজার-বান্ধব ফাইল ফরম্যাট নয়, tf.loadLayersModel() একটি TensorFlow.js-নির্দিষ্ট ফর্ম্যাট নেয়। tf.loadLayersModel() তার ইনপুট আর্গুমেন্ট হিসাবে একটি model.json ফাইল নেয়। tensorflowjs pip প্যাকেজ ব্যবহার করে model.json কে Keras HDF5 ফাইল থেকে রূপান্তর করা যেতে পারে।

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

এছাড়াও মনে রাখবেন যে tf.loadLayersModel() tf.Model এর একটি Promise প্রদান করে।

সাধারণভাবে, TensorFlow.js-এ tf.Model s সংরক্ষণ এবং লোড করা হয় যথাক্রমে tf.Model.save এবং tf.loadLayersModel পদ্ধতি ব্যবহার করে। আমরা এই APIগুলি কেরাসের সেভ এবং লোড_মডেল API- এর মতো ডিজাইন করেছি। কিন্তু ব্রাউজার এনভায়রনমেন্ট ব্যাকএন্ড এনভায়রনমেন্ট থেকে একেবারেই আলাদা যেখানে কেরাসের মতো স্টেপল ডিপ লার্নিং ফ্রেমওয়ার্ক চলে, বিশেষ করে ডেটা টিকে থাকার এবং ট্রান্সমিট করার জন্য রুটের অ্যারেতে। তাই TensorFlow.js এবং কেরাসে সেভ/লোড API-এর মধ্যে কিছু আকর্ষণীয় পার্থক্য রয়েছে। আরো বিস্তারিত জানার জন্য tf.Model সংরক্ষণ এবং লোড করার উপর আমাদের টিউটোরিয়াল দেখুন।

tf.data.Dataset অবজেক্ট ব্যবহার করে মডেল প্রশিক্ষণের জন্য fitDataset() ব্যবহার করুন

Python TensorFlow-এর tf.keras-এ, একটি মডেলকে ডেটাসেট অবজেক্ট ব্যবহার করে প্রশিক্ষণ দেওয়া যেতে পারে। মডেলের fit() পদ্ধতি সরাসরি এই ধরনের বস্তু গ্রহণ করে। একটি TensorFlow.js মডেলকে Dataset অবজেক্টের সমতুল্য জাভাস্ক্রিপ্টের সাথে প্রশিক্ষিত করা যেতে পারে ( TensorFlow.js এ tf.data API এর ডকুমেন্টেশন দেখুন)। যাইহোক, পাইথনের বিপরীতে, ডেটাসেট-ভিত্তিক প্রশিক্ষণ একটি ডেডিকেটেড পদ্ধতির মাধ্যমে করা হয়, যথা fitDatasetfit() পদ্ধতিটি শুধুমাত্র টেনসর-ভিত্তিক মডেল প্রশিক্ষণের জন্য।

স্তর এবং মডেল বস্তুর মেমরি ব্যবস্থাপনা

TensorFlow.js ব্রাউজারে WebGL-এ চলে, যেখানে লেয়ার এবং মডেল অবজেক্টের ওজন WebGL টেক্সচার দ্বারা ব্যাক করা হয়। যাইহোক, WebGL-এর কোনো অন্তর্নির্মিত আবর্জনা-সংগ্রহ সমর্থন নেই। লেয়ার এবং মডেল অবজেক্ট অভ্যন্তরীণভাবে ব্যবহারকারীর জন্য তাদের অনুমান এবং প্রশিক্ষণ কলের সময় টেনসর মেমরি পরিচালনা করে। কিন্তু তারা ব্যবহারকারীকে তাদের দখলে থাকা WebGL মেমরি মুক্ত করার জন্য তাদের নিষ্পত্তি করার অনুমতি দেয়। এটি এমন ক্ষেত্রে দরকারী যেখানে অনেকগুলি মডেল উদাহরণ তৈরি করা হয় এবং একটি একক পৃষ্ঠা লোডের মধ্যে প্রকাশ করা হয়। একটি স্তর বা মডেল বস্তু নিষ্পত্তি করতে, dispose() পদ্ধতি ব্যবহার করুন।