ভাল প্রশ্ন.
আমি এই ঘটনাটি বেশ কয়েকবার এসেছি। আমার পর্যবেক্ষণগুলি এখানে:
ধীরে ধীরে ধাক্কা
কারণ: বৃহত্তর গ্রেডিয়েন্টগুলি শেখার প্রক্রিয়াটিকে অফ ট্র্যাক করে ফেলেছে।
আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগটি দেখে আপনার প্রতি-পুনরাবৃত্তির লোকসানের মানগুলি লক্ষ্য করা উচিত। আপনি লক্ষ্য করবেন যে ক্ষতিটি পুনরাবৃত্তি থেকে পুনরাবৃত্তির দিকে উল্লেখযোগ্যভাবে বৃদ্ধি পেতে শুরু করে , অবশেষে ক্ষতিটি ভাসমান পয়েন্ট ভেরিয়েবলের দ্বারা প্রতিনিধিত্ব করতে খুব বড় হবে এবং এটি হয়ে যাবে nan।
আপনি কি করতে পারেন কি: কমান base_lrমাত্রার একটি আদেশ দ্বারা (solver.prototxt মধ্যে) (কমপক্ষে)। আপনার যদি বেশ কয়েকটি ক্ষতি স্তর রয়েছে তবে আপনার লগটি পরীক্ষা করে দেখতে হবে যে কোন স্তরটি গ্রেডিয়েন্ট ব্লো আপের জন্য দায়বদ্ধ এবং loss_weightসাধারণের পরিবর্তে সেই নির্দিষ্ট স্তরটির (ট্রেন_ওয়াল.প্রোটটেক্সটে) হ্রাস করতে পারে base_lr।
খারাপ শিক্ষার হার নীতি এবং প্যারাম
কারণ: ক্যাফে একটি বৈধ শেখার হার গণনা করতে ব্যর্থ হয় এবং পায় 'inf'বা 'nan'পরিবর্তে, এই অবৈধ হারটি সমস্ত আপডেটকে গুণিত করে এবং এইভাবে সমস্ত পরামিতিগুলিকে অবৈধ করে দেয়।
আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগটি দেখে আপনার দেখা উচিত যে শিক্ষার হারটি নিজেই হয়ে যায় 'nan', উদাহরণস্বরূপ:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
আপনি কী করতে পারেন: আপনার 'solver.prototxt'ফাইলটিতে শিক্ষার হারকে প্রভাবিত করে সমস্ত পরামিতি ঠিক করুন।
উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন lr_policy: "poly"এবং আপনি max_iterপ্যারামিটার সংজ্ঞা দিতে ভুলে যান তবে আপনি শেষ করবেন lr = nan...
ক্যাফেতে শিক্ষার হার সম্পর্কে আরও তথ্যের জন্য, এই থ্রেডটি দেখুন ।
ত্রুটিযুক্ত ক্ষতি ফাংশন
কারণ: কখনও কখনও ক্ষতির স্তরগুলিতে ক্ষতির গণনাগুলি nanউপস্থিত হওয়ার কারণ হয়। উদাহরণস্বরূপ, InfogainLossঅ-নর্মালাইজড মান সহ লেয়ারকে খাওয়ানো , বাগগুলি সহ কাস্টম লস লেয়ার ব্যবহার করে etc.
আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগের দিকে তাকালে আপনি সম্ভবত অস্বাভাবিক কিছু দেখতে পাবেন না: ক্ষতি ধীরে ধীরে হ্রাস পাচ্ছে এবং হঠাৎ হঠাৎ nanউপস্থিত হবে।
আপনি কী করতে পারেন: দেখুন আপনি ত্রুটিটি পুনরুত্পাদন করতে পারেন, ক্ষতি স্তরটিতে প্রিন্ট আউট যুক্ত করতে এবং ত্রুটিটি ডিবাগ করতে পারেন।
উদাহরণস্বরূপ: একবার আমি কোনও ব্যাচের লেবেল উপস্থিতির ফ্রিকোয়েন্সি দ্বারা পেনাল্টিকে সাধারণীকরণের ক্ষতি ব্যবহার করেছিলাম। এটি ঠিক তাই ঘটেছিল যে কোনও প্রশিক্ষণ লেবেল যদি ব্যাচে মোটেও হাজির না হন - লোকসানের পরিমাণ গণনা করা nan। সেক্ষেত্রে এই ত্রুটিটি এড়াতে যথেষ্ট পর্যাপ্ত বড় ব্যাচ (সেটে লেবেলের সংখ্যার সাথে সম্মতি রেখে) কাজ করা যথেষ্ট ছিল।
ত্রুটিযুক্ত ইনপুট
কারণ:nan এটিতে আপনার একটি ইনপুট রয়েছে !
আপনার কী প্রত্যাশা করা উচিত: একবার শেখার প্রক্রিয়াটি "হিট" করে এই ত্রুটিযুক্ত ইনপুট - আউটপুট হয়ে যায় nan। রানটাইম লগটি দেখে আপনি সম্ভবত অস্বাভাবিক কিছু দেখতে পাবেন না: ধীরে ধীরে লোকসান হ্রাস পাচ্ছে এবং হঠাৎ হঠাৎ করেই nanউপস্থিত হবে।
আপনি কী করতে পারেন: আপনার ইনপুট ডেটাসেটগুলি পুনরায় তৈরি করুন (lmdb / leveldn / hdf5 ...) আপনার প্রশিক্ষণ / বৈধতা সেটটিতে খারাপ চিত্র ফাইল নেই তা নিশ্চিত করুন make ডিবাগের জন্য আপনি একটি সহজ নেট তৈরি করতে পারেন যা ইনপুট স্তরটি পড়ে, তার উপরে একটি ডামি ক্ষতি রয়েছে এবং সমস্ত ইনপুটগুলি দিয়ে চলে: যদি তাদের মধ্যে কোনওটি ত্রুটিযুক্ত থাকে তবে এই ডামি নেটও তৈরি করা উচিত nan।
"Pooling"স্তরে কার্নেলের আকারের চেয়ে বড় স্ট্রাইড
কোনও কারণে, পুলিংয়ের জন্য stride> নির্বাচন করা kernel_sizeফলাফলগুলি এর সাথে ফলাফল দিতে পারে nan। উদাহরণ স্বরূপ:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
সঙ্গে ফলাফল nanমধ্যে গুলি y।
মধ্যে অক্ষমতা "BatchNorm"
এটি প্রতিবেদন করা হয়েছিল যে কয়েকটি সেটিংসের অধীনে সংখ্যার অস্থিরতার কারণে "BatchNorm"স্তর আউটপুট nanগুলি করে।
এই সমস্যাটি বিভিএলসি / ক্যাফেতে উত্থাপিত হয়েছিল এবং PR # 5136 এটি সংশোধন করার চেষ্টা করছে।
সম্প্রতি, আমি সচেতন হয়ে ওঠে debug_infoপতাকা: সেটিং debug_info: trueমধ্যে 'solver.prototxt'প্রশিক্ষণের সময় আরো ডিবাগ তথ্য (গ্রেডিয়েন্ট মাত্রার এবং অ্যাক্টিভেশন মান সহ) লগ ইন করার Caffe মুদ্রণ করতে হবে: এই তথ্য সম্পর্কে জানতে পারবেন প্রশিক্ষণ প্রক্রিয়ায় গ্রেডিয়েন্ট blowups এবং অন্যান্য সমস্যা spotting সাহায্য ।