برای اینکه reshape با resize قاطی نشه مفهومش ، اول یه مقدمه بگم که توی reshape مثلا میخوایم یه ماتریس 4x3 رو بکنیم 2x6 یا اینکه یه تنسور سه بعدی با ابعاد 3x4x5 رو ابعادش رو تغییر بدیم به 1x60 (که میشه همون عملیات Flatting یا برداری کردن یه تنسور)
حالا لایه Reshape توی caffe یا کتابخونه های دیگه هم همینکارو انجام میده
مثلا وقتی میخواید همون ماتریس 4x3 رو تغییر بدید به 2x6 می تونید اینطوری بنویسید
reshape_param { shape { dim: 2 dim: ‐1 } }
یعنی اینکه بعد اول ما 2 باشه، بعد دوم رو هم خودش بره حساب بکنه چند میشه(چون تعداد عناصر باید ثابت بمونه حساب کردنش خیلی سادس یعنی ، 4x3 = 2xT که T همون 6 بدست میاد)
این برای کارکرد -1
حالا برای 0، می تونیم این مثال رو بزنیم که فرض میکنیم تنسور 3x4x5 داریم و میخوایم بشه یه ماتریس 3 در یه تعدادی ستون. اگه خودمون باشیم که می دونیم که میشه 3 در 20 اما دوباره میشه اینجا از -1 استفاده کرد
reshape_param { shape { dim: 0 dim: ‐1 } }
این کد میگه که بعد اول رو بذار همون بعد اول ورودی به لایه reshape (یعنی 3) و بعد دوم رو هم خودت حساب کن چند میشه( که میشه 20)
یا اینطوری اگه مثال بزنیم
reshape_param { shape { dim: 0 dim: 2 dim:-1 } }
منظور اینه که بعد اول هرچی هست همون بمونه (3)، بعد دوم بشه 2 و بعد سوم رو هم خودت حساب کن که در نهایت خروجی می شه 3x2x10
مثال خوده Caffe هم اینطوری تفسیر میشه ، بعد اول رو هرچی هست بذار (که چون اینجا ورودی 4 بعدی هست، بعد اول معمولا تعداد دادههای ورودی به شبکه است، یا همون اندازه minibatch توی training یا 1 توی تست شبکه در شرایط واقعی)
بعد دوم بشه 2، بعد سوم بشه 3، و بعد چهارم رو هم بر اساس ابعاد دیگه بدست بیار
مثلا اگه اول کار 10x4x6x3 بوده ، بعد از این لایه میشه 10x2x3x18
منبع:
http://caffe.berkeleyvision.org/tutorial/layers/reshape.html