تولیدکننده داده Keras
آموزش‌های پایه‌ای هوش مصنوعیآموزش‌های پیشرفته هوش مصنوعیبینایی ماشینچالش‌های عملیاتیکتابخانه‌ های یادگیری عمیقیادگیری با نظارتیادگیری عمیق

ساخت یک تولیدکننده داده Keras برای ایجاد توالی‌ از فریم‌های ویدئویی و انجام تحلیل زمانی با استفاده از RNN

    0

    انواع تولیدکننده داده Keras برای RNN
    مدل‌های یادگیری عمیق برای آموزش به حجم بالایی از داده‌ها نیاز دارند و به دلیل پیچیدگی‌های حافظه Space complexitites عملکرد ضعیفی دارند. تولید‌کننده‌های داده برای رفع این مشکل،  به جای این‌که دیتاست را در حافظه ذخیره کند، داده‌ها را در بسته تولید می‌کنند. در این حالت کاربر می‌تواند استفاده بهینه‌ای از حافظه داشته باشد و علاوه بر آن مانع آن می‌شود که کامپایلر خطای “out-of-memory’ را نمایش دهد. شبکه‌های عصبی بازگشتی Recurrent Neural Networks (RNNs) به شبکه‌های عصبی گفته می‌شود که دارای حافظه هستند و می‌‌توانند با داده‌های زمانی Temporal data کار کنند و با استفاده از آن‌ها می‌توان روابط زمانی میان فریم‌های ویدئویی را مشخص کرد. در RNNها (در اینجا، LSTM) ، اغلب داده‌های تصویری باید در قالب “batches×timesteps× image_dimension” ساخته شوند. منظور از timesteps توالی فریم‌هایی است که از تک تک واحدهای بازگشتی Recurrent unit عبور می‌کنند و سعی می‌کنند پیش از رسیدن به توالی بعدی، اطلاعات میان آن‌ها را یاد بگیرند. در این مقاله سعی داریم نحوه پیاده‌سازی تولید‌کننده داده Keras / TensorFlow را توضیح دهیم و با استفاده از آن‌ها داده‌هایی با فرمت‌هایی تولید کنیم که RNNها می‌توانند با آن‌ها کار کنند.

    تولیدکننده داده Keras و پیاده‌سازی تولیدکننده در پایتون با یکدیگر تفاوت دارند اما کاربران معمولاً متوجه تفاوت‌های میان این دو نمی‌شوند. کد از هر دوی آن‌ها استفاده می‌کند. تولید‌کننده‌ها در پایتون، توابع تکرارپذیری هستند که مقادیری “yield”(تولید) می‌کند و با استفاده از دستور loop می‌توان آن‌ها را تکرار کرد. تولید‌کننده داده keras می‌توانند همانند تولیدکننده پایتون، بسته‌هایی از داده‌ تولید کند. تفاوتی که در این دو تولید‌کننده با هم دارند در نحوه دستیابی به آن است. این دو تولیدکننده از کلاس Sequence ارث می‌برند و می‌توانند داده‌ها را همزمان در چندین هسته بارگذاری کنند و بدین وسیله مدت زمان آموزش را کاهش دهند.

    فرایند تولید توالی‌ فریم‌ها در بسته‌ در دو مرحله اتفاق می‌افتد:

    • ساختار داده‌ها به صورت توالی
    • تغذیه داده‌ها به تولید‌کننده

    برای آن‌که داده‌ها به آسانی به تولید‌کننده تغذیه شوند، باید داده‌های آموزشی و اعتبارسنجی را در دو پوشه جداگانه قرار دهیم و از این طریق دو تولید‌کننده مجزا برای آن‌ها بسازیم. هر یک از این پوشه‌ها شامل پوشه‌های مختلف برای کلاس‌های مختلف خواهند بود ( در صورتی‌که قصد داریم فرایند دسته‌بندی را انجام دهیم). من قبلاً ویدئوها را به فریم‌ تبدیل کرده‌ام و آن‌ها را در کلاس‌های مناسب قرار داده‌ام ( من فریم‌ها را شماره‌گذاری کردم، این کار به من کمک کرد که مطمئن شوم به ترتیب ذخیره‌ شده‌اند). اگر فرض کنیم داده‌های من شامل دو کلاس A و B هستند، ظاهر پوشه این‌گونه خواهد بود:

    ابتدا برای هر فایل ویدئویی یک دیکشنری ایجاد کردم و برای هر فایل اسم و برچسب مناسب انتخاب کردم. سپس دیکشنری را به دیتافریم پاندا تبدیل کردم و آن را در قالب فایل .csv در یک پوشه جداگانه برای داده‌های آموزشی و داده‌های اعتبارسنجی ذخیره کردم.

    d_type مشخص می‌کند ورودی تابع داده‌های آموزشی است یا داده‌های اعتبارسنجی. پوشه فایل .csv اینگونه خواهد بود:

    ‘filegenerator’ ، تابع تولید‌کننده پایتون، فایل‌های .csv را قبول می‌کند و تعداد توالی‌های مورد نیاز (طول زمانی) و گام زمانی را به عنوان پارامتر‌های خود دریافت می‌کند.

    تابع در طول مسیرهای فایل ذخیره‌شده در فایل‌های .csv نمونه‌برداری می‌کند و بر مبنای طول زمانی تعریف‌شده و گام، توالی‌ای از فریم‌ها ایجاد می‌کند. سپس می‌توان برای ایجاد فریم‌ها به صورت توالی ، این تابع را در حلقه Loop تکرار کرد. کدی که در این مقاله معرفی شده به من در ایجاد فایل‌های .csv و تغذیه آن‌ها به تولید‌کننده پایتون برای آموزش مدل یادگیری عمیق کمک کرد.

    تابع ‘seq_of_frames’ فهرستی از مسیرهای توالی فریم و برچسب‌های مربوطه باز می‌گرداند. سپس این فهرست به یک دیتافریم پاندا تبدیل می‌شود و تولید‌کننده Keras از شاخص‌های آن برای استخراج داده‌های موجود در بسته‌ها استفاده می‌کند.

    در سندی که در TensorFlow قرار داده شده تمامی کلاس‌های ‘Sequence’ برای پیاده‌سازی متد __len__() و __getitem__(index) ارائه شده است.

    من کلاس DataGenerator را فراخوانی کردم و این کلاس از کلاس Sequence ارث می‌برد. البته من مدل‌ام را در TensorFlow ساخته‌ام و به همین دلیل از پیاده‌سازی Sequence آن استفاده کردم و می‌توان آن را از tensorflow.python.keras.utils.data_utils بارگذاری کرد. پیاده‌سازی Keras آن را می‌توانید از tf.keras.utils بارگذاری کنید. جابه‌جا کردن پیاده‌سازی Sequence میان این دو منجر به خطای Data Adaptor می‌شود.

    منظور از آرگمان ‘data’ دیتافریم‌هایی است که شامل مسیرهای توالی فریم و برچسب‌های مربوطه به عنوان ویژگی‌ها هستند. ‘self,list_IDs’ فهرستی از تمامی شاخص‌های داده‌ است و متد __getitem__() از آن برای بارگذاری داده‌ها در بسته‌ها استفاده می‌کند.

    متد on_epoch_end() یک بار در آغاز و پایان تک تک دوره‌های چرخه آموزش اجرا می‌شود.  این متد اغلب شاخصی به هم‌ریخته از داده بر می‌گرداند.

    از متد __len__() برای به دست آوردن تعداد کل بسته‌های موجود در داده‌ها استفاده می‌شود.

    متد __getitem__(index) موقعیتی به نام ‘index’ را به عنوان آرگمان خود می‌گیرد و آن را با اندازه بسته‌های داده‌ای Batch size
    ادغام می‌کند تا بسته‌ای داده از همان موقعیت بازگرداند.

    متد __data__generation() فهرستی موقتی از شاخص‌ها به عنوان آرگمان خود می‌گیرد و برای دسترسی به فهرست فریم‌های مربوطه و برچسب‌های آن‌ها ، از آرگمان خود برای شاخص‌گذاری کردن دیتافریم استفاده می‌کند. سپس فریم‌ها با استفاده از OpenCV خوانده می‌شوند و به عنوان آرایه‌ای از فریم‌ها ذخیره می‌شوند. من از خودرمزنگارها استفاده کردم، به همین دلیل تابعی اضافه کردم که در صورت نیاز، همان توالی از فریم‌ها را به عنوان برچسب باز می‌گرداند. کل کلاس اینگونه خواهد بود:

    و در آخر باید پارامترها را برای DataGenerator مشخص کنید و از آن برای ساخت نمونه‌های آموزشی و اعتبارسنجی استفاده کنید.

    پس از آن‌که مدل RNN تعریف شد می‌توانیم تولید‌کننده‌ها را برای آموزش مدل، به تابع fit_generator مدل تغذیه کنیم. از آنجایی‌که تولید‌کننده از کلاس Sequence ارث می‌برد، می‌توانیم پردازش چندگانه انجام دهیم و به منظور تسریع فرایند آموزش تعداد workers را مشخص می‌کنیم.

     

    ترندهای هوش مصنوعی در سال ۲۰۲۱ را بشناسید

    مقاله قبلی

    وب سرویس های آمازون یا مایکروسافت آژور و یا سکوی ابری گوگل؟ گواهینامه کدام دوره بهتر است؟

    مقاله بعدی

    شما همچنین ممکن است دوست داشته باشید

    نظرات

    پاسخ دهید

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *