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

با تشکر

دسته بندی ها

+1 امتیاز

فرض کنید یک مدل caffe از پیش اموزش داده شده داشته باشیم. مانند googleNet ‌یا alexNet‌.
ایا می توان نام لایه ها را بدون ایجاد هیچ تغییری در پارامتر ها و وزن های مدل تغییر داد؟
به عنوان مثال conv1 تبدیل بشه به conv1_modified

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

3 پاسخ

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

سلام. می تونید از pycaffe استفاده کنید و در شبکه تغییرات دلخواه را انجام بدین و در نهایت با استفاده از Net.Save() اون رو ذخیره کنید. این مثال رو ببینید:
http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb

توسط (535 امتیاز)
انتخاب شده توسط
+1 امتیاز

name لایه ها رو میتونید تغییر بدید اما اسم top یا bottom لایه ها رو نمیتونید تغییر بدید چون مدل ترین شده (فایل caffemofel) دیگه نمیتونه لایه ها رو شناسایی کنه
البته شاید یه راهی باشه و اون اینکه مدل رو با caffe در پایتون (و یا متلب) باز کنید و top و bottom اش رو تغییر بدید و سپس مدل (فایل caffemodel) رو از اول save کنید

توسط (145 امتیاز)
0 امتیاز

سلام
بله تا زمانی که تنها چیزی که تغییر میدید نام لایه باشه بله هیچ مشکلی ندارید
در زمان لود وزن ها اتفاقی که می افته اینه که نام لایه ها چک میشه هر نام لایه ای در مدل از پیش ذخیره شما وجود داشته باشه وزنها و اطلاعات مربوطه لود میشن. اگر نامی وجود نداشته باشه بصورت رندوم مقدار دهی میشه (بر اساس الگوریتم و پارامتری که برای اون لایه مشخص شده)
برای اینکار هم باید از سویچ weights استفاده کنید بصورت زیر

caffe.exe  train --solver=solver.prototxt --weights=model.caffemodel   

زمانی هم که نام لایه رو تغییر میدید باید top_blob اون رو هم تغییر بدید که بدیهی هست .

layer {
  name: "conv1_"
  type: "Convolution"
  bottom: "data"
  top: "conv1_"
  param {
    lr_mult: 1
  }
  convolution_param {
    num_output: 64
    pad: 1
    kernel_size: 3
    stride: 1
    bias_term: true
    weight_filler {
      type: "msra"
    }
  }
}

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "conv1_"
  top: "bn1"
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
    include {
    phase: TRAIN
  }
    batch_norm_param {
    use_global_stats: false
    moving_average_fraction: 0.95
  }
}
layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "conv1_"
  top: "bn1"
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
    include {
    phase: TEST
  }
    batch_norm_param {
    use_global_stats: true
    moving_average_fraction: 0.95
  }
}
layer {
  name: "scale1"
  type: "Scale"
  bottom: "bn1"
  top: "scale1"
  scale_param {
    bias_term: true
  }
  
}

مثلا در این مثال من میخوام لایه اول رو تغییر نام بدم. تنها کاری که کردم اینه که نام لایه اول و نام بلاب خروجی تغییر داده شد. نیازی به تغییر دیگه ای نیست.

توسط (4.3k امتیاز)
ممنون از پاسختون ولی مساله ای که وجود داره اینه که  الان با تغییر نام این لایه در فایل prototxt و لود کردن مدل  از قبل اموزش داده شده ؛ چون این نام این لایه  وجود نداره وزن های تصادفی جایگزین وزن های اموزش داده شده میشن. کاری که من میخواهم بکنم اینه که نام لایه ها رو عوض کنم بدون این که وزن ها تغییر پیدا کنن.
دلیل این کارتون چیه؟ هیچ توجیه منطقی به نظر من نمیرسه برای اینکار.
به هر حال شما میتونید با استفاده از برنامه نویسی وزنها رو هرطور که میخوایید منتقل کنید.لینک زیر رو ببینید توابعی که CopyTrainedLayersFrom دارن بدرد شما میخورن.
https://github.com/BVLC/caffe/blob/3e94c0ee444f9e5461c8a81e4b90b3e51cacf63d/src/caffe/net.cpp
مجددا ممنون از پاسختون. دلیل این کار پیاده سازی یه سیستم two stream‌هست که هر دو در قسمت ابتدایی از یک شبکه ی واحد استفاده کرده اند. و هر دو شبکه به صورت موازی  و مستقل کار میکنند.
...