পুনঃব্যবহারযোগ্য সংরক্ষিত মডেল

ভূমিকা

TensorFlow Hub অন্যান্য সম্পদের মধ্যে TensorFlow 2-এর জন্য SavedModels হোস্ট করে। এগুলিকে obj = hub.load(url) [ আরও জানুন ] সহ একটি পাইথন প্রোগ্রামে লোড করা যেতে পারে। প্রত্যাবর্তিত obj হল tf.saved_model.load() এর ফলাফল (TensorFlow এর SavedModel গাইড দেখুন)। এই অবজেক্টের স্বেচ্ছাচারী বৈশিষ্ট্য থাকতে পারে যা tf.functions, tf.Variables (তাদের প্রাক-প্রশিক্ষিত মান থেকে শুরু করা), অন্যান্য সংস্থান এবং, পুনরাবৃত্তভাবে, এই জাতীয় আরও অনেক বস্তু।

এই পৃষ্ঠাটি টেনসরফ্লো পাইথন প্রোগ্রামে পুনঃব্যবহারের জন্য লোড করা obj দ্বারা প্রয়োগ করা একটি ইন্টারফেস বর্ণনা করে। এই ইন্টারফেসের সাথে সঙ্গতিপূর্ণ সংরক্ষিত মডেলগুলিকে পুনঃব্যবহারযোগ্য সংরক্ষিত মডেল বলা হয়।

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

TensorFlow হাব টিম উপরের অর্থে পুনঃব্যবহারের উদ্দেশ্যে সমস্ত সংরক্ষিত মডেলগুলিতে পুনরায় ব্যবহারযোগ্য সংরক্ষিত মডেল ইন্টারফেস প্রয়োগ করার সুপারিশ করেtensorflow_hub লাইব্রেরি থেকে অনেক ইউটিলিটি, বিশেষ করে hub.KerasLayer , এটি বাস্তবায়নের জন্য SavedModels প্রয়োজন।

SignatureDefs এর সাথে সম্পর্ক

tf.functions এবং অন্যান্য TF2 বৈশিষ্ট্যগুলির পরিপ্রেক্ষিতে এই ইন্টারফেসটি SavedModel-এর স্বাক্ষর থেকে আলাদা, যা TF1 থেকে পাওয়া যাচ্ছে এবং অনুমানের জন্য TF2 তে ব্যবহার করা অব্যাহত রয়েছে (যেমন TF সার্ভিং বা TF Lite-এ SavedModels স্থাপন)। অনুমানের জন্য স্বাক্ষরগুলি ফাইন-টিউনিং সমর্থন করার জন্য যথেষ্ট অভিব্যক্তিপূর্ণ নয়, এবং tf.function পুনঃব্যবহৃত মডেলের জন্য আরও স্বাভাবিক এবং অভিব্যক্তিপূর্ণ পাইথন API প্রদান করে।

মডেল-বিল্ডিং লাইব্রেরির সাথে সম্পর্ক

একটি পুনঃব্যবহারযোগ্য সংরক্ষিত মডেল শুধুমাত্র TensorFlow 2 আদিম ব্যবহার করে, কেরাস বা সনেটের মতো কোনো নির্দিষ্ট মডেল-বিল্ডিং লাইব্রেরি থেকে স্বাধীন। এটি মূল মডেল-বিল্ডিং কোডের উপর নির্ভরতা থেকে মুক্ত, মডেল-বিল্ডিং লাইব্রেরি জুড়ে পুনঃব্যবহারের সুবিধা দেয়।

কিছু পরিমাণ অভিযোজন প্রয়োজন হবে পুনঃব্যবহারযোগ্য সংরক্ষিত মডেলগুলিকে লোড করতে বা সেগুলিকে যেকোন মডেল-বিল্ডিং লাইব্রেরি থেকে সংরক্ষণ করতে হবে। কেরাসের জন্য, hub.KerasLayer লোডিং প্রদান করে, এবং কেরাসের অন্তর্নির্মিত সেভিং সেভডমডেল ফর্ম্যাটে এই ইন্টারফেসের একটি সুপারসেট প্রদানের লক্ষ্যে TF2 এর জন্য পুনরায় ডিজাইন করা হয়েছে (মে 2019 থেকে RFC দেখুন)।

টাস্ক-নির্দিষ্ট "সাধারণ সংরক্ষিত মডেল APIs" এর সাথে সম্পর্ক

এই পৃষ্ঠার ইন্টারফেসের সংজ্ঞা যেকোনো সংখ্যা এবং প্রকারের ইনপুট এবং আউটপুটগুলির জন্য অনুমতি দেয়। TF হাবের জন্য সাধারণ সংরক্ষিত মডেল APIগুলি মডেলগুলিকে সহজে বিনিময়যোগ্য করার জন্য নির্দিষ্ট কাজের জন্য ব্যবহারের নিয়মগুলির সাথে এই সাধারণ ইন্টারফেসটিকে পরিমার্জন করে৷

ইন্টারফেস সংজ্ঞা

গুণাবলী

একটি পুনঃব্যবহারযোগ্য সংরক্ষিত মডেল হল একটি TensorFlow 2 SavedModel যেমন obj = tf.saved_model.load(...) একটি অবজেক্ট রিটার্ন করে যার নিম্নলিখিত বৈশিষ্ট্য রয়েছে

  • __call__ প্রয়োজন। মডেলের গণনা ("ফরোয়ার্ড পাস") বাস্তবায়নকারী একটি tf.ফাংশন নীচের স্পেসিফিকেশন সাপেক্ষে।

  • variables : tf. ভ্যারিয়েবল অবজেক্টের একটি তালিকা, __call__ এর সম্ভাব্য আমন্ত্রণ দ্বারা ব্যবহৃত সমস্ত ভেরিয়েবলের তালিকা, প্রশিক্ষণযোগ্য এবং অ-প্রশিক্ষণযোগ্য উভয়ই সহ।

    এই তালিকাটি খালি থাকলে বাদ দেওয়া যেতে পারে।

  • trainable_variables : tf.Variable অবজেক্টের একটি তালিকা যেমন v.trainable সমস্ত উপাদানের জন্য সত্য। এই ভেরিয়েবলগুলি অবশ্যই variables একটি উপসেট হতে হবে। বস্তুটিকে সূক্ষ্ম-টিউনিং করার সময় এইগুলিকে প্রশিক্ষিত করতে হবে। SavedModel স্রষ্টা এখানে কিছু ভেরিয়েবল বাদ দিতে বেছে নিতে পারেন যেগুলি মূলত প্রশিক্ষনযোগ্য ছিল ইঙ্গিত করার জন্য যে এগুলি ফাইন-টিউনিংয়ের সময় পরিবর্তন করা উচিত নয়৷

    এই তালিকাটি খালি থাকলে বাদ দেওয়া যেতে পারে, বিশেষ করে, যদি SavedModel ফাইন-টিউনিং সমর্থন না করে।

  • regularization_losses : tf.functionগুলির একটি তালিকা, প্রতিটি শূন্য ইনপুট গ্রহণ করে এবং একটি একক স্কেলার ফ্লোট টেনসর প্রদান করে। ফাইন-টিউনিংয়ের জন্য, সেভডমডেল ব্যবহারকারীকে এইগুলিকে ক্ষতির মধ্যে অতিরিক্ত নিয়মিতকরণ শর্তাদি হিসাবে অন্তর্ভুক্ত করার পরামর্শ দেওয়া হচ্ছে (আরও স্কেলিং ছাড়াই সহজ ক্ষেত্রে)। সাধারণত, এগুলি ওজন নিয়মিতকারীদের প্রতিনিধিত্ব করতে ব্যবহৃত হয়। (ইনপুটের অভাবের জন্য, এই tf. ফাংশনগুলি কার্যকলাপ নিয়মিতকারীকে প্রকাশ করতে পারে না।)

    এই তালিকাটি খালি থাকলে বাদ দেওয়া যেতে পারে, বিশেষ করে, যদি SavedModel ফাইন-টিউনিং সমর্থন না করে বা ওজন নিয়মিতকরণের নির্দেশ দিতে না চায়।

__call__ ফাংশন

একটি পুনরুদ্ধার করা SavedModel obj একটি obj.__call__ বৈশিষ্ট্য রয়েছে যা একটি পুনরুদ্ধার করা tf.function এবং obj নিম্নরূপ কল করার অনুমতি দেয়।

সারমর্ম (ছদ্ম-কোড):

outputs = obj(inputs, trainable=..., **kwargs)

যুক্তি

যুক্তিগুলো নিম্নরূপ।

  • সংরক্ষিত মডেলের ইনপুট সক্রিয়করণের একটি ব্যাচের সাথে একটি অবস্থানগত, প্রয়োজনীয় যুক্তি রয়েছে। এর ধরন অন্যতম

    • একটি একক ইনপুটের জন্য একটি একক টেনসর,
    • নামহীন ইনপুটগুলির একটি ক্রমানুসারের জন্য টেনসরগুলির একটি তালিকা,
    • ইনপুট নামের একটি নির্দিষ্ট সেট দ্বারা চাবি করা Tensors একটি dict.

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

  • একটি ঐচ্ছিক কীওয়ার্ড আর্গুমেন্ট training থাকতে পারে যা পাইথন বুলিয়ান, True বা False গ্রহণ করে। ডিফল্ট হল False . যদি মডেলটি ফাইন-টিউনিং সমর্থন করে, এবং যদি এর গণনা দুটির মধ্যে পার্থক্য হয় (যেমন, ড্রপআউট এবং ব্যাচ স্বাভাবিককরণে), তবে এই পার্থক্যটি এই যুক্তির সাথে বাস্তবায়িত হয়। অন্যথায়, এই যুক্তি অনুপস্থিত হতে পারে.

    এটি প্রয়োজনীয় নয় যে __call__ একটি টেনসর-মূল্যবান training যুক্তি গ্রহণ করবে। তাদের মধ্যে প্রেরণের জন্য প্রয়োজনে tf.cond() ব্যবহার করার জন্য এটি কলারের উপর পড়ে।

  • SavedModel স্রষ্টা নির্দিষ্ট নামের আরও ঐচ্ছিক kwargs গ্রহণ করতে বেছে নিতে পারেন।

    • টেনসর-মূল্যবান আর্গুমেন্টের জন্য, SavedModel স্রষ্টা তাদের অনুমতিযোগ্য dtypes এবং আকারগুলি সংজ্ঞায়িত করেন৷ tf.function একটি আর্গুমেন্টে একটি পাইথন ডিফল্ট মান গ্রহণ করে যা একটি tf.TensorSpec ইনপুট দ্বারা চিহ্নিত করা হয়। এই ধরনের আর্গুমেন্টগুলি __call__ এর সাথে জড়িত সাংখ্যিক হাইপারপ্যারামিটারের কাস্টমাইজেশনের অনুমতি দিতে ব্যবহার করা যেতে পারে (যেমন, ড্রপআউট রেট)।

    • Python-মূল্যবান আর্গুমেন্টের জন্য, SavedModel স্রষ্টা তাদের অনুমোদনযোগ্য মান নির্ধারণ করে। ট্রেসড ফাংশনে আলাদা পছন্দ করার জন্য এই ধরনের আর্গুমেন্টগুলিকে ফ্ল্যাগ হিসেবে ব্যবহার করা যেতে পারে (তবে ট্রেসের কম্বিনেটরিয়াল বিস্ফোরণের কথা মাথায় রাখুন)।

পুনরুদ্ধার করা __call__ ফাংশনটি অবশ্যই যুক্তিগুলির সমস্ত অনুমতিযোগ্য সমন্বয়ের জন্য ট্রেস প্রদান করবে৷ True এবং False এর মধ্যে ফ্লিপিং training অবশ্যই আর্গুমেন্টের অনুমতি পরিবর্তন করবে না।

ফলাফল

কলিং obj থেকে outputs হতে পারে

  • একটি একক আউটপুটের জন্য একটি একক টেনসর,
  • নামহীন আউটপুটগুলির একটি ক্রমানুসারের জন্য টেনসরগুলির একটি তালিকা,
  • আউটপুট নামের একটি নির্দিষ্ট সেট দ্বারা চাবি করা Tensors একটি dict.

(এই ইন্টারফেসের ভবিষ্যত সংশোধনগুলি আরও সাধারণ নেস্টের অনুমতি দিতে পারে।) পাইথন-মূল্যবান কোয়ার্গের উপর নির্ভর করে রিটার্নের ধরন পরিবর্তিত হতে পারে। এটি অতিরিক্ত আউটপুট উত্পাদন পতাকা জন্য অনুমতি দেয়. SavedModel নির্মাতা আউটপুট dtypes এবং আকার এবং ইনপুট উপর তাদের নির্ভরতা সংজ্ঞায়িত করে.

নাম কলেবল

একটি পুনঃব্যবহারযোগ্য সংরক্ষিত মডেল উপরে বর্ণিত পদ্ধতিতে একাধিক মডেলের টুকরোগুলিকে নামযুক্ত সাবজেক্টে রেখে দিতে পারে, উদাহরণস্বরূপ, obj.foo , obj.bar এবং আরও অনেক কিছু। প্রতিটি সাববজেক্ট একটি __call__ পদ্ধতি এবং ভেরিয়েবল ইত্যাদি সম্পর্কে সমর্থনকারী বৈশিষ্ট্য প্রদান করে। উপরের উদাহরণের জন্য, obj.foo.__call__ , obj.foo.variables ইত্যাদি থাকবে।

মনে রাখবেন যে এই ইন্টারফেসটি সরাসরি tf.foo হিসাবে একটি বেয়ার tf.function যোগ করার পদ্ধতিকে কভার করে না

পুনঃব্যবহারযোগ্য সংরক্ষিত মডেলের ব্যবহারকারীরা শুধুমাত্র এক স্তরের নেস্টিং পরিচালনা করবে বলে আশা করা হয় ( obj.bar কিন্তু obj.bar.baz নয়)। (এই ইন্টারফেসের ভবিষ্যত সংশোধনগুলি আরও গভীর বাসা বাঁধার অনুমতি দিতে পারে এবং শীর্ষ-স্তরের অবজেক্টটি নিজেই কলযোগ্য হওয়ার প্রয়োজনীয়তা ত্যাগ করতে পারে।)

সমাপনী মন্তব্য

ইন-প্রসেস API-এর সাথে সম্পর্ক

এই ডকুমেন্টটি পাইথন ক্লাসের একটি ইন্টারফেস বর্ণনা করে যা tf.function এবং tf.Variable-এর মতো আদিম উপাদান নিয়ে গঠিত যা tf.saved_model.save() এবং tf.saved_model.load() এর মাধ্যমে সিরিয়ালাইজেশনের মাধ্যমে একটি রাউন্ড-ট্রিপ টিকে থাকে। যাইহোক, ইন্টারফেসটি আগে থেকেই আসল অবজেক্টে উপস্থিত ছিল যা tf.saved_model.save() এ পাস করা হয়েছিল। সেই ইন্টারফেসের সাথে অভিযোজন একটি একক TensorFlow প্রোগ্রামের মধ্যে মডেল-বিল্ডিং API গুলি জুড়ে মডেল টুকরা বিনিময় সক্ষম করে।