কেরাসের ব্যাচ নরমালাইজেশন লেয়ারটি ভাঙ্গা হয়েছে PlatoBlockchain ডেটা ইন্টেলিজেন্স। উল্লম্ব অনুসন্ধান. আ.

কেরাসের ব্যাচ নরমালাইজেশন স্তরটি নষ্ট হয়ে গেছে

আপডেট: দুর্ভাগ্যবশত কেরাসের কাছে আমার পুল-অনুরোধ যা ব্যাচ স্বাভাবিককরণ স্তরের আচরণ পরিবর্তন করেছে তা গ্রহণ করা হয়নি। আপনি বিস্তারিত পড়তে পারেন এখানে. আপনার মধ্যে যারা কাস্টম বাস্তবায়নের সাথে তালগোল পাকানোর জন্য যথেষ্ট সাহসী, আপনি কোডটি খুঁজে পেতে পারেন আমার শাখা. আমি এটি বজায় রাখতে পারি এবং কেরাসের সর্বশেষ স্থিতিশীল সংস্করণের সাথে এটি একত্রিত করতে পারি (2.1.6, 2.2.2 এবং 2.2.4) যতক্ষণ আমি এটি ব্যবহার করি তবে কোন প্রতিশ্রুতি নেই।

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

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

নীচের সাবসেকশনে, আমি কীভাবে ডিপ লার্নিং-এ ট্রান্সফার লার্নিং ব্যবহার করা হয়, ব্যাচ নরমালাইজেশন লেয়ার কী, কীভাবে লার্নিং_ফেজ কাজ করে এবং কেরাস কীভাবে সময়ের সাথে সাথে BN আচরণ পরিবর্তন করেছে তার একটি ভূমিকা প্রদান করি। আপনি যদি এইগুলি ইতিমধ্যেই জানেন, আপনি নিরাপদে সরাসরি বিভাগ 2-এ যেতে পারেন।

1.1 ট্রান্সফার লার্নিং ব্যবহার করা গভীর শিক্ষার জন্য অত্যন্ত গুরুত্বপূর্ণ

অতীতে যে কারণে ডিপ লার্নিং-এর সমালোচনা করা হয়েছিল তার একটি হল এর জন্য অনেক বেশি ডেটার প্রয়োজন। এই সবসময় সত্য নয়; এই সীমাবদ্ধতা মোকাবেলার জন্য বেশ কিছু কৌশল রয়েছে, যার মধ্যে একটি হল ট্রান্সফার লার্নিং।

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

1.2 ব্যাচ নরমালাইজেশন লেয়ার কি?

ব্যাচ নরমালাইজেশন লেয়ারটি 2014 সালে Ioffe এবং Szegedy দ্বারা চালু করা হয়েছিল। এটি পূর্ববর্তী স্তরের আউটপুটকে মানক করে অদৃশ্য হয়ে যাওয়া গ্রেডিয়েন্ট সমস্যার সমাধান করে, এটি প্রয়োজনীয় পুনরাবৃত্তির সংখ্যা হ্রাস করে প্রশিক্ষণের গতি বাড়ায় এবং এটি গভীর নিউরাল নেটওয়ার্কের প্রশিক্ষণ সক্ষম করে। এটি কীভাবে কাজ করে তা ব্যাখ্যা করা এই পোস্টের সুযোগের বাইরে কিন্তু আমি আপনাকে দৃঢ়ভাবে পড়তে উত্সাহিত করছি মূল কাগজ. একটি অতি সরলীকৃত ব্যাখ্যা হল যে এটি ইনপুটকে এর গড় বিয়োগ করে এবং এর আদর্শ বিচ্যুতি দিয়ে ভাগ করে পুনরায় স্কেল করে; প্রয়োজনে এটি রূপান্তরকে পূর্বাবস্থায় ফিরিয়ে আনতেও শিখতে পারে।
কেরাসের ব্যাচ নরমালাইজেশন লেয়ারটি ভাঙ্গা হয়েছে PlatoBlockchain ডেটা ইন্টেলিজেন্স। উল্লম্ব অনুসন্ধান. আ.

1.3 কেরাসে লার্নিং_ফেজ কি?

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

কেরাস জানে কোন মোডে চালাতে হবে কারণ এটিতে একটি বিল্ট-ইন মেকানিজম বলা হয় শেখার_পর্যায়. শেখার পর্যায় নিয়ন্ত্রণ করে যে নেটওয়ার্কটি ট্রেন বা পরীক্ষা মোডে আছে কিনা। ব্যবহারকারীর দ্বারা ম্যানুয়ালি সেট করা না থাকলে, fit() চলাকালীন নেটওয়ার্ক Learning_phase=1 (ট্রেন মোড) দিয়ে চলে। ভবিষ্যদ্বাণী তৈরি করার সময় (উদাহরণস্বরূপ যখন আমরা ভবিষ্যদ্বাণী() এবং মূল্যায়ন() পদ্ধতিগুলিকে কল করি বা ফিট() এর বৈধকরণ ধাপে) নেটওয়ার্কটি Learning_phase=0 (টেস্ট মোড) দিয়ে চলে। যদিও এটি সুপারিশ করা হয় না, ব্যবহারকারী স্থিতিশীলভাবে লার্নিং_ফেজটিকে একটি নির্দিষ্ট মানতে পরিবর্তন করতে সক্ষম হয় তবে গ্রাফে কোনও মডেল বা টেনসর যোগ করার আগে এটি ঘটতে হবে। লার্নিং_ফেজটি স্থিরভাবে সেট করা থাকলে, ব্যবহারকারী যে মোড নির্বাচন করবে তাতে কেরাস লক করা হবে।

1.4 কিভাবে কেরাস সময়ের সাথে ব্যাচ স্বাভাবিককরণ বাস্তবায়ন করেছে?

কেরাস ব্যাচ নরমালাইজেশনের আচরণকে বেশ কয়েকবার পরিবর্তন করেছে কিন্তু সবচেয়ে সাম্প্রতিক উল্লেখযোগ্য আপডেটটি কেরাস 2.1.3 এ ঘটেছে। v2.1.3 এর আগে যখন BN স্তর হিমায়িত ছিল (trainable = False) এটি তার ব্যাচের পরিসংখ্যান আপডেট করতে থাকে, যা এর ব্যবহারকারীদের জন্য মহাকাব্যিক মাথাব্যথার কারণ হয়ে দাঁড়ায়।

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

নীচে আমি ঠিক কী সমস্যাটি বর্ণনা করছি এবং আমি এটি সমাধানের জন্য প্রযুক্তিগত বাস্তবায়নের স্কেচ আউট করেছি। এর আগে এবং পরে মডেলের নির্ভুলতার উপর প্রভাব দেখানোর জন্য আমি কয়েকটি উদাহরণও প্রদান করি তালি প্রয়োগ করা হয়.

2.1 সমস্যার প্রযুক্তিগত বিবরণ

কেরাসের বর্তমান বাস্তবায়নের সমস্যা হল যে যখন একটি BN স্তর হিমায়িত হয়, তখন এটি প্রশিক্ষণের সময় মিনি-ব্যাচের পরিসংখ্যান ব্যবহার করতে থাকে। আমি বিশ্বাস করি যখন BN হিমায়িত হয় তখন একটি ভাল পদ্ধতি হল চলমান গড় এবং বৈচিত্র্য ব্যবহার করা যা এটি প্রশিক্ষণের সময় শিখেছে। কেন? একই কারণে যখন স্তরটি হিমায়িত হয় তখন মিনি-ব্যাচের পরিসংখ্যান আপডেট করা উচিত নয়: এটি খারাপ ফলাফলের দিকে নিয়ে যেতে পারে কারণ পরবর্তী স্তরগুলি সঠিকভাবে প্রশিক্ষিত নয়৷

ধরে নিন আপনি একটি কম্পিউটার ভিশন মডেল তৈরি করছেন কিন্তু আপনার কাছে পর্যাপ্ত ডেটা নেই, তাই আপনি কেরাসের প্রাক-প্রশিক্ষিত সিএনএনগুলির একটি ব্যবহার করার সিদ্ধান্ত নেন এবং এটিকে সূক্ষ্ম-টিউন করেন। দুর্ভাগ্যবশত, এটি করার মাধ্যমে আপনি কোন গ্যারান্টি পাবেন না যে BN স্তরগুলির মধ্যে আপনার নতুন ডেটাসেটের গড় এবং ভিন্নতা মূল ডেটাসেটের মতো হবে৷ মনে রাখবেন যে এই মুহুর্তে, প্রশিক্ষণের সময় আপনার নেটওয়ার্ক সর্বদা মিনি-ব্যাচের পরিসংখ্যান ব্যবহার করবে হয় BN স্তরটি হিমায়িত হয়েছে বা নেই; এছাড়াও অনুমানের সময় আপনি হিমায়িত BN স্তরগুলির পূর্বে শেখা পরিসংখ্যান ব্যবহার করবেন। ফলস্বরূপ, আপনি যদি উপরের স্তরগুলিকে সূক্ষ্ম-টিউন করেন তবে তাদের ওজনগুলি এর গড়/প্রকরণের সাথে সামঞ্জস্য করা হবে নতুন ডেটাসেট তবুও, অনুমানের সময় তারা স্কেল করা ডেটা পাবে ভিন্নভাবে কারণ এর গড়/প্রকরণ মূল ডেটাসেট ব্যবহার করা হবে।
কেরাসের ব্যাচ নরমালাইজেশন লেয়ারটি ভাঙ্গা হয়েছে PlatoBlockchain ডেটা ইন্টেলিজেন্স। উল্লম্ব অনুসন্ধান. আ.
উপরে আমি প্রদর্শনের উদ্দেশ্যে একটি সরল (এবং অবাস্তব) আর্কিটেকচার প্রদান করি। ধরা যাক যে আমরা কনভোলিউশন k+1 থেকে নেটওয়ার্কের উপরের দিকে (ডান দিকে) পর্যন্ত মডেলটিকে ফাইন-টিউন করি এবং আমরা নীচে (বাম দিকে) হিমায়িত রাখি। প্রশিক্ষণের সময় 1 থেকে k পর্যন্ত সমস্ত BN স্তর আপনার প্রশিক্ষণের ডেটার গড়/প্রকরণ ব্যবহার করবে। এটি হিমায়িত ReLU-এর উপর নেতিবাচক প্রভাব ফেলবে যদি প্রতিটি BN-এর গড় এবং পার্থক্য প্রাক-প্রশিক্ষণের সময় শেখাগুলির কাছাকাছি না হয়। এটি অন্যান্য নেটওয়ার্ককে (CONV k+1 এবং পরবর্তী থেকে) ইনপুটগুলির সাথে প্রশিক্ষিত করার কারণ হবে যা অনুমানের সময় যা পাবে তার তুলনায় বিভিন্ন স্কেল রয়েছে৷ প্রশিক্ষণের সময় আপনার নেটওয়ার্ক এই পরিবর্তনগুলির সাথে খাপ খাইয়ে নিতে পারে, তবুও আপনি যে মুহূর্তে ভবিষ্যদ্বাণী-মোডে স্যুইচ করবেন, কেরাস বিভিন্ন মানককরণের পরিসংখ্যান ব্যবহার করবে, যা পরবর্তী স্তরগুলির ইনপুটগুলির বিতরণকে দ্রুততর করবে যা খারাপ ফলাফলের দিকে নিয়ে যাবে৷

2.2 আপনি আক্রান্ত হলে আপনি কিভাবে সনাক্ত করতে পারেন?

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

বাইনারি ক্লাসিফায়ারগুলির সাথে কাজ করার সময় সমস্যা সনাক্ত করার আরেকটি উপায় হল সঠিকতা এবং AUC পরীক্ষা করা। যদি নির্ভুলতা 50% এর কাছাকাছি হয় কিন্তু AUC 1 এর কাছাকাছি হয় (এবং আপনি একই ডেটাসেটে ট্রেন/পরীক্ষা মোডের মধ্যে পার্থক্যও লক্ষ্য করেন), তাহলে BN পরিসংখ্যানের কারণে সম্ভাব্যতাগুলি স্কেল-এর বাইরে হতে পারে। একইভাবে, রিগ্রেশনের জন্য আপনি এটি সনাক্ত করতে MSE এবং Spearman এর পারস্পরিক সম্পর্ক ব্যবহার করতে পারেন।

2.3 কিভাবে আমরা এটা ঠিক করতে পারি?

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

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

2.4 প্যাচ প্রভাব মূল্যায়ন

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

এখানে পরীক্ষা সম্পর্কে কয়েকটি গুরুত্বপূর্ণ পয়েন্ট রয়েছে:

  1. আমি ইচ্ছাকৃতভাবে মডেলটিকে ওভারফিট করার জন্য একটি ক্ষুদ্র পরিমাণ ডেটা ব্যবহার করব এবং আমি একই ডেটাসেটে মডেলটিকে প্রশিক্ষণ ও যাচাই করব। এটি করার মাধ্যমে, আমি ট্রেন/ভ্যালিডেশন ডেটাসেটে নিখুঁত নির্ভুলতা এবং অভিন্ন কর্মক্ষমতা আশা করি।
  2. যদি বৈধকরণের সময় আমি একই ডেটাসেটে উল্লেখযোগ্যভাবে কম নির্ভুলতা পাই, তাহলে আমার কাছে একটি স্পষ্ট ইঙ্গিত থাকবে যে বর্তমান BN নীতি অনুমানের সময় মডেলের কার্যকারিতাকে নেতিবাচকভাবে প্রভাবিত করে।
  3. জেনারেটরের বাইরে যেকোনো প্রিপ্রসেসিং হবে। এটি v2.1.5 (বর্তমানে আসন্ন v2.1.6 এবং সর্বশেষ মাস্টারে স্থির করা হয়েছে) এ প্রবর্তিত একটি বাগ নিয়ে কাজ করার জন্য করা হয়েছে।
  4. আমরা কেরাসকে মূল্যায়নের সময় বিভিন্ন শিক্ষার পর্যায়গুলি ব্যবহার করতে বাধ্য করব। আমরা যদি রিপোর্ট করা নির্ভুলতার মধ্যে পার্থক্য খুঁজে পাই তবে আমরা জানব যে আমরা বর্তমান BN নীতি দ্বারা প্রভাবিত।

পরীক্ষার জন্য কোড নীচে দেখানো হয়েছে:

import numpy as np
from keras.datasets import cifar10
from scipy.misc import imresize

from keras.preprocessing.image import ImageDataGenerator
from keras.applications.resnet50 import ResNet50, preprocess_input
from keras.models import Model, load_model
from keras.layers import Dense, Flatten
from keras import backend as K


seed = 42
epochs = 10
records_per_class = 100

# We take only 2 classes from CIFAR10 and a very small sample to intentionally overfit the model.
# We will also use the same data for train/test and expect that Keras will give the same accuracy.
(x, y), _ = cifar10.load_data()

def filter_resize(category):
   # We do the preprocessing here instead in the Generator to get around a bug on Keras 2.1.5.
   return [preprocess_input(imresize(img, (224,224)).astype('float')) for img in x[y.flatten()==category][:records_per_class]]

x = np.stack(filter_resize(3)+filter_resize(5))
records_per_class = x.shape[0] // 2
y = np.array([[1,0]]*records_per_class + [[0,1]]*records_per_class)


# We will use a pre-trained model and finetune the top layers.
np.random.seed(seed)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
l = Flatten()(base_model.output)
predictions = Dense(2, activation='softmax')(l)
model = Model(inputs=base_model.input, outputs=predictions)

for layer in model.layers[:140]:
   layer.trainable = False

for layer in model.layers[140:]:
   layer.trainable = True

model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(ImageDataGenerator().flow(x, y, seed=42), epochs=epochs, validation_data=ImageDataGenerator().flow(x, y, seed=42))

# Store the model on disk
model.save('tmp.h5')


# In every test we will clear the session and reload the model to force Learning_Phase values to change.
print('DYNAMIC LEARNING_PHASE')
K.clear_session()
model = load_model('tmp.h5')
# This accuracy should match exactly the one of the validation set on the last iteration.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))


print('STATIC LEARNING_PHASE = 0')
K.clear_session()
K.set_learning_phase(0)
model = load_model('tmp.h5')
# Again the accuracy should match the above.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))


print('STATIC LEARNING_PHASE = 1')
K.clear_session()
K.set_learning_phase(1)
model = load_model('tmp.h5')
# The accuracy will be close to the one of the training set on the last iteration.
print(model.evaluate_generator(ImageDataGenerator().flow(x, y, seed=42)))

কেরাস v2.1.5-এ ফলাফলগুলি পরীক্ষা করা যাক:

Epoch 1/10
1/7 [===>..........................] - ETA: 25s - loss: 0.8751 - acc: 0.5312
2/7 [=======>......................] - ETA: 11s - loss: 0.8594 - acc: 0.4531
3/7 [===========>..................] - ETA: 7s - loss: 0.8398 - acc: 0.4688 
4/7 [================>.............] - ETA: 4s - loss: 0.8467 - acc: 0.4844
5/7 [====================>.........] - ETA: 2s - loss: 0.7904 - acc: 0.5437
6/7 [========================>.....] - ETA: 1s - loss: 0.7593 - acc: 0.5625
7/7 [==============================] - 12s 2s/step - loss: 0.7536 - acc: 0.5744 - val_loss: 0.6526 - val_acc: 0.6650

Epoch 2/10
1/7 [===>..........................] - ETA: 4s - loss: 0.3881 - acc: 0.8125
2/7 [=======>......................] - ETA: 3s - loss: 0.3945 - acc: 0.7812
3/7 [===========>..................] - ETA: 2s - loss: 0.3956 - acc: 0.8229
4/7 [================>.............] - ETA: 1s - loss: 0.4223 - acc: 0.8047
5/7 [====================>.........] - ETA: 1s - loss: 0.4483 - acc: 0.7812
6/7 [========================>.....] - ETA: 0s - loss: 0.4325 - acc: 0.7917
7/7 [==============================] - 8s 1s/step - loss: 0.4095 - acc: 0.8089 - val_loss: 0.4722 - val_acc: 0.7700

Epoch 3/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2246 - acc: 0.9375
2/7 [=======>......................] - ETA: 3s - loss: 0.2167 - acc: 0.9375
3/7 [===========>..................] - ETA: 2s - loss: 0.2260 - acc: 0.9479
4/7 [================>.............] - ETA: 2s - loss: 0.2179 - acc: 0.9375
5/7 [====================>.........] - ETA: 1s - loss: 0.2356 - acc: 0.9313
6/7 [========================>.....] - ETA: 0s - loss: 0.2392 - acc: 0.9427
7/7 [==============================] - 8s 1s/step - loss: 0.2288 - acc: 0.9456 - val_loss: 0.4282 - val_acc: 0.7800

Epoch 4/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2183 - acc: 0.9688
2/7 [=======>......................] - ETA: 3s - loss: 0.1899 - acc: 0.9844
3/7 [===========>..................] - ETA: 2s - loss: 0.1887 - acc: 0.9792
4/7 [================>.............] - ETA: 1s - loss: 0.1995 - acc: 0.9531
5/7 [====================>.........] - ETA: 1s - loss: 0.1932 - acc: 0.9625
6/7 [========================>.....] - ETA: 0s - loss: 0.1819 - acc: 0.9688
7/7 [==============================] - 8s 1s/step - loss: 0.1743 - acc: 0.9747 - val_loss: 0.3778 - val_acc: 0.8400

Epoch 5/10
1/7 [===>..........................] - ETA: 3s - loss: 0.0973 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0828 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0851 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0897 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0928 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0936 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.1337 - acc: 0.9838 - val_loss: 0.3916 - val_acc: 0.8100

Epoch 6/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0747 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0852 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0812 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0831 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0779 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0766 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.0813 - acc: 1.0000 - val_loss: 0.3637 - val_acc: 0.8550

Epoch 7/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2478 - acc: 0.8750
2/7 [=======>......................] - ETA: 2s - loss: 0.1966 - acc: 0.9375
3/7 [===========>..................] - ETA: 2s - loss: 0.1528 - acc: 0.9583
4/7 [================>.............] - ETA: 1s - loss: 0.1300 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.1193 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.1196 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.1084 - acc: 0.9838 - val_loss: 0.3546 - val_acc: 0.8600

Epoch 8/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0539 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0900 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0815 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0740 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0700 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0701 - acc: 1.0000
7/7 [==============================] - 8s 1s/step - loss: 0.0695 - acc: 1.0000 - val_loss: 0.3269 - val_acc: 0.8600

Epoch 9/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0306 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0377 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0898 - acc: 0.9583
4/7 [================>.............] - ETA: 1s - loss: 0.0773 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.0742 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.0708 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.0659 - acc: 0.9838 - val_loss: 0.3604 - val_acc: 0.8600

Epoch 10/10
1/7 [===>..........................] - ETA: 3s - loss: 0.0354 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0381 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0354 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0828 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.0791 - acc: 0.9750
6/7 [========================>.....] - ETA: 0s - loss: 0.0794 - acc: 0.9792
7/7 [==============================] - 8s 1s/step - loss: 0.0704 - acc: 0.9838 - val_loss: 0.3615 - val_acc: 0.8600

DYNAMIC LEARNING_PHASE
[0.3614931714534759, 0.86]

STATIC LEARNING_PHASE = 0
[0.3614931714534759, 0.86]

STATIC LEARNING_PHASE = 1
[0.025861846953630446, 1.0]

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

প্রশিক্ষণ শেষ হওয়ার পর আমরা 3টি ভিন্ন লার্নিং_ফেজ কনফিগারেশন ব্যবহার করে মডেলটিকে মূল্যায়ন করি: ডায়নামিক, স্ট্যাটিক = 0 (পরীক্ষা মোড) এবং স্ট্যাটিক = 1 (প্রশিক্ষণ মোড)। যেমন আমরা দেখতে পাচ্ছি প্রথম দুটি কনফিগারেশন ক্ষতি এবং নির্ভুলতার ক্ষেত্রে অভিন্ন ফলাফল প্রদান করবে এবং তাদের মান শেষ পুনরাবৃত্তিতে সেট করা বৈধতার মডেলের রিপোর্ট করা নির্ভুলতার সাথে মেলে। তা সত্ত্বেও, একবার আমরা প্রশিক্ষণ মোডে স্যুইচ করলে, আমরা একটি বিশাল অসঙ্গতি (উন্নতি) লক্ষ্য করি। এটা কেন? আমরা আগেই বলেছি, নেটওয়ার্কের ওজনগুলি প্রশিক্ষণের ডেটার গড়/প্রকরণের সাথে স্কেল করা ডেটা পাওয়ার আশা করে টিউন করা হয়েছে। দুর্ভাগ্যবশত, সেই পরিসংখ্যানগুলি BN স্তরগুলিতে সংরক্ষিত পরিসংখ্যানগুলির থেকে আলাদা৷ যেহেতু BN স্তরগুলি হিমায়িত ছিল, এই পরিসংখ্যানগুলি কখনই আপডেট করা হয়নি। BN পরিসংখ্যানের মানগুলির মধ্যে এই অসঙ্গতি অনুমানের সময় নির্ভুলতার অবনতির দিকে নিয়ে যায়।

আমরা একবার প্রয়োগ করার পরে দেখা যাক কি হয় তালি:

Epoch 1/10
1/7 [===>..........................] - ETA: 26s - loss: 0.9992 - acc: 0.4375
2/7 [=======>......................] - ETA: 12s - loss: 1.0534 - acc: 0.4375
3/7 [===========>..................] - ETA: 7s - loss: 1.0592 - acc: 0.4479 
4/7 [================>.............] - ETA: 4s - loss: 0.9618 - acc: 0.5000
5/7 [====================>.........] - ETA: 2s - loss: 0.8933 - acc: 0.5250
6/7 [========================>.....] - ETA: 1s - loss: 0.8638 - acc: 0.5417
7/7 [==============================] - 13s 2s/step - loss: 0.8357 - acc: 0.5570 - val_loss: 0.2414 - val_acc: 0.9450

Epoch 2/10
1/7 [===>..........................] - ETA: 4s - loss: 0.2331 - acc: 0.9688
2/7 [=======>......................] - ETA: 2s - loss: 0.3308 - acc: 0.8594
3/7 [===========>..................] - ETA: 2s - loss: 0.3986 - acc: 0.8125
4/7 [================>.............] - ETA: 1s - loss: 0.3721 - acc: 0.8281
5/7 [====================>.........] - ETA: 1s - loss: 0.3449 - acc: 0.8438
6/7 [========================>.....] - ETA: 0s - loss: 0.3168 - acc: 0.8646
7/7 [==============================] - 9s 1s/step - loss: 0.3165 - acc: 0.8633 - val_loss: 0.1167 - val_acc: 0.9950

Epoch 3/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2457 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.2592 - acc: 0.9688
3/7 [===========>..................] - ETA: 2s - loss: 0.2173 - acc: 0.9688
4/7 [================>.............] - ETA: 1s - loss: 0.2122 - acc: 0.9688
5/7 [====================>.........] - ETA: 1s - loss: 0.2003 - acc: 0.9688
6/7 [========================>.....] - ETA: 0s - loss: 0.1896 - acc: 0.9740
7/7 [==============================] - 9s 1s/step - loss: 0.1835 - acc: 0.9773 - val_loss: 0.0678 - val_acc: 1.0000

Epoch 4/10
1/7 [===>..........................] - ETA: 1s - loss: 0.2051 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.1652 - acc: 0.9844
3/7 [===========>..................] - ETA: 2s - loss: 0.1423 - acc: 0.9896
4/7 [================>.............] - ETA: 1s - loss: 0.1289 - acc: 0.9922
5/7 [====================>.........] - ETA: 1s - loss: 0.1225 - acc: 0.9938
6/7 [========================>.....] - ETA: 0s - loss: 0.1149 - acc: 0.9948
7/7 [==============================] - 9s 1s/step - loss: 0.1060 - acc: 0.9955 - val_loss: 0.0455 - val_acc: 1.0000

Epoch 5/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0769 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0846 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0797 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0736 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0914 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0858 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0808 - acc: 1.0000 - val_loss: 0.0346 - val_acc: 1.0000

Epoch 6/10
1/7 [===>..........................] - ETA: 1s - loss: 0.1267 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.1039 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0893 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0780 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0758 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0789 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0738 - acc: 1.0000 - val_loss: 0.0248 - val_acc: 1.0000

Epoch 7/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0344 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0385 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0467 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0445 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0446 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0429 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0421 - acc: 1.0000 - val_loss: 0.0202 - val_acc: 1.0000

Epoch 8/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0319 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0300 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0320 - acc: 1.0000
4/7 [================>.............] - ETA: 2s - loss: 0.0307 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0303 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0291 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0358 - acc: 1.0000 - val_loss: 0.0167 - val_acc: 1.0000

Epoch 9/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0246 - acc: 1.0000
2/7 [=======>......................] - ETA: 3s - loss: 0.0255 - acc: 1.0000
3/7 [===========>..................] - ETA: 3s - loss: 0.0258 - acc: 1.0000
4/7 [================>.............] - ETA: 2s - loss: 0.0250 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0252 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0260 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0327 - acc: 1.0000 - val_loss: 0.0143 - val_acc: 1.0000

Epoch 10/10
1/7 [===>..........................] - ETA: 4s - loss: 0.0251 - acc: 1.0000
2/7 [=======>......................] - ETA: 2s - loss: 0.0228 - acc: 1.0000
3/7 [===========>..................] - ETA: 2s - loss: 0.0217 - acc: 1.0000
4/7 [================>.............] - ETA: 1s - loss: 0.0249 - acc: 1.0000
5/7 [====================>.........] - ETA: 1s - loss: 0.0244 - acc: 1.0000
6/7 [========================>.....] - ETA: 0s - loss: 0.0239 - acc: 1.0000
7/7 [==============================] - 9s 1s/step - loss: 0.0290 - acc: 1.0000 - val_loss: 0.0127 - val_acc: 1.0000

DYNAMIC LEARNING_PHASE
[0.012697912137955427, 1.0]

STATIC LEARNING_PHASE = 0
[0.012697912137955427, 1.0]

STATIC LEARNING_PHASE = 1
[0.01744014158844948, 1.0]

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

2.5 কিভাবে প্যাচ একটি বাস্তব ডেটাসেটে কাজ করে?

তাহলে কিভাবে প্যাচ একটি আরো বাস্তবসম্মত পরীক্ষা সঞ্চালন করে? আসুন কেরাসের প্রাক-প্রশিক্ষিত ResNet50 ব্যবহার করি (মূলত ইমেজেনেটে ফিট), শীর্ষ শ্রেণিবিন্যাসের স্তরটি সরিয়ে ফেলুন এবং প্যাচের সাথে এবং ছাড়াই এটিকে সূক্ষ্ম-টিউন করুন এবং ফলাফলের তুলনা করুন। ডেটার জন্য, আমরা CIFAR10 ব্যবহার করব (কেরাস দ্বারা প্রদত্ত স্ট্যান্ডার্ড ট্রেন/টেস্ট স্প্লিট) এবং আমরা ResNet224-এর ইনপুট আকারের সাথে সামঞ্জস্যপূর্ণ করতে ছবিগুলির আকার 224×50 করব৷

আমরা RSMprop ব্যবহার করে শীর্ষ শ্রেণিবিন্যাসের স্তরকে প্রশিক্ষণের জন্য 10টি যুগ করব এবং তারপর SGD(lr=5e-139, ভরবেগ=1) ব্যবহার করে 4তম স্তরের পরে সবকিছু ঠিক করার জন্য আরও 0.9টি করব। প্যাচ ছাড়া আমাদের মডেল 87.44% এর নির্ভুলতা অর্জন করে। প্যাচ ব্যবহার করে, আমরা 92.36% এর নির্ভুলতা পাই, প্রায় 5 পয়েন্ট বেশি।

2.6 আমাদের কি একই ফিক্স অন্যান্য লেয়ার যেমন ড্রপআউটে প্রয়োগ করা উচিত?

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

আমি দৃঢ়ভাবে বিশ্বাস করি যে এই অসঙ্গতি অবশ্যই কেরাসে সমাধান করা উচিত। আমি এই সমস্যার কারণে বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলিতে আরও গভীর প্রভাব (100% থেকে 50% নির্ভুলতা) দেখেছি। আমি পাঠানোর পরিকল্পনা ইতিমধ্যে একটি পাঠানো হয়েছে PR কেরাসের সাথে ফিক্স এবং আশা করি এটি গ্রহণ করা হবে।

আপনি যদি এই ব্লগপোস্টটি পছন্দ করেন, অনুগ্রহ করে এটি Facebook বা Twitter এ শেয়ার করার জন্য একটু সময় নিন। 🙂

সময় স্ট্যাম্প:

থেকে আরো ডেটাবক্স