سلام
توضیحاتش که مشخصه اولی داره وزن ها رو نمایش میده (ویژوالایز میکنه)
دومی هم داره توده ها رو نمایش میده .
در کد اول میشه این کارو کرد چطور کد رو میزنید ؟
- تصاویر ورودی 227 در 227 کراپ میشن. اون کراپ در زمان ترینینگ بصورت رندوم انجام میشه و در زمان تست هم از وسط تصویر انجام میشه.
آپدیت :
من اون نمونه مثال رو اجرا کردم و متوجه شدم چرا خطا میگیرید . اگه خوب دقت کنید میبیند که ورودی اول شما برای اولین لایه فقط سه تا کانال ورودی داره . یعنی همون RGB . برای همین وقتی شما میخوایید وزنهای مروبط به لایه اول رو نمایش بدید چون عمق 3 دارن خیلی راحت قابل انجام هست.
اما وقتی به لایه دوم میرسید دقت کنید که عمق توده ورودی شما دیگه 3 نیست. عمق توده ورودی شما برابر با تعداد فیلترهای لایه قبله . مثلا لایه اول شما 96 فیلتر اگه داشت ورودی لایه دوم شما ( که همون خروجی لایه اول هست!! ) برابر با 96 میشه.
به همین ترتیب وقتی شما این توده رو به تابع matplotlib میفرستید (این تابع تو تابع vis_square فراخونی میشه برای نمایش دادن توده دریافتیش) اون به مشکل میخوره و خطا میده! چون بجای 3 کانال 96 تا میبینه . برای اینکه بتونید ویژوالایز بکنید میتونید مثلا اینطور عمل کنید :
print(filters.shape)
print(filters[0].shape)
print(filters[0,0:3,:,:])
x = filters[0,0:3,:,:]
print (x.shape)
vis_square(x.reshape(-1,3,3,3).transpose(0, 2, 3, 1))
من اینطور نوشتم تا وقتی اجرا میکنید توده ها رو هم ببینید و متوجه بشید چه اتفاقی داره میوفته و ایده بگیرید
نهایتا از خط زیر میتونید خیلی راحت برای نمایش همه فیلترها با هم استفاده کنید :
vis_square(filters[:,0:3,:,:].reshape(-1,3,3,3).transpose(0, 2, 3, 1))
و با افزایش بعد دوم مثلا از filters[:,0:3,:,:]
به filters[:,3:6,:,:]
میتونید بصورت جداگانه به همه وزنهای مربوط به اون 96 یا هرچندتایی که وجود دارن دسترسی پیدا کنید و نمایششون بدید. اول 3 وزن اول بعد 3 وزن بعدی و الی اخر همینطور میتونید پیش برید(میتونید خیلی راحت تو یه حلقه لوپ بندازید و ببینید)