یادگیری انتقالی(Transfer learning)
آموزش مدل های شبکه عصبی عمیق بر روی مجموعه داده های بسیار بزرگ ممکن است روزها یا حتی هفته ها طول بکشد. برای کوتاه کردن این فرآیند می توان از وزن مدل های از پیش آموزش دیده مجدد استفاده کرد.
یادگیری انتقال چیست؟
یادگیری انتقال به طور کلی به فرایندی اطلاق می شود که از دانشی که در یک مسئله به دست آمده.برای بهبود تعمیمپذیری در مسئلهای دیگر استفاده شود.
در یادگیری عمیق، یادگیری انتقالی تکنیکی است که یک مدل شبکه عصبی بر روی مسئله ای مشابه با مشکلی که در حال حل شدن است آموزش داده می شود. سپس یک یا چند لایه از مدل آموزش دیده، در یک مدل جدید بر روی مسئله دیگری استفاده می شود.
این معمولاً در یک زمینه یادگیری با نظار درک می شود، جایی که ورودی یکسان است اما هدف ممکن است ماهیت متفاوتی داشته باشد. به عنوان مثال، ما ممکن است طبقه بندی گربهها و سگها، در تنظیم اول یاد بگیریم، سپس در طبقه بندی مجموعه دیگری، مانند مورچهها و زنبورها، در تنظیم دوم بیاموزیم.
-صفحه 536، یادگیری عمیق، 2016.
یادگیری انتقالی این مزیت را دارد که سبب کاهش زمان آموزش برای یک مدل شبکه عصبی گردد و می تواند منجر به کاهش خطای تعمیم شود.
وزن های شبکه از پیش آموزش دیده به عنوان نقطه شروع برای فرآیند آموزش شبکه جدید استفاده می شوند. این استفاده، یادگیری انتقالی را به عنوان یک نوع طرح اولیه وزن تلقی می کند. زمانی کاربرد دارد که شبکه از پیش آموزش دیده دارای داده های برچسب گذاری شده بسیار بیشتری نسبت به مسئله فعلی باشد و همچنین ساختار مسئله در هر دو زمینه مشابه باشد.
… هدف این است که از داده های شبکه آموزش دیده اول برای استخراج اطلاعاتی استفاده شود که ممکن است هنگام یادگیری یا حتی هنگام پیش بینی در شبکه دوم مفید باشد.
– صفحه 538، یادگیری عمیق، 2016.
آموزش انتقالی برای تشخیص تصویر
طیف وسیعی از مدلها برای طبقهبندی تصاویر توسعه یافتهاند و در چالش تشخیص تصویر در مقیاس بزرگ ImageNet یا ILSVRC نشان داده شدهاند.
این چالش که اغلب ImageNet نامیده می شود. با توجه به منبع تصویر مورد استفاده در مسابقه، منجر به نوآوری در معماری و آموزش شبکه های عصبی کانولوشن شده است.
این مدل ها می توانند به عنوان پایه ای برای انتقال یادگیری در برنامه های بینایی کامپیوتری مورد استفاده قرار گیرند.
این امر به دلایل متعددی مطلوب است، از جمله:
- Useful Learned Features: مدلها با توجه به اینکه روی بیش از 1,000,000 تصویر برای 1,000 دسته آموزش دیدهاند.یاد گرفتهاند که چگونه ویژگیهای عمومی را از عکسها تشخیص دهند.
- State-of-the-Art Performance: مدلها به بهترین عملکرد پیشرفته دست یافتهاند و در کار تشخیص تصویر خاص که برای آن توسعه داده شدهاند، موثر باقی میمانند.
- Easily Accessible: وزن های مدل به صورت فایل های دانلودی رایگان ارائه می شوند. بسیاری از کتابخانه ها API های مناسبی را برای دانلود و استفاده مستقیم از مدل ها ارائه می دهند. وزنهای مدل را میتوان با استفاده از کتابخانههای یادگیری عمیق مختلف، از جمله Keras، بارگیری کرد .
نحوه استفاده از مدل های از پیش آموزش دیده
به عنوان مثال، یک مدل ممکن است دانلود شود و همانطور که هست استفاده شود، مثلاً در یک برنامه کاربردی برای طبقهبندی عکسهای جدید استفاده شود.
همچنین، ممکن است مدل ها از پیش آموزش دیده به عنوان مدل های استخراج ویژگی استفاده شوند. در این حالت، خروجی مدل از یک لایه قبل از لایه خروجی مدل به عنوان ورودی یک مدل طبقهبندیکننده جدید استفاده میشود.
لایههای کانولوشن نزدیکتر به لایه ورودی مدل ویژگیهای سطح پایین مانند خطوط را میآموزند، لایههای وسط ویژگیهای انتزاعی پیچیدهای را میآموزند که ویژگی های استخراجشده از ورودی را ترکیب میکنند، و لایههای نزدیکتر به خروجی ویژگی های استخراج شده را در چارچوب یک کار طبقه بندی تفسیر می کند.
با داشتن این درک، می توان سطحی از جزئیات را برای استخراج ویژگی از یک مدل از پیش آموزش دیده موجود انتخاب کرد. برای مثال، اگر یک کار جدید، کاملاً متفاوت با طبقهبندی اشیاء در عکسها باشد ، شاید خروجی مدل از پیش آموزشدیده پس از چند لایه مناسب باشد. اگر کار جدید، کاملاً شبیه به کار طبقهبندی اشیاء در عکسها باشد، شاید بتوان از خروجی لایههای بسیار عمیقتر در مدل استفاده کرد، یا حتی از خروجی لایه کاملاً متصل قبل از لایه خروجی استفاده کرد.
مدل از پیش آموزش داده شده را می توان به عنوان یک برنامه استخراج ویژگی جداگانه استفاده کرد، در این صورت ورودی می تواند توسط مدل یا بخشی از مدل به یک خروجی داده شده (مثلاً بردار اعداد) برای هر تصویر ورودی، از قبل پردازش شود.می تواند هنگام آموزش یک مدل جدید به عنوان ورودی استفاده کنید.
مدل از پیش آموزش دیده یا بخشی از مدل را می توان مستقیماً در یک مدل شبکه عصبی جدید ادغام کرد. می توان وزن های از پیش آموزش دیده را فریز کرد تا با آموزش مدل جدید بروز نشوند. وزنها ممکن است در طول آموزش مدل جدید بهروزرسانی شوند، شاید با نرخ یادگیری پایینتر، به مدل از پیش آموزشدیده اجازه میدهد تا هنگام آموزش مدل جدید مانند یک مقدار اولیه وزن عمل کند.
می توانیم استفاده این الگوهای را به صورت زیر خلاصه کنیم:
Classifier: مدل از پیش آموزش داده شده مستقیماً برای طبقه بندی تصاویر جدید استفاده می شود.
Standalone Feature Extractor: مدل از پیش آموزش دیده یا بخشی از مدل، برای پیش پردازش تصاویر و استخراج ویژگی های مربوطه استفاده می شود.
Integrated Feature Extractor: مدل از پیش آموزش دیده یا بخشی از مدل، در یک مدل جدید ادغام شده است، اما لایه های مدل از پیش آموزش دیده در طول آموزش فریز می شوند.
Weight Initialization: مدل از پیش آموزش دیده، یا بخشی از مدل، در یک مدل جدید ادغام شده است، و لایه های مدل از پیش آموزش دیده با مدل جدید آموزش داده می شود.
مدل هایی برای یادگیری انتقالی
چندین مدل با عملکرد مناسب برای تشخیص تصویر وجود دارد. می توان آنها را دانلود کرد و به عنوان مبنایی برای تشخیص تصویر و وظایف بینایی کامپیوتری مرتبط استفاده کرد.
سه مدل از محبوبترین مدلها به شرح زیر می باشد:
VGG (e.g. VGG16 or VGG19)
GoogLeNet (e.g. InceptionV3)
Residual Network (e.g. ResNet50)
این مدلها به دلیل عملکردشان به طور گسترده برای یادگیری انتقال استفاده میشوند. همچنین نمونههایی بودند که نوآوریهای معماری خاصی را معرفی کردند. یعنی ساختارهای ثابت و تکرار شونده (VGG)، ماژولهای اولیه (GoogLeNet)، و ماژولهای باقیمانده (ResNet).
Keras دسترسی به تعدادی از مدل های از پیش آموزش دیده که برای کارهای تشخیص تصویر را فراهم می کند.
آنها از طریق Applications API در دسترس هستند. شامل توابعی برای بارگذاری یک مدل با یا بدون وزن های از پیش آموزش دیده، و آماده سازی داده ها به روشی که یک مدل معین ممکن است انتظار داشته باشد (مثلاً مقیاس بندی اندازه و مقادیر پیکسل).
اولین باری که یک مدل از پیش آموزش دیده بارگذاری می شود. Keras وزن های مدل مورد نیاز را دانلود می کند وزن ها در فهرست keras/models/. در فهرست اصلی شما ذخیره می شوند و دفعه بعد از این مکان بارگیری می شوند.
هنگام بارگذاری یک مدل معین، آرگومان “include_top” را میتوان روی False تنظیم کرد، در این صورت لایههای fully-connected مدل مورد استفاده برای پیشبینی بارگذاری نمیشوند و اجازه میدهند یک لایه خروجی جدید اضافه و آموزش داده شود. مثلا:
... # load model without output layer model = VGG16(include_top=False)
بهعلاوه، وقتی آرگومان Flase ،include_top باشد، آرگومان «input_tensor» باید مشخص شود، که اجازه میدهد ورودی با اندازه ثابت مورد انتظار مدل تغییر کند. مثلا:
... # load model and specify a new input shape for images new_input = Input(shape=(640, 480, 3)) model = VGG16(include_top=False, input_tensor=new_input)
یک مدل بدون ،top مستقیم فعال سازی ها را از آخرین لایه کانولوشن یا pooling به خروجی می دهد. یک رویکرد برای خلاصه کردن این فعالسازیها برای استفاده در classifier یا بهعنوان feature vector representation. افزودن یک لایه global pooling layer است. مانند max global pooling یا average global pooling. نتیجه برداری است که می تواند به عنوان توصیفگر ویژگی برای ورودی استفاده شود. Keras این قابلیت را از طریق آرگومان “pooling” که می تواند روی “avg” یا “max” تنظیم شود، ارائه می دهد. مثلا:
... # load model and specify a new input shape for images and avg pooling output new_input = Input(shape=(640, 480, 3)) model = VGG16(include_top=False, input_tensor=new_input, pooling='avg')
تصاویر را می توان با استفاده از تابع ()preprocess_input برای یک مدل معین آماده کرد. مثلا:
# prepare an image from keras.applications.vgg16 import preprocess_input images = ... prepared_images = preprocess_input(images)
ممکن است بخواهید از معماری یک مدل در مجموعه داده خود استفاده کنید. اما از وزن های از پیش آموزش داده شده استفاده نکنید. در عوض مدل را با وزن های تصادفی مقداردهی و از ابتدا آموزش دهید.
این را می توان با تنظیم آرگومان “weights” روی None به جای پیش فرض “imagenet” به دست آورد. بهعلاوه، آرگومان «classes» را میتوان برای تعریف تعداد کلاسها در مجموعه دادههای شما تنظیم کرد، که در لایه خروجی مدل پیکربندی میشود. مثلا:
# define a new model with random weights and 10 classes new_input = Input(shape=(640, 480, 3)) model = VGG16(weights=None, input_tensor=new_input, classes=10)
اکنون با API آشنا شدیم، نگاهی به بارگذاری سه مدل با استفاده از Keras Applications API بیندازیم.
مدل از پیش آموزش دیده VGG16 را بارگیری کنید
مدل VGG16 توسط گروه Visual Graphics Group (VGG) در آکسفورد توسعه داده شد و در مقاله سال 2014 با عنوان “Very Deep Convolutional Networks for Large-Scale Image Recognition.” توضیح داده شد.
بهطور پیشفرض، مدل انتظار دارد تصاویر ورودی رنگی به اندازه مربعهای 224×224 تغییر مقیاس داده شوند.
مدل را می توان به صورت زیر بارگذاری کرد:
# example of loading the vgg16 model from keras.applications.vgg16 import VGG16 # load model model = VGG16() # summarize the model model.summary()
با اجرای مثال، مدل VGG16 را بارگیری می شود و در صورت نیاز وزن های مدل را دانلود می کند.
سپس می توان از این مدل برای طبقه بندی عکس به یکی از 1000 کلاس استفاده کرد. در این مورد، خلاصه معماری مدل نمایش داده می شود تا نشان دهد که به درستی بارگذاری شده است.
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ predictions (Dense) (None, 1000) 4097000 ================================================================= Total params: 138,357,544 Trainable params: 138,357,544 Non-trainable params: 0 _________________________________________________________________
مدل از پیش آموزش دیده InceptionV3 را بارگیری کنید
InceptionV3 سومین تکرار از معماری inception است که در ابتدا برای مدل GoogLeNet توسعه پیدا کرده بود. این مدل توسط محققان گوگل توسعه داده شد و در مقاله سال 2015 با عنوان “Rethinking the Inception Architecture for Computer Vision” توضیح داده شد.
این مدل انتظار دارد تصاویر رنگی به شکل مربع 299×299 باشد.
مدل را می توان به صورت زیر بارگذاری کرد:
# example of loading the inception v3 model from keras.applications.inception_v3 import InceptionV3 # load model model = InceptionV3() # summarize the model model.summary()
با اجرای این مثال، مدل را بارگیری میکند، وزنها را در صورت نیاز دانلود میکند، و سپس معماری مدل را نمایش میدهد تا تأیید شود که بارگذاری صحیح انجام شده است.
مدل از پیش آموزش دیده ResNet50 را بارگیری کنید
Residual Network یا به اختصار ResNet، مدلی است که از ماژول residual شامل اتصالات میانبر استفاده می کند. resnet توسط محققان مایکروسافت توسعه داده شد و در مقاله 2015 با عنوان “Deep Residual Learning for Image Recognition.” توضیح داده شد.
این مدل انتظار دارد تصاویر رنگی به شکل مربع 224×224 باشد.
# example of loading the resnet50 model from keras.applications.resnet50 import ResNet50 # load model model = ResNet50() # summarize the model model.summary()
استفاده از مدل های از پیش آموزش دیده
با نحوه بارگذاری مدل های از پیش آموزش دیده در Keras آشنا شدیم. بیایید به چند نمونه از نحوه استفاده از آنها در عمل نگاه کنیم.
در این مثالها، ما با مدل VGG16 کار خواهیم کرد. زیرا یک مدل نسبتاً ساده برای استفاده و یک معماری مدل ساده برای درک است. برای کار در این نمونه ها به یک عکس نیز نیاز داریم.
مدل از پیش آموزش دیده به عنوان طبقه بندی کننده
یک مدل از پیش آموزش دیده شده را میتوان به طور مستقیم برای دستهبندی تصاویر یکی از هزار کلاس (دسته) شناخته شده در وظیفه دستهبندی تصویر ILSVRC، استفاده کرد. یک مدل از پیش آموزش دیده می تواند مستقیماً برای طبقه بندی عکس های جدیداستفاده شود. ما از مدل VGG16 برای طبقه بندی تصاویر جدید استفاده خواهیم کرد. در ادامه، تصویری از یک سگ ارائه شده است. این تصویر توسط «جاستین مورگان» (Justin Morgan) گرفته شده و دارای گواهینامه آزاد است. مخاطبان باید این تصویر را دانلود کرده و با نام «dog.jpg»، در پوشه جاری خود ذخیره کنند.
ابتدا، عکس باید بارگذاری، و سپس به ابعاد 224×224 و مقادیر پیکسلی که مورد انتظار مدل است، تغییر داده شود. مدل روی نمونههای یک آرایه عمل میکند، بنابراین ابعاد یک تصویر بارگذاری شده باید ۱ واحد برای تصویری با 224×224 پیکسل و سه کانال، توسعه پیدا کنند.
# load an image from file image = load_img('dog.jpg', target_size=(224, 224)) # convert the image pixels to a numpy array image = img_to_array(image) # reshape data for the model image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2])) # prepare the image for the VGG model image = preprocess_input(image)
سپس، مدل را میتوان بارگذاری کرد و پیشبینی انجام شود. این یعنی، احتمال پیشبینی شده از تصویر متعلق به هر یک از ۱۰۰۰ کلاس انجام شده است. در این مثال، تنها نگرانی موجود پیرامون محتملترین کلاسها است، بنابراین میتوان پیشبینیها را رمزگشایی و برچسبها یا نام کلاسها با بالاترین احتمال را بازیابی کرد.
yhat = model.predict(image) # convert the probabilities to class labels label = decode_predictions(yhat) # retrieve the most likely result, e.g. highest probability label = label[0][0]
با آزمودن همه این موارد در کنار هم، مثال زیر یک تصویر جدید را بارگذاری و محتملترین کلاس را پیشبینی میکند.
# example of using a pre-trained model as a classifier from keras.preprocessing.image import load_img from keras.preprocessing.image import img_to_array from keras.applications.vgg16 import preprocess_input from keras.applications.vgg16 import decode_predictions from keras.applications.vgg16 import VGG16 # load an image from file image = load_img('dog.jpg', target_size=(224, 224)) # convert the image pixels to a numpy array image = img_to_array(image) # reshape data for the model image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2])) # prepare the image for the VGG model image = preprocess_input(image) # load the model model = VGG16() # predict the probability across all output classes yhat = model.predict(image) # convert the probabilities to class labels label = decode_predictions(yhat) # retrieve the most likely result, e.g. highest probability label = label[0][0] # print the classification print('%s (%.2f%%)' % (label[1], label[2]*100))
اجرای مثال چیزی بیش از سگ بودن را پیش بینی می کند. همچنین نژاد خاص “دوبرمن” را با احتمال 33.59٪ پیش بینی می کند که ممکن است درست باشد.
Doberman (33.59%)
مدل از پیش آموزش دیده به عنوان پیش پردازشگر استخراج کننده ویژگی
مدل از پیش آموزش دیده ممکن است به فقط به عنوان یک برنامه برای استخراج ویژگی ها از عکس های جدید استفاده شود. به طور خاص، ویژگی های استخراج شده از یک عکس ممکن است بردار عددی باشد که مدل برای توصیف ویژگی های خاص در یک عکس استفاده می کند. این ویژگی ها سپس می توانند به عنوان ورودی در توسعه یک مدل جدید استفاده شوند.
چند لایه آخر مدل VGG16 لایه های کاملاً متصل قبل از لایه خروجی هستند. این لایهها میتوانند مجموعه پیچیدهای از ویژگیها را برای توصیف یک تصویر ورودی داده شده فراهم کنند و ممکن است ورودیهای مفیدی را هنگام آموزش یک مدل جدید برای دستهبندی تصاویر یا کارهای بینایی کامپیوتری مشابه فراهم کنند.
همانطور که در مثال قبلی انجام دادیم، می توان تصویر را بارگذاری و برای مدل آماده کرد. مدل را با قسمت خروجی طبقهبندی کننده مدل بارگذاری میکنیم، اما لایه خروجی نهایی را به صورت دستی حذف میکنیم. این بدان معناست که دومین لایه کاملاً متصل با 4096 گره، لایه خروجی جدید خواهد بود.
# load model model = VGG16() # remove the output layer model = Model(inputs=model.inputs, outputs=model.layers[-2].output)
این بردار 4096 عددی برای نشان دادن ویژگیهای پیچیده یک تصویر ورودی استفاده میشود که میتوان آن را در فایل ذخیره کرد تا بعداً بارگذاری شود و به عنوان ورودی برای آموزش یک مدل جدید استفاده شود. می توانیم آن را به عنوان یک فایل pickle ذخیره کنیم.
# get extracted features features = model.predict(image) print(features.shape) # save to file dump(features, open('dog.pkl', 'wb'))
با آزمودن همه این موارد در کنار هم، یک مثال کامل از استفاده از مدل به عنوان یک مدل استخراج ویژگی مستقل، در ادامه آمده است.
# example of using the vgg16 model as a feature extraction model from keras.preprocessing.image import load_img from keras.preprocessing.image import img_to_array from keras.applications.vgg16 import preprocess_input from keras.applications.vgg16 import decode_predictions from keras.applications.vgg16 import VGG16 from keras.models import Model from pickle import dump # load an image from file image = load_img('dog.jpg', target_size=(224, 224)) # convert the image pixels to a numpy array image = img_to_array(image) # reshape data for the model image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2])) # prepare the image for the VGG model image = preprocess_input(image) # load model model = VGG16() # remove the output layer model = Model(inputs=model.inputs, outputs=model.layers[-2].output) # get extracted features features = model.predict(image) print(features.shape) # save to file dump(features, open('dog.pkl', 'wb'))
با اجرای مثال، عکس بارگیری می شود، سپس مدل به عنوان مدل استخراج ویژگی آماده می شود.
ویژگی ها از عکس بارگذاری شده استخراج شده وشکل بردار ویژگی چاپ شده که نشان می دهد 4096 عدد دارد. این ویژگی سپس در یک فایل dog.pkl جدید در فهرست کاری فعلی ذخیره می شود.
(1, 4096)
این فرآیند می تواند برای هر عکس در مجموعه داده آموزشی جدید تکرار شود.
مدل از پیش آموزش دیده به عنوان استخراج کننده ویژگی در مدل
میتوانیم برخی یا همه لایهها را در یک مدل از پیش آموزشدیده بهعنوان جزء استخراج کننده ویژگیهای یک مدل جدید بهطور مستقیم استفاده کنیم.
این را می توان با بارگذاری مدل، سپس افزودن لایه های جدید به دست آورد. این امر شامل افزودن لایههای پیچشی جدید برای توسعه قابلیتهای استخراج ویژگی مدل. یا افزودن لایههای نوع دستهبندی کاملا متصل جدید برای فراگیری چگونگی تفسیر ویژگیهای استخراج شده روی یک مجموعه داده جدید یا برخی از ترکیبها است.برای مثال، میتوانیم مدلهای VGG16 را بدون بخش طبقهبندیکننده مدل با تعیین آرگومان «include_top» به «False» بارگذاری کنیم. شکل ترجیحی تصاویر در مجموعه داده جدیدمان را 300×300 تعیین کنیم.
# load model without classifier layers model = VGG16(include_top=False, input_shape=(300, 300, 3))
میتوان از API تابع کرس برای افزودن یک لایه Flatten جدید پس از آخرین لایه pooling در مدل VGG16 استفاده کرد.سپس یک مدل طبقهبندیکننده جدید با یک لایهDense fully connected و یک لایه خروجی تعریف کنیم که احتمال را برای 10 کلاس پیشبینی میکند.
# add new classifier layers flat1 = Flatten()(model.layers[-1].output) class1 = Dense(1024, activation='relu')(flat1) output = Dense(10, activation='softmax')(class1) # define new model model = Model(inputs=model.inputs, outputs=output)
# add new classifier layers flat1 = Flatten()(model.layers[-1].output) class1 = Dense(1024, activation='relu')(flat1) output = Dense(10, activation='softmax')(class1) # define new model model = Model(inputs=model.inputs, outputs=output)
یک رویکرد جایگزین برای افزودن یک لایه Flatten این است که مدل VGG16 را با یک لایه average pooling تعریف کنیم و سپس لایههای کاملاً متصل را اضافه کنیم.
وزنهای مدل VGG16 و وزنهای مدل جدید همه با هم در مجموعه داده جدید آموزش داده میشوند.مثال کامل در زیر آمده است.
# example of tending the vgg16 model from keras.applications.vgg16 import VGG16 from keras.models import Model from keras.layers import Dense from keras.layers import Flatten # load model without classifier layers model = VGG16(include_top=False, input_shape=(300, 300, 3)) # add new classifier layers flat1 = Flatten()(model.layers[-1].output) class1 = Dense(1024, activation='relu')(flat1) output = Dense(10, activation='softmax')(class1) # define new model model = Model(inputs=model.inputs, outputs=output) # summarize model.summary() # ...
با اجرای قطعه کد بالا، مدل جدید آماده برای آموزش و خلاصه معماری مدل تعریف میشود. میتوان مشاهده کرد که خروجی flattened برای آخرین لایه pooling وجود دارد و لایههای کاملا متصل جدید اضافه شدهاند.
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 300, 300, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 300, 300, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 300, 300, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 150, 150, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 150, 150, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 150, 150, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 75, 75, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 75, 75, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 75, 75, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 75, 75, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 37, 37, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 37, 37, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 37, 37, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 37, 37, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 18, 18, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 9, 9, 512) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 41472) 0 _________________________________________________________________ dense_1 (Dense) (None, 1024) 42468352 _________________________________________________________________ dense_2 (Dense) (None, 10) 10250 ================================================================= Total params: 57,193,290 Trainable params: 57,193,290 Non-trainable params: 0 _________________________________________________________________
ممکن است بخواهیم از لایههای مدل VGG16 استفاده کنیم. اما لایههای جدید مدل را بدون بهروزرسانی وزن لایههای VGG16 آموزش دهیم. این به لایه های خروجی جدید اجازه می دهد تا تفسیر ویژگی های آموخته شده مدل VGG16 را بیاموزند.
این را می توان با تنظیم ویژگی “trainable” در هر یک از لایه های مدل بارگذاری شده VGG بر روی False قبل از آموزش به دست آورد. مثلا:
# load model without classifier layers model = VGG16(include_top=False, input_shape=(300, 300, 3)) # mark loaded layers as not trainable for layer in model.layers: layer.trainable = False ...
می توانید انتخاب کنید که کدام لایه ها قابل آموزش هستند.
# load model without classifier layers model = VGG16(include_top=False, input_shape=(300, 300, 3)) # mark some layers as not trainable model.get_layer('block1_conv1').trainable = False model.get_layer('block1_conv2').trainable = False model.get_layer('block2_conv1').trainable = False model.get_layer('block2_conv2').trainable = False ...
دیدگاهتان را بنویسید