به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

با سلام عرض ادب
دوستان کسی تا حالا با sharding data کار کرده ؟ این برای دیتاهای بزرگ بکار میرود یعنی میان دیتا رو تیکه تیکه میکنند
چندتا سوال داشتم ممنون میشم راهنماییم کنید
-# وقتی دیتایی بزرگ مثله امیج نت یا هر دیتای بزرگ دیگه ایی در دسترس داریم و برای ترین یک شبکه استفاده میکنیم فرضا این دیتا به tfrecord یا lmdb هم تبدیل شده است. وقتی این دیتا رو یک shard در در نظر بگیریم موقع فراخوانی این دیتابیس همه شون در رم سیستم قرار میگیرند یا اینکه فقط به میزان بچ سایز در رم سیستم قرار میگیرد ؟ اگر اره ، چجوری ؟ پس بقیه اون دیتابیس کجا لود میشوند ؟ مگه اینطوری نیست که کل اون تک shard در رم سیستم قرار میگیرد و cpu به میزان اون بچ سایز از اون دیتاست fetch میکند و به GPU برای ترین شبکه میدهد ؟

همانطور که میدانید یکی از کارهای بدی که موقع ترین صورت میگیرد در صف انتظار موندن GPU برای اینکه CPU بهش داده رو اماده کنه این باعث میشه سرعت تریننیگ شبکه رو کند کنه برای رفع این مشکل بحث multi-processing هست بنظرتون شما این FLAG ها میتونه کارساز باشه و اینکه چجوری میشه تنظیمشون کرد برای کارهای خودمون

tf.app.flags.DEFINE_integer('batch_size', 32,
                            """Number of images to process in a batch.""")
tf.app.flags.DEFINE_integer('image_size', 299,
                            """Provide square images of this size.""")
tf.app.flags.DEFINE_integer('num_preprocess_threads', 4,
                            """Number of preprocessing threads per tower. """
                            """Please make this a multiple of 4.""")
tf.app.flags.DEFINE_integer('num_readers', 4,
                            """Number of parallel readers during train.""")

# Images are preprocessed asynchronously using multiple threads specified by
# --num_preprocss_threads and the resulting processed images are stored in a
# random shuffling queue. The shuffling queue dequeues --batch_size images
# for processing on a given Inception tower. A larger shuffling queue guarantees
# better mixing across examples within a batch and results in slightly higher
# predictive performance in a trained model. Empirically,
# --input_queue_memory_factor=16 works well. A value of 16 implies a queue size
# of 1024*16 images. Assuming RGB 299x299 images, this implies a queue size of
# 16GB. If the machine is memory limited, then decrease this factor to
# decrease the CPU memory footprint, accordingly.
tf.app.flags.DEFINE_integer('input_queue_memory_factor', 16,
                            """Size of the queue of preprocessed images. """
                            """Default is ideal but try smaller values, e.g. """
                            """4, 2 or 1, if host memory is constrained. See """
                            """comments in code for more details.""")
توسط (389 امتیاز)
ویرایش شده توسط

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام
وقتی دیتاست بزرگ هستش نمیشه همه رو وارد رم gpu‌ و یا حتی رم cpu کرد. برای حل این مسله یه صف تعریف میشه. و دیتا از روی هارد (بهتره SSD باشه) خونده میشه و وارد رم کامپیوتر میشه و باصطلاح وارد صف میشه بعد به اندازه بچ وارد رم gpu‌ میشه.
برای دیتاست های تصویر تو تنسورفلو از tf.contrib.data.Dataset دیتاست درست میشه. بنده هم دارم به همین روش یه کد مینویسم و امروز یا فردا تو گیت خودم میزارم. ولی اگه دیتاستتون به صورت فایل باشه مثلا یه mat‌ فایل با حجم بالا ابتدا بایستی به tfrecord‌ تبدیل بشه و بعد یه صف تعریف بشه و از فایل tfrecord‌ که روی هارد هستش خونده بشه و به رم کامپیوتر منتقل بشه (وارد صف بشه) و از رم کامپیوتر به رم GPU وارد بشه. یه نمونه از کد شو بنده تو گیت هابم گذاشتم.

توسط (830 امتیاز)
انتخاب شده توسط
کدی که شما آدرس دادید دیتا رو به tfrecord‌ تبدیل می کنه که کاملترش تو گیت بنده هشتش


کد تبدیل دیتاست به tfrecord
https://github.com/m-nasiri/tensorflow/tree/master/tfrecord
کد آموزش شبکه رو استفاده از فایل tfrecord  که موازی بودن توش رعایت شده.
https://github.com/m-nasiri/tensorflow/tree/master/shape_conv_net_using_tfrecord


کد خواندن مستقیم دیتاست تصوریر بدون تبدیل به tfrecord  (موازی بودن توش رعایت شده)   
https://github.com/m-nasiri/tensorflow/tree/master/reading_image_dataset

کد آموزش یک شبکه با استفاده از خوندن مستقیم دیتاست که موازی بودن توش رعایت شده تو چند روز‌ آینده میزارم.
متشکر
بنظرتون تو سرعت ترین با tfrecord بهتره یا اینکه مستقیم خوندن از دیتاست ؟
سوال دیگه : بنظرتون چجوری میشه این فایل هایی که شما گفتید رو برای مثلا شبکه های inception استفاده کرد ؟ اینجا خودتون تابع معماری شبکه رو تعریف کردید ولی اونجا چجوری میشه اینکا رو کرد ؟ و اینها رو به کدهای تنسورفلوی اونها اضافی کرد؟ بخصوص TF-SLIM
و اینکه چرا از png استفاده میکنید برای تصاویر
تو اینجا
http://qa.deeplearning.ir/4705/sharding-data?show=4713#c4713
براتون توضیح دادم که چرا tfrecord بهتره البته اگه شرایط اجازه بده برای این کار.

بنده معماری inception رو مطالعه نکردم ولی شما باید دیتای ورودی رو مطابق با inception قرار بدید بعد مثلا تو فایل tfrecord   ذخیره کنید و بعد از فایل بخونید و شبکه رو آموزش بدید.

فرقی نداره شما از فرمت های دیگه استفاده کنید. مشکلی پیش نمیاد.

اینم برنامه ای برای خوندن دیتاست تصویر بطور موازی و آموزش یک شبکه با این روش + ذخیره مدل  + نمایش برخی پارامترها در tensorboard
https://github.com/m-nasiri/tensorflow/tree/master/symbol_texture_image_conv_net/

موفق باشید.
...