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

با تشکر

دسته بندی ها

0 امتیاز

سلام
میخوام از شبکه ی زیر خروجی بگیرم یعنی یه تصویر بدم و مقدار فشرده شده ی لایه ی پنهان رو استخراج کنم و اون مقادیر رو در یک شبکه ی دیگه استفاده کنم

input_img = Input(shape=(width, height, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(5, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same',name='encod')(x)



# at this point the representation is (7, 7, 32)
x = Conv2D(5, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)

x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)


x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

# Build the model
model = Model(input_img, decoded)

1- خروجی کدوم لایه رو بردارم (که محتوای کل تصویر رو در خودش داشته باشه، یعنی با اون بشه تصویر رو بازسازی کرد و دونستن اون فرقی با تصویر نمیکنه)، خروجی لایه ی encoded؟

2- وزن های اون لایه مهم هستن یا خروجی که با predict میده یا بایاس یا ... ؟اگر امکان داره نحوه ی خروجی گرفتنش رو بفرمایید(خروجی لایه ای که با اون میشه کل تصویر رو بازسازی کرد میخوام)

3- آیا اینکه خروجی لایه ی پنهان میانی رو بگیری و بدی به یک شبکه ی دیگه به عنوان ویژگی، اون شبکه ی دوم میتونه از این ویژگی ها استفاده کنه به جای تصویر؟ یعنی این ویژگی ها اگر خطای اتوانکودر کم باشه میتونن جای تصویر رو به طور کامل بگیرن تو شبکه ی دوم؟

توسط (208 امتیاز)

2 پاسخ

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

سلام
1- معمولش به این صورته که از همون خروجی لایه encoded استفاده کنید
اما نکته ای که باید بهش توجه کنید اینه که به هیچ وجه همچین موضوعی گارانتی نیست که تمامی اطلاعات تصویر داخل ویژگیهایی باشه که استخراج می کنید
برای نمونه فقط به لایه max pooling که دقت کنید می بینید که بعضی اطلاعات حفظ و بعضی حذف می شن، نتیجیتا در حالت عام نمیشه گفت که ویژگی هایی که از لایه encoded بدست میارید اطلاعات فشرده شده تصویر رو دارن، اما نه لزوما همه اطلاعات رو
برای همین توی این قسمت باید یه چیزی رو خیلی خوب مشخص کنید و اون هدف مساله اس. برای مثال ممکنه بخواید که یه الگوریتم فشرده سازی lossless پیاده کنید که باید همه اطلاعات حفظ بشه. در این صورت، استفاده از ویژگی های انکودر روشی نیست که خیلی روش حساب کنید، حداقل به طور محض
اما ممکنه بحث مقایسه بین محتوای بین 2 تا تصویر باشه، در این حالت اصلا لازم نیست جز جز تصویر رو ذخیره کنید و ویژگی های بدست اومده از انکودر می تونه خیلی کمکتون کنه

2- برای گرفتن خروجی شما وزنها رو نیاز دارید اما اگه از دید مساله ای که دارید حل می کنید نگاه کنید، مهم ویژگی هایی هست که از انکودر بدست میارید

3- کاملا بستگی به مساله داره اما این کار کاملا امکان پذیره و اتفاقا بعضا توی مقالات هم این کارا رو انجام دادن. اگه اشتباه نکنم چند تا نمونش رو توی کارهای پزشکی دیده بودم که ویژگی های تصویر رو از طریق انکودر بدست می اوردن و بعدش ویژگی ها رو داده بودن به شبکه دیپ دیگه که مثلا تشخیص بده که نوع بیماری چیه
اما چون درست حسابی یه ablation test نکرده بودن که این کار چقدر تاثیر داره، نمیدونم برای افزایش حجم کار و مقاله این کارو کرده بودن یا اینکه واقعا این حرکت تاثیر داشته در دقت نهایی
چون در تئوری شما می تونید این 2 تا کار رو ترکیب کنید و به جای ترین یه شبکه auto encoder و بعدا یه شبکه دیگه روی ویژگی های انکودر، یه شبکه بزرگ درست کنید اما اگه نیازه loss ه بازسازی یا reconstruction که توی autoencoder هست رو هم به training اضافه کنید
این ایده مثلا توی مقاله capsule net یا اگه اشتباه نکنم توی شبکه های plug and play استفاده شده بود

این پست از خوده keras هم خیلی می تونه کمک کنه:

https://blog.keras.io/building-autoencoders-in-keras.html

این بحث توی github رو هم دنبال کنید، اواسط صفحه یه کد تقریبا کامل از آموزش یه autoencoder و بعدش استفاده از لایه میانی برای یه classification هست

https://github.com/keras-team/keras/issues/358

در نهایت هم می تونید وزن شبکه autoencoder خودتون رو ذخیره کنید، هر موقع نیاز شد فقط لایه هایی که نیازه روی لود کنید (مثلا با دادن پارامتر by_name توی تابع لود وزنها) یا اینکه کل شبکه رو لود کنید اما فقط از همون لایه ها میانی خروجی بگیرید
البته حواستون باشه که اگه لایه وسطی رو وصل کردید به یه مدل دیگه، اگه نمی خواید که لایه های انکودر تغییر کنن توی training مدل دوم، وزنهای انکودر رو فریز کنید

توسط (1.6k امتیاز)
انتخاب شده توسط
سلام
ممنون از پاسخ کاملتون
یه سوال تو لینک زیر
https://blog.keras.io/building-autoencoders-in-keras.html
مدل زیر
encoder = Model(input_img, encoded)
نیاز به کامپایل و ترین نداره ؟
این مدلی که استفاده کرده باعث میشه autoencoder آموزش ببینه و وزن ها به مدل encoder هم انتقال پیدا میکنه ؟

من به این خاطر اتوانکودر میزنم که بتونم ویژگی تصویر رو دربیارم و بعد خروجی لایه ی انکودر رو به همراه یه داده ی عددی دیگه که دارم(تصویر نیست) بدم به یه شبکه ی دیگه که هم از تصویر و هم از داده استفاده کنه و دسته بندی انجام بده به نظرتون درسته ؟
خواهش میکنم
توی این قسمت نیازی به compile نیست، چون اونجایی که autoencoder.compile داره و بعدش آموزش میده، وزنهای encoder و decoder هم آموزش داده میشه
بعدش شما فقط از قسمت encoder استفاده می کنید. برای همینه اینجا جداگانه یه مدل براش در نظر گرفته که بعد که آموزش autoencoder تموم شد، تصویر بده به encoder و خروجی بگیره
به طور کلی هم شما وقتی فقط می خواید predict رو صدا بزنید نیازی به کامپایل مدل نیست، اما برای evaluate یا آموزش، نیازه که مدل با چیزهایی مثل optimizer و metrics و .... کامپایل شده باشه

ایده ترکیب این ویژگی ها با ورودی های دیگه هم ایده خوبیه، هرچند که در تئوری میشه بگید از همون اول شبکه رو جوری بچینیم که هر دو تا ورودی با هم وارد شبکه بشه، اما با این حال اگه خودم هم قرار بود همچین کاری بکنم احتمالا اول همین حرکت استفاده از autoencoder برای یه دست کردن ویژگیها(همه چیز بشه بردار عددی) رو تست می کردم
+1 امتیاز

باسلام
بله باید از خروجی لایه "انکدد" استفاده کنید.
خروجی خود همین لایه از تصویر ورودی شما مقدار فشرده شده ای تصویر است.
نحوه خروجی گرفتم هم ساده است، شما ورودی تصویر را که به شبکه می دهید، همین متغییر انکدد خروجی فشرده شده تصویر یا اصطلاحا representation از تصویر شماست.

این شبکه اتوانکدر است و مقدار لایه انکدد را به ادامه شبکه که مید هید از روی مقادیر انکدد تصویر اصلی را می سازد، برای شبکه دیگر کاملا بستگی به طراحی شما دارد.

توسط (105 امتیاز)
سلام
چطور قسمت دوم شبکه رو بعد آموزش حذف کنم که خروجی لایه اتوانکد رو بگیرم ؟
خروجی لایه ی اتوانکد رو اگر بدم به یه روش دیگه مثل svm یا درخت تصمیم براش قابل فهم هست  ؟
...