TF1 হাব বিন্যাস

2018 সালে এর লঞ্চের সময়, TensorFlow Hub একটি একক ধরনের সম্পদ অফার করেছিল: TF1 হাব ফর্ম্যাট TensorFlow 1 প্রোগ্রামে আমদানির জন্য।

এই পৃষ্ঠাটি ব্যাখ্যা করে কিভাবে TF1 হাব ফরম্যাট TF1 (অথবা TF2 এর TF1 সামঞ্জস্য মোড) hub.Module ক্লাস এবং সংশ্লিষ্ট API-এর সাথে ব্যবহার করবেন। (সাধারণ ব্যবহার হল TF1 হাব ফরম্যাটে এক বা একাধিক মডেলকে tf.compat.layers বা tf.layers এর সাথে একত্রিত করে, সম্ভবত একটি TF1 Estimator ভিতরে একটি tf.Graph তৈরি করা)।

TensorFlow 2 (TF1 সামঞ্জস্য মোডের বাইরে) ব্যবহারকারীদের অবশ্যই hub.load() বা hub.KerasLayer এর সাথে নতুন API ব্যবহার করতে হবে। নতুন API নতুন TF2 SavedModel সম্পদের ধরন লোড করে, কিন্তু TF2 এ TF1 হাব ফর্ম্যাট লোড করার জন্য সীমিত সমর্থনও রয়েছে।

TF1 হাব বিন্যাসে একটি মডেল ব্যবহার করা

TF1 হাব ফর্ম্যাটে একটি মডেল ইনস্ট্যান্টিয়েটিং

TF1 হাব ফরম্যাটে একটি মডেল একটি টেনসরফ্লো প্রোগ্রামে আমদানি করা হয় একটি hub.Module অবজেক্ট তৈরি করে একটি স্ট্রিং থেকে তার URL বা ফাইল সিস্টেম পাথ, যেমন:

m = hub.Module("path/to/a/module_dir")

দ্রষ্টব্য: এখানে অন্যান্য বৈধ হ্যান্ডেল প্রকার সম্পর্কিত আরও তথ্য দেখুন।

এটি বর্তমান টেনসরফ্লো গ্রাফে মডিউলের ভেরিয়েবল যোগ করে। তাদের ইনিশিয়ালাইজার চালানো হলে ডিস্ক থেকে তাদের প্রাক-প্রশিক্ষিত মান পড়বে। একইভাবে, টেবিল এবং অন্যান্য অবস্থা গ্রাফে যোগ করা হয়।

ক্যাশিং মডিউল

একটি URL থেকে একটি মডিউল তৈরি করার সময়, মডিউল সামগ্রী ডাউনলোড করা হয় এবং স্থানীয় সিস্টেম অস্থায়ী ডিরেক্টরিতে ক্যাশে করা হয়। TFHUB_CACHE_DIR এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে যেখানে মডিউল ক্যাশে করা হয়েছে সেটিকে ওভাররাইড করা যেতে পারে। বিস্তারিত জানার জন্য, ক্যাশিং দেখুন।

একটি মডিউল প্রয়োগ করা হচ্ছে

একবার তাত্ক্ষণিকভাবে, একটি মডিউল m শূন্য বা তার বেশি বার বলা যেতে পারে পাইথন ফাংশনের মতো টেনসর ইনপুট থেকে টেনসর আউটপুট পর্যন্ত:

y = m(x)

এই ধরনের প্রতিটি কল x থেকে y গণনা করতে বর্তমান টেনসরফ্লো গ্রাফে ক্রিয়াকলাপ যুক্ত করে। যদি এটি প্রশিক্ষিত ওজন সহ ভেরিয়েবল জড়িত থাকে, তবে এগুলি সমস্ত অ্যাপ্লিকেশনের মধ্যে ভাগ করা হয়।

একাধিক উপায়ে প্রয়োগ করার অনুমতি দেওয়ার জন্য মডিউল একাধিক নামযুক্ত স্বাক্ষর সংজ্ঞায়িত করতে পারে (পাইথন অবজেক্টের পদ্ধতিগুলির অনুরূপ)। একটি মডিউল এর ডকুমেন্টেশন উপলব্ধ স্বাক্ষর বর্ণনা করা উচিত. উপরের কলটি "default" নামের স্বাক্ষরটি প্রয়োগ করে। যেকোনো স্বাক্ষরকে তার নাম ঐচ্ছিক signature= যুক্তিতে পাস করে নির্বাচন করা যেতে পারে।

যদি একটি স্বাক্ষরে একাধিক ইনপুট থাকে, তবে সেগুলি অবশ্যই স্বাক্ষর দ্বারা সংজ্ঞায়িত কীগুলির সাথে একটি ডিক্ট হিসাবে পাস করতে হবে। একইভাবে, যদি একটি স্বাক্ষরের একাধিক আউটপুট থাকে, তাহলে স্বাক্ষরের দ্বারা সংজ্ঞায়িত কীগুলির অধীনে as_dict=True পাস করে এগুলি একটি dict হিসাবে পুনরুদ্ধার করা যেতে পারে (কী "default" হল একক আউটপুটটির জন্য যদি as_dict=False )। সুতরাং একটি মডিউল প্রয়োগের সবচেয়ে সাধারণ ফর্মটি দেখতে এরকম দেখাচ্ছে:

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

একটি কলার অবশ্যই একটি স্বাক্ষর দ্বারা সংজ্ঞায়িত সমস্ত ইনপুট সরবরাহ করতে হবে, তবে একটি মডিউলের সমস্ত আউটপুট ব্যবহার করার কোন প্রয়োজন নেই৷ TensorFlow মডিউলের শুধুমাত্র সেই অংশগুলি চালাবে যেগুলি tf.Session.run() এ লক্ষ্যের নির্ভরতা হিসাবে শেষ হয়। প্রকৃতপক্ষে, মডিউল প্রকাশকরা প্রধান আউটপুটগুলির সাথে উন্নত ব্যবহারের জন্য বিভিন্ন আউটপুট প্রদান করতে বেছে নিতে পারে (যেমন মধ্যবর্তী স্তরগুলির সক্রিয়করণ)। মডিউল ভোক্তাদের অতিরিক্ত আউটপুটগুলি সুন্দরভাবে পরিচালনা করা উচিত।

বিকল্প মডিউল চেষ্টা করে

যখনই একই কাজের জন্য একাধিক মডিউল থাকে, টেনসরফ্লো হাব তাদের সামঞ্জস্যপূর্ণ স্বাক্ষর (ইন্টারফেস) দিয়ে সজ্জিত করতে উত্সাহিত করে যাতে বিভিন্ন মডিউল চেষ্টা করা স্ট্রিং-মূল্যের হাইপারপ্যারামিটারের মতো মডিউল হ্যান্ডেলের পরিবর্তনের মতোই সহজ।

এই লক্ষ্যে, আমরা জনপ্রিয় কাজের জন্য সুপারিশকৃত সাধারণ স্বাক্ষরের একটি সংগ্রহ বজায় রাখি।

একটি নতুন মডিউল তৈরি করা হচ্ছে

সামঞ্জস্যপূর্ণ নোট

TF1 হাব ফর্ম্যাটটি টেনসরফ্লো 1 এর দিকে তৈরি। এটি শুধুমাত্র আংশিকভাবে টেনসরফ্লো 2-এ TF হাব দ্বারা সমর্থিত। পরিবর্তে নতুন TF2 সেভডমডেল ফর্ম্যাটে প্রকাশ করার কথা বিবেচনা করুন।

TF1 হাব ফরম্যাটটি সিনট্যাকটিক লেভেলে (একই ফাইলের নাম এবং প্রোটোকল বার্তা) TensorFlow 1 এর SavedModel ফরম্যাটের অনুরূপ কিন্তু মডিউল পুনঃব্যবহার, কম্পোজিশন এবং পুনঃপ্রশিক্ষণ (যেমন, রিসোর্স ইনিশিয়ালাইজারের বিভিন্ন সঞ্চয়স্থান, বিভিন্ন ট্যাগিং) এর জন্য শব্দার্থগতভাবে ভিন্ন। মেটাগ্রাফের জন্য নিয়মাবলী)। ডিস্কে তাদের আলাদা করার সবচেয়ে সহজ উপায় হল tfhub_module.pb ফাইলের উপস্থিতি বা অনুপস্থিতি।

সাধারণ পদ্ধতির

একটি নতুন মডিউল সংজ্ঞায়িত করার জন্য, একজন প্রকাশক একটি ফাংশন module_fn সহ hub.create_module_spec() কল করে। এই ফাংশনটি কলারের দ্বারা সরবরাহ করা ইনপুটগুলির জন্য tf.placeholder() ব্যবহার করে মডিউলের অভ্যন্তরীণ কাঠামোর প্রতিনিধিত্বকারী একটি গ্রাফ তৈরি করে। তারপরে এটি hub.add_signature(name, inputs, outputs) এক বা একাধিকবার কল করে স্বাক্ষর সংজ্ঞায়িত করে।

উদাহরণ স্বরূপ:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

hub.create_module_spec() এর ফলাফল একটি নির্দিষ্ট TensorFlow গ্রাফের মধ্যে একটি মডিউল অবজেক্টকে ইনস্ট্যান্টিয়েট করতে পাথের পরিবর্তে ব্যবহার করা যেতে পারে। এই ধরনের ক্ষেত্রে, কোন চেকপয়েন্ট নেই, এবং মডিউল ইনস্ট্যান্স পরিবর্তে পরিবর্তনশীল ইনিশিয়ালাইজার ব্যবহার করবে।

যেকোন মডিউল দৃষ্টান্তকে তার export(path, session) পদ্ধতির মাধ্যমে ডিস্কে সিরিয়ালাইজ করা যেতে পারে। একটি মডিউল রপ্তানি করা পাস করা পথে session এর ভেরিয়েবলের বর্তমান অবস্থার সাথে তার সংজ্ঞাকে সিরিয়ালাইজ করে। এটি প্রথমবারের জন্য একটি মডিউল রপ্তানি করার সময়, সেইসাথে একটি সূক্ষ্ম সুর করা মডিউল রপ্তানি করার সময় ব্যবহার করা যেতে পারে।

TensorFlow এস্টিমেটরের সাথে সামঞ্জস্যের জন্য, hub.LatestModuleExporter সর্বশেষ চেকপয়েন্ট থেকে মডিউল রপ্তানি করে, ঠিক যেমন tf.estimator.LatestExporter সর্বশেষ চেকপয়েন্ট থেকে সম্পূর্ণ মডেল রপ্তানি করে।

মডিউল প্রকাশকদের যখন সম্ভব একটি সাধারণ স্বাক্ষর প্রয়োগ করা উচিত, যাতে ভোক্তারা সহজেই মডিউল বিনিময় করতে পারে এবং তাদের সমস্যার জন্য সেরাটি খুঁজে পেতে পারে।

বাস্তব উদাহরণ

একটি সাধারণ পাঠ্য এমবেডিং বিন্যাস থেকে কীভাবে একটি মডিউল তৈরি করা যায় তার একটি বাস্তব-বিশ্বের উদাহরণের জন্য আমাদের পাঠ্য এমবেডিং মডিউল রপ্তানিকারকটি দেখুন।

ফাইন-টিউনিং

একটি আমদানি করা মডিউলের ভেরিয়েবলকে এর চারপাশের মডেলের সাথে একসাথে প্রশিক্ষণ দেওয়াকে ফাইন-টিউনিং বলা হয়। ফাইন-টিউনিংয়ের ফলে আরও ভালো মানের হতে পারে, কিন্তু নতুন জটিলতা যোগ করে। আমরা ভোক্তাদেরকে উপদেশ দিই সূক্ষ্ম-টিউনিং দেখার জন্য কেবলমাত্র সহজ গুণমানের পরিবর্তনগুলি অন্বেষণ করার পরে, এবং শুধুমাত্র যদি মডিউল প্রকাশক এটির সুপারিশ করে।

ভোক্তাদের জন্য

ফাইন-টিউনিং সক্ষম করতে, মডিউলটিকে hub.Module(..., trainable=True) দিয়ে ইনস্ট্যান্টিয়েট করুন যাতে এর ভেরিয়েবলগুলিকে প্রশিক্ষিত করা যায় এবং TensorFlow-এর REGULARIZATION_LOSSES আমদানি করুন। যদি মডিউলটির একাধিক গ্রাফ বৈকল্পিক থাকে, তাহলে প্রশিক্ষণের জন্য উপযুক্ত একটি বেছে নিন। সাধারণত, এটিই {"train"} ট্যাগযুক্ত।

এমন একটি প্রশিক্ষণ ব্যবস্থা বেছে নিন যা প্রাক-প্রশিক্ষিত ওজনকে নষ্ট করে না, উদাহরণস্বরূপ, স্ক্র্যাচ থেকে প্রশিক্ষণের তুলনায় কম শেখার হার।

প্রকাশকদের জন্য

ভোক্তাদের জন্য ফাইন-টিউনিং সহজ করতে, অনুগ্রহ করে নিম্নলিখিতগুলি মনে রাখবেন:

  • ফাইন-টিউনিং নিয়মিতকরণ প্রয়োজন। আপনার মডিউলটি REGULARIZATION_LOSSES সংগ্রহের সাথে রপ্তানি করা হয়েছে, যা আপনার পছন্দের tf.layers.dense(..., kernel_regularizer=...) ইত্যাদিকে ভোক্তারা tf.losses.get_regularization_losses() থেকে যা পায় তাতে রাখে। L1/L2 নিয়মিতকরণ ক্ষতি সংজ্ঞায়িত করার এই উপায় পছন্দ করুন।

  • প্রকাশক মডেলে, tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer , এবং অন্যান্য প্রক্সিমাল অপ্টিমাইজারের l1_ এবং l2_regularization_strength প্যারামিটারের মাধ্যমে L1/L2 নিয়মিতকরণকে সংজ্ঞায়িত করা এড়িয়ে চলুন। এগুলি মডিউলের পাশাপাশি রপ্তানি করা হয় না এবং বিশ্বব্যাপী নিয়মিতকরণের শক্তি সেট করা ভোক্তার জন্য উপযুক্ত নাও হতে পারে। প্রশস্ত (অর্থাৎ স্পার্স লিনিয়ার) বা প্রশস্ত এবং গভীর মডেলগুলিতে L1 নিয়মিতকরণ ব্যতীত, পরিবর্তে পৃথক নিয়মিতকরণ ক্ষতি ব্যবহার করা সম্ভব হওয়া উচিত।

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