بارگذاری مجموعه داده بزرگ در یادگیری عمیق — راهنمای کاربردی
در این مطلب، روش بارگذاری بارگذاری مجموعه داده بزرگ در یادگیری عمیق مورد بررسی قرار گرفته است. یکی از مهمترین گامها طی فرایند «دادهکاوی» (Data Mining) و «یادگیری ماشین» (Machine Learning)، گردآوری دادهها و ساختاردهی به مجموعه داده است. این مبحث در حوزه «یادگیری عمیق» (Deep Learning) نیز مانند دیگر روشهای یادگیری ماشین مطرح است. قراردادهای گوناگونی برای ذخیرهسازی و ساختاردهی به مجموعه دادههای تصاویر روی دیسک به منظور تسریع و کارا کردن «بارگذاری» (Load) و استفاده از آنها هنگام آموزش و ارزیابی مدلیهای یادگیری عمیق وجود دارد.
مقدمهای بر بارگذاری مجموعه داده بزرگ در یادگیری عمیق
هنگامی که مجموعه داده دارای ساختار باشد، کاربر میتواند از ابزارهایی مانند کلاس ImageDataGenerator در کتابخانه یادگیری عمیق «کرس» (Keras)، برای بارگذاری خودکار مجموعه دادههای «آموزش» (Train)، «تست» (Test Data Set) و «ارزیابی» (Evaluation) استفاده کند.
علاوه بر آن، مولد به تدریج تصاویر موجود در مجموعه داده را بارگذاری میکند و به کاربر این امکان را میدهد تا با مجموعه دادههای کوچک و بسیار بزرگ شامل هزاران یا میلیونها تصویری که در حافظه سیستم ممکن است جا نشوند کار کند. در این مطلب، روش ساختاردهی به یک مجموعه داده تصاویر و بارگذاری تدریجی آن هنگام برازش و ارزیابی یک مدل یادگیری عمیق آموزش داده میشود. محورهای کلی مورد بررسی در این مطلب عبارتند از:
- چگونگی سازماندهی مجموعه دادههای آموزش، تست و اعتبارسنجی حاوی تصاویر در یک ساختار پوشه سازگار
- چگونگی استفاده از کلاس ImageDataGenerator برای بارگذاری تدریجی تصاویر برای یک مجموعه داده موجود
- چگونگی استفاده از مولد داده آماده شده برای آموزش، ارزیابی و انجام پیشبینی با مدل یادگیری عمیق
این آموزش به سه بخش کلی ساختار پوشه مجموعه داده، ساختار مجموعه داده نمونه و چگونگی بارگذاری تدریجی تصاویر تقسیم شده است و مباحث بیان شده در بالا طی این سر فصلها آموزش داده میشوند .
ساختار پوشه مجموعه داده
یک راهکار استاندارد برای طرحریزی دادههای تصویری به منظور مدلسازی وجود دارد. پس از آنکه تصاویر گردآوری شدند، کاربر باید ابتدا آنها را بر اساس مجموعه داده، یعنی مجموعه دادههای آموزش، تست و ارزیابی و سپس، بر اساس «دسته» (Class) تصاویر مرتبسازی کند.
برای مثال، یک مساله «دستهبندی» تصاویر مفروض است که طی آن باید تصاویر خودروها را بر مبنای رنگ آنها (مثلا: خودروی قرمز، خودرو آبی و دیگر موارد) دستهبندی کرد. ابتدا، یک پوشه data/ وجود دارد که کاربر دادههای تصاویر را در آن ذخیرهسازی میکند. سپس، یک پوشه /data/train برای مجموعه داده آموزش و یک پوشه /data/test برای مجموعه داده تست وجود دارد. همچنین، این امکان وجود دارد که یک پوشه /data/validation نیز برای مجموعه داده ارزیابی در طول آموزش وجود داشته باشد. بنابراین، موارد زیر وجود دارند.
1data/
2data/train/
3data/test/
4data/validation/
در هر پوشه مجموعه داده، زیرپوشههایی وجود دارند. در هر پوشه، یک زیر پوشه برای هر کلاس وجود دارد که فایلهای تصاویر در آن قرار دارند. برای مثال، زیرپوشهها به صورت زیر هستند.
1data/
2data/train/
3data/train/red/
4data/train/blue/
5data/test/
6data/test/red/
7data/test/blue/
8data/validation/
9data/validation/red/
10data/validation/blue/
بدین شکل، برای مثال تصاویر خودروهای قرمز در پوشه دسته مناسب قرار میگیرد. برای مثال:
1data/train/red/car01.jpg
2data/train/red/car02.jpg
3data/train/red/car03.jpg
4...
5data/train/blue/car01.jpg
6data/train/blue/car02.jpg
7data/train/blue/car03.jpg
باید به خاطر داشت که فایلهای مشابهی در پوشههای /red و /blue قرار نمیگیرد؛ در عوض در هر یک از این پوشهها، تصاویر متفاوتی به ترتیب از خودروهای قرمز و آبی وجود دارد. همچنین، باید به خاطر داشت که تصاویر متفاوتی در مجموعه دادههای آموزش، تست و اعتبارسنجی وجود دارد. اسامی فایلهای استفاده شده برای تصاویر معمولا اهمیتی ندارد، زیرا همه تصاویر با پسوندهای فایل داده شده فراخوانی میشوند. یک قرارداد خوب برای نامگذاری، در صورتی که امکان تغییر نام فایلها وجود داشته باشد، استفاده از اسامی است که در امتداد آنها اعداد قرار دارند (مثلا دنبالههای ترتیبی از اعداد که با چندین صفر به عنوان پیش شماره شروع میشوند)، برای مثال image0001.jpg. این راهکار در صورتی که هزاران تصویر برای هر دسته وجود داشته باشد، بسیار مناسب است.
ساختار مجموعه داده نمونه
میتوان ساختار مجموعه داده را با یک مثال که در زیر بیان شده، پی ریزی کرد. فرض میشود که کاربر در حال دستهبندی تصاویر خودروها به شیوهای که پیشتر بیان شد است.
به طور مشخص، یک مساله دستهبندی دودویی، یعنی دستهبندی خودروها در دو دسته قرمز و آبی، وجود دارد. باید ساختار پوشهای که در بخش پیشین بیان شد، ساخته شود.
1data/
2data/train/
3data/train/red/
4data/train/blue/
5data/test/
6data/test/red/
7data/test/blue/
8data/validation/
9data/validation/red/
10data/validation/blue/
اکنون، پوشههای مذکور ساخته میشوند. سپس، تعدادی تصویر در هر یک از آنها قرار میگیرد. میتوان از «جستجوی تصاویر کریتیو کامنز» ( Creative Commons Image Search) [+] برای پیدا و دانلود کردن تصاویری با گواهینامههایی که استفاده از آنها را برای مصارف گوناگون مجاز میسازد استفاده کرد. در ادامه، از دو تصویر بیان شده در زیر استفاده شده است.
- تصویر خودرو قرمز از «دنیس ژارویس» (Dennis Jarvis)
- تصویر خودرو آبی از «»ویل اسمیث» (Bill Smith)
تصاویر را باید دانلود و در پوشه کاری جاری ذخیره کرد. خودرو قرمز را باید با نام «red_car_01.jpg» و خودرو آبی را با نام «blue_car_01.jpg» ذخیره کرد. اکنون، باید تصاویر متفاوتی برای هر یک مجموعه دادههای آموزش، تست و اعتبارسنجی داشت. با توجه به آنکه هدف از این مطلب شیوه ساختاردهی و بارگذاری دادهها است و برای دور نشدن از تمرکز اصلی مطلب، از فایلهای تصاویر مشابهی در هر یک از این مجموعه دادهها استفاده میشود. اما، جوری وانمود میشود که گویی آنها با یکدیگر متفاوت هستند.
بنابراین، باید کپیهایی از فایل «red_car_01.jpg» را در پوشههای /data/train/red ،/data/test/red و /data/validation/red قرار دارد. همچنین، باید کپیهایی از فایل «blue_car_01.jpg» را در پوشههای /data/train/blue/ ،data/test/blue و /data/validation/blue قرار داد. اکنون، قالب یک مجموعه داده خیلی پایهای که مشابه با ساختار درختی زیر است، ایجاد شده (ساختار درختی قابل مشاهده در زیر، خروجی دستور tree است).
data ├── test │ ├── blue │ │ └── blue_car_01.jpg │ └── red │ └── red_car_01.jpg ├── train │ ├── blue │ │ └── blue_car_01.jpg │ └── red │ └── red_car_01.jpg └── validation ├── blue │ └── blue_car_01.jpg └── red └── red_car_01.jpg
در ادامه، اسکرینشاتی از ساختار پوشهها ارائه شده است که با استفاده از پنجره Finder در «مکاواس» (macOS) گرفته شده است.
اکنون که ساختار پوشه پایهای وجود دارد، کار بارگذاری دادهها از فایل برای استفاده با مدلسازی مورد استفاده قرار میگیرد.
بارگذاری تدریجی مجموعه داده بزرگ در یادگیری عمیق
این امکان وجود دارد که کدی نوشته شود تا دادهها به صورت دستی بارگذاری شوند و دادههای آماده برای مدلسازی را بازگرداند. این کار شامل ایجاد ساختار برای مجموعه داده، بارگذاری دادههای تصاویر و بازگرداندن ورودی (آرایههای پیکسل) و خروجی (عدد صحیح دسته) میشود. خوشبختانه، نیاز به نوشتن این کد از پایه نیست. بلکه، میتوان از کلاس ImageDataGenerator فراهم شده توسط Keras استفاده کرد.
مزیت اصلی استفاده از این کلاس برای بارگذاری دادهها آن است که تصاویر برای یک مجموعه داده در دستهها بارگذاری میشوند، بدین معنا که میتوان از آن هم برای بارگذاری مجموعه دادههای کوچک و هم مجموعه دادههای تصویری بسیار بزرگ با هزاران یا میلیونها تصویر استفاده کرد.
به جای بارگذاری همه تصاویر در حافظه، تنها تصاویر کافی را میتوان در حافظه برای دستههای کنونی و ریزدستههای احتمالی آینده، هنگام ارزیابی مدل یادگیری عمیق مورد استفاده قرار داد. در این مطلب، به فرایند مذکور بارگذاری تدریجی گفته میشود، زیرا مجموعه داده به تدریج از فایل بارگذاری میشود و فقط میزان دادهای که فورا مورد نیاز است را بازیابی میکند. دو مزیت دیگر استفاده از کلاس ImageDataGenerator، عبارتند از اینکه میتوان از آن برای تغییر مقایسه خودکار مقادیر تصاویر استفاده کرد و همچنین، میتواند به صورت خودکار نسخه کامل شده تصاویر را تولید کرد. این مبحث به بررسی جداگانهای نیاز دارد و از حوصله این بحث خارج است. در ادامه، بر چگونگی استفاده از کلاس ImageDataGenerator برای بارگذاری دادهها از فایل تمرکز میشود. الگوی استفاده از کلاس ImageDataGenerator به صورت زیر است.
- ساخت و پیکربندی یک نمونه از کلاس ImageDataGenerator
- بازیابی یک «تکرارگر» (Iterator) با فراخوانی تابع ()flow_from_directory
- استفاده از تکرارگر در فاز آموزش یا ارزیابی مدل
اکنون، نگاه دقیقتری به هر یک از گامها انداخته میشود. سازنده برای ImageDataGenerator، حاوی آرگومانهای زیادی برای تعیین چگونگی دستکاری دادههای تصاویر پس از بارگذاری آنها، شامل تغییر مقیاس پیکسلها و تکمیل دادهها است. نیاز به هیچ یک از این ویژگیها در این وهله نیست؛ بنابراین، پیکربندی ImageDataGenerator آسان است.
1...
2# create a data generator
3datagen = ImageDataGenerator()
سپس، نیاز به یک تکرارگر برای بارگذاری تدریجی دادهها برای یک مجموعه داده مجرد است. این کار، نیازمند فراخوانی تابع ()flow_from_directory و تعیین پوشه مجموعه داده، مانند test ،train و validation است. تابع همچنین امکان پیکربندی جزئیات بیشتر مرتبط با بارگذاری دادهها را فراهم میکند. توجه به این نکته نیز لازم است که آرگومان «target_size» به کاربر امکان بارگذاری همه تصاویر در اندازه مشخص را میدهد؛ این قابلیت معمولا هنگام مدلسازی مورد نیاز است. پیشفرض تابع روی تصاویر مربعی با اندازه ۲۵۶ در ۲۵۶ است.
تابع همچنین امکان تعیین نوع وظیفه دستهبندی را با استفاده از آرگومان «class_mode» فراهم میکند؛ با این آرگومان میتوان به طور خاص تعیین کرد که نوع دستهبندی «دودویی» (Binary) یا دستهبندی چند دستهای «طبقهای» (Categorical) باشد. «batch_size» به طور پیشفرض برابر با ۳۲ است؛ بدین معنا که ۳۲ تصویر انتخاب شده به صورت تصادفی از سرتاسر کلاسها در مجموعه داده در هر دسته هنگام آموزش بازگردانده میشوند. گاهی ممکن است دستههای بزرگتر و گاه دستههای کوچکتر مورد نیاز باشد. همچنین، ممکن است کاربر بخواهد هنگام ارزیابی مدل دستهها را به ترتیب قطعی باز گرداند که در این صورت، باید «shuffle» روی False تنظیم شود. گزینههای زیاد دیگری نیز وجود دارد که با مطالعه مستندات API کرس میتوان با آنها آشنا شد. میتوان از ImageDataGenerator مشابهی برای آمادهسازی تکرارگرها برای پوشههای جداگانه مجموعه داده استفاده کرد. این کار هنگامی مفید واقع میشود که تغییر مقیاس پیکسل مشابهی روی چندین مجموعه داده (آموزش، تست و اعتبارسنجی) اعمال شود.
1...
2# load and iterate training dataset
3train_it = datagen.flow_from_directory('data/train/', class_mode='binary', batch_size=64)
4# load and iterate validation dataset
5val_it = datagen.flow_from_directory('data/validation/', class_mode='binary', batch_size=64)
6# load and iterate test dataset
7test_it = datagen.flow_from_directory('data/test/', class_mode='binary', batch_size=64)
هنگامی که تکرارگر آماده شد، میتوان از آن هنگام برازش و ارزیابی یک مدل یادگیری عمیق استفاده کرد. برای مثال، برازش یک مدل با مولد داده را میتوان با فراخوانی تابع ()fit_generator روی مدل و پاس دادن تکرارگر آموزش (train_it) کسب کرد. تکرارگر اعتبارسنجی (val_it) هنگام فراخوانی این تابع با آرگومان «validation_data» قابل تعیین است. آرگومان «steps_per_epoch» باید برای آموزش تکرارگر به منظور تعریف اینکه چه تعداد دسته از تصاویر یک «دوره» (epoch) یکتا راتعریف میکند، مورد استفاده قرار میگیرد. برای مثال، اگر ۱۰۰۰ تصویر در مجموعه داده آموزش وجود داشته باشد (در سرتاسر همه دستهها) و اندازه دسته برابر با ۶۴ باشد، steps_per_epoch برابر با ۱۶ یا 1000/64 خواهد بود. به طور مشابه، اگر تکرارگر اعتبارسنجی اعمال شود، آرگومان «validation_steps» باید به منظور تعیین تعداد دستهها در مجموعه داده اعتبارسنجی یک دوره را تعریف کند.
1# define model
2model = ...
3# fit model
4model.fit_generator(train_it, steps_per_epoch=16, validation_data=val_it, validation_steps=8)
هنگامی که مدل برازش داده شد، میتوان روی مجموعه داده تست با استفاده از تابع ()evaluate_generator و پاس دادن آن به تکرارگر تست (test_it) ارزیابی شود. آرگومان «steps» تعداد دستههای نمونه را برای تکرار گام (to step through) هنگام ارزیابی مدل پیش از توقف تعریف میکند.
1...
2# evaluate model
3loss = model.evaluate_generator(test_it, steps=24)
در نهایت، اگر کاربر بخواهد از مدل برازش برای انجام پیشبینی روی مجموعه داده بسیار بزرگ استفاده کند، به همین شکل میتواند تکرارگری برای آن مجموعه داده بسازد (برای مثال predict_it) و تابع ()predict_generator را روی مدل فراخوانی کند.
1...
2# make a prediction
3yhat = model.predict_generator(predict_it, steps=24)
اکنون میتوان از مجموعه داده کوچک تعریف شده در بخش قبلی برای نشان دادن چگونگی تعریف یک نمونه ImageDataGenerator و آمادهسازی تکرارگر مجموعه داده استفاده کرد. مثال کاملی از این مورد، در ادامه آمده است.
1# example of progressively loading images from file
2from keras.preprocessing.image import ImageDataGenerator
3# create generator
4datagen = ImageDataGenerator()
5# prepare an iterators for each dataset
6train_it = datagen.flow_from_directory('data/train/', class_mode='binary')
7val_it = datagen.flow_from_directory('data/validation/', class_mode='binary')
8test_it = datagen.flow_from_directory('data/test/', class_mode='binary')
9# confirm the iterator works
10batchX, batchy = train_it.next()
11print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max()))
با اجرای مثال بالا، ابتدا یک نمونه از ImageDataGenerator با همه پیکربندیهای پیشفرض ساخته میشود. سپس، سه تکرارگر، برابر مجموعه دادههای دستهبندی دودویی آموزش، تست و ارزیابی ساخته میشود. هنگامی که هر تکرارگر ساخته شد، میتوان پیغام دیباگ را که تعداد تصاویر و دستههای کشف و آماده شده را گزارش میکند، مشاهده کرد. در نهایت، تکرارگر آموزش که برای برازش مدل مورد استفاده قرار خواهد گرفت تست میشود. اولین دسته از تصاویر بازیابی میشود و میتوان تصدیق کرد که اندازه دسته حاوی دو تصویر است، زیرا کلا دو تصویر وجود دارد. همچنین، میتوان تایید کرد که تصاویر بارگذاری شدند و ابعاد آنها به ۲۵۶ سطر در ۲۵۶ ستون پیکسل تغییر پیدا کرده و دادههای پیکسل تغییر مقیاس داده نشدهاند و در طیف [۲۵۵, ۰] باقی مانده است.
1Found 2 images belonging to 2 classes.
2Found 2 images belonging to 2 classes.
3Found 2 images belonging to 2 classes.
4Batch shape=(2, 256, 256, 3), min=0.000, max=255.000
جمعبندی
در این مطلب، چگونگی ساختاردهی به یک مجموعه داده تصاویر و بارگذاری تدریجی آن هنگام برازش و ارزیابی یک مدل یادگیری عمیق آموزش داده شد. به طور خاص، چگونگی سازماندهی مجموعه دادههای تصویر آموزش، تست و اعتبارسنجی در یک ساختار پوشه سازگار مورد بررسی قرار گرفت. همچنین، چگونگی استفاده از کلاس ImageDataGenerator برای بارگذاری تدریجی تصاویر برای یک مجموعه داده بیان شد. در نهایت، چگونگی استفاده از یک مولد داده آماده شده برای آموزش، ارزیابی و انجام پیشبینی با یک مدل یادگیری عمیق تشریح شد.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش برنامهنویسی یادگیری عمیق با پایتون (TensorFlow و Keras)
- مجموعه آموزشهای برنامهنویسی پایتون
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- آموزش کتابخانه یادگیری عمیق «کرس» (Keras) در پایتون — راهنمای جامع
- پیادهسازی الگوریتمهای یادگیری ماشین با پایتون و R — به زبان ساده
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
^^