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

با تشکر

دسته بندی ها

+1 امتیاز

یکی از راه حل های نتیجه خروجی خوب این هست که از روش های نرمال سازی استفاده کنیم ....
اگه امکانش هست میشه بیشتر توضیح بدید اینکه به چه شکل باید ازش استفاده کرد ..... و این که در مطالب مربوط به caffe در سایت به Batch Normalization اشاره شده بود چطور میشه ازش استفاده کرد خودش یه لایه هست ؟ اگه هست بهتر هست بعد کدوم لایه قرار داده بشه ؟

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

1 پاسخ

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

سلام
بچ نورمالیزیشن یه لایه است و بعد از لایه کانولوشن و قبل از لایه nonlinearity مثل relu قرار میگیره
ساده ترین شکل استفاده ازش اینطوریه :

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: "xavier"
    }
  }
}
   
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
  }
  }
    
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "bn1"
  top: "bn1"
}

اما معمولا به اینصورت استفاده میشه (در CAFFE بچ نورمالیزیشن به دو بخش تقسیم شده در حالیکه در مقاله اصلی یکی هست،) و بخش scale بصورت جداگانه پیاده سازی شده. پس پیشفرض اینطور باید استفاده کنید در 99 درصد اوقات:

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: "xavier"
    }
  }
}
   
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
  }
  }
    
layer {
  name: "scale1"
  type: "Scale"
  bottom: "bn1"
  top: "scale1"
  scale_param {
    bias_term: true
  }
}

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "scale1"
  top: "scale1"
}

در حالتی که بهترین کارایی لازم هست میشه اینطور استفاده کرد :

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: "xavier"
    }
  }
}

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
  }
}

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "scale1"
  top: "scale1"
}

نکته :
در ورژن های جدید کفی میتونید بصورت inplace استفاده کنید که بشدت تو مصرف حافظه صرفه جویی میشه. (تو ورژن های قبلی باگهای مختلفی داشت که بعضی مواقع باعث میشد حتی شبکه کانورج نکنه اما الان اکی شده )
کدهای بالا رو بصورت inplace در پایین میبیند (inplace یعنی عملیات روی همون متغییرها انجام میشه و دیگه متغییر جدید ایجاد نمیشه . هر topیی که برای یک لایه مینویسید (با نام متفاوت) یه متغییر جدید هست. اگر bottom و top یکی باشه یعنی عملیات روی همون متغییر انجام(بصورت درجا یا inplace) میشه و نتیجه در همون متغییر به لایه بعد ارسال میشه)

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: "xavier"
    }
  }
}
   
layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "conv1"
  top: "conv1"
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  }
    
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}

اما معمولا به اینصورت استفاده میشه (در CAFFE بچ نورمالیزیشن به دو بخش تقسیم شده در حالیکه در مقاله اصلی یکی هست،) و بخش scale بصورت جداگانه پیاده سازی شده. پس پیشفرض اینطور باید استفاده کنید در 99 درصد اوقات:

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: "xavier"
    }
  }
}
   
layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "conv1"
  top: "conv1"
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  param {
    lr_mult: 0
	 decay_mult: 0
  }
  }
    
layer {
  name: "scale1"
  type: "Scale"
  bottom: "conv1"
  top: "conv1"
  scale_param {
    bias_term: true
  }
}

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}

در حالتی که بهترین کارایی لازم هست میشه اینطور استفاده کرد :

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: "xavier"
    }
  }
}

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "conv1"
  top: "conv1"
  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: "conv1"
  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: "conv1"
  top: "conv1"
  scale_param {
    bias_term: true
  }
}

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
توسط (4.3k امتیاز)
ویرایش شده توسط
سلام. اون پارامتر یعنی از اطلاعات بدست اومده برای نرمالسازی استفاده کن. ما در طی اموزش اطلاعات مورد نیاز برای نرمال سازی رو بدست میاریم. بعد در فاز تست از اون استفاده میکنیم.
بعبارت دقیقتر وقتی که global stat فالس باشه لایه بچ نرمالیزیشن میاد آمار مربوط به mean/variance مربوط به ورودی رو محاسبه میکنه . حالا از این مین /واریانس یادگرفته شده در مرحله اموزش ، ما در زمان تست استفاده میکنیم.
سلام - خیلی ممنون از راهنمایی شما- فقط می خواستم بدونم اگه مثلا 10 لایه کانولوشن و relu داشته باشیم باید بین هر 10 لایه این کد نرمال سازی را قرار بدیم؟ یا فقط لایه اول کانولوشن؟

ممنون
سلام . نه لایه بچ نرمالیزیشن قراره خروجی هر لایه رو نرمالایز بکنه و وقتی تعداد لایه های شبکه زیاد باشه یکی از ضروریاته برای همگرایی بهتر.
...