{"id":2096,"date":"2024-07-09T11:47:49","date_gmt":"2024-07-09T11:47:49","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=2096"},"modified":"2024-07-09T11:47:52","modified_gmt":"2024-07-09T11:47:52","slug":"using-transfer-learning-with-pre-trained-models-in-keras","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/","title":{"rendered":"Using Transfer Learning with Pre-trained Models in Keras"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task. This is particularly useful when dealing with image data, as training deep neural networks from scratch can be computationally expensive and time-consuming. Keras, a popular high-level neural networks API written in Python, provides robust support for implementing transfer learning with pre-trained models. This tutorial will guide you through the concepts and practical steps of using transfer learning with pre-trained models in Keras.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to Transfer Learning<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">What is Transfer Learning?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Transfer learning involves taking a pre-trained model, typically trained on a large dataset like ImageNet, and using it as a starting point for a new, related task. Instead of training a model from scratch, we leverage the learned features and weights from the pre-trained model, which can significantly reduce the required training time and improve performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why Use Transfer Learning?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Reduced Training Time<\/strong>: Pre-trained models are usually trained on large datasets with extensive computational resources. By reusing these models, you save on both time and computational costs.<\/li>\n\n\n\n<li><strong>Improved Performance<\/strong>: Pre-trained models have already learned useful features that can be adapted to new tasks, often leading to better performance, especially when the new task has limited training data.<\/li>\n\n\n\n<li><strong>Practicality<\/strong>: Training large neural networks from scratch can be impractical without significant resources. Transfer learning provides a feasible alternative.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">2. Overview of Pre-trained Models<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Several pre-trained models are available in Keras, each with unique architectures and advantages. Some of the most commonly used pre-trained models include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>VGG16 and VGG19<\/strong>: Known for their simplicity and effectiveness, VGG models have been widely used for various image classification tasks.<\/li>\n\n\n\n<li><strong>ResNet<\/strong>: Residual Networks (ResNets) introduced the concept of residual connections, allowing very deep networks to be trained effectively.<\/li>\n\n\n\n<li><strong>Inception<\/strong>: Inception models, including InceptionV3 and Inception-ResNet-V2, are known for their complex architectures designed to handle varying scales of objects within images.<\/li>\n\n\n\n<li><strong>MobileNet<\/strong>: MobileNet models are designed to be lightweight and efficient, making them suitable for mobile and embedded applications.<\/li>\n\n\n\n<li><strong>EfficientNet<\/strong>: EfficientNet models balance accuracy and efficiency by scaling up models in a structured manner.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Setting Up Your Environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before we dive into the implementation, ensure you have the necessary libraries installed. You will need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python 3.x<\/li>\n\n\n\n<li>Keras<\/li>\n\n\n\n<li>TensorFlow (backend for Keras)<\/li>\n\n\n\n<li>NumPy<\/li>\n\n\n\n<li>Matplotlib<\/li>\n\n\n\n<li>OpenCV (optional, for image processing)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can install these libraries using pip:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">pip install tensorflow keras numpy matplotlib opencv-python<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Loading and Preprocessing Data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For this tutorial, we&#8217;ll use the CIFAR-10 dataset, a popular benchmark for image classification tasks. CIFAR-10 consists of 60,000 32&#215;32 color images in 10 classes, with 6,000 images per class. Keras provides an easy way to load this dataset.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import<\/span> numpy <span class=\"hljs-keyword\">as<\/span> np\n<span class=\"hljs-keyword\">import<\/span> matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.datasets <span class=\"hljs-keyword\">import<\/span> cifar10\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.utils <span class=\"hljs-keyword\">import<\/span> to_categorical\n\n<span class=\"hljs-comment\"># Load the CIFAR-10 dataset<\/span>\n(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n\n<span class=\"hljs-comment\"># Normalize the images to the range &#91;0, 1]<\/span>\nx_train = x_train.astype(<span class=\"hljs-string\">'float32'<\/span>) \/ <span class=\"hljs-number\">255.0<\/span>\nx_test = x_test.astype(<span class=\"hljs-string\">'float32'<\/span>) \/ <span class=\"hljs-number\">255.0<\/span>\n\n<span class=\"hljs-comment\"># One-hot encode the labels<\/span>\ny_train = to_categorical(y_train, <span class=\"hljs-number\">10<\/span>)\ny_test = to_categorical(y_test, <span class=\"hljs-number\">10<\/span>)\n\n<span class=\"hljs-comment\"># Display some images from the dataset<\/span>\nclass_names = &#91;<span class=\"hljs-string\">'airplane'<\/span>, <span class=\"hljs-string\">'automobile'<\/span>, <span class=\"hljs-string\">'bird'<\/span>, <span class=\"hljs-string\">'cat'<\/span>, <span class=\"hljs-string\">'deer'<\/span>, <span class=\"hljs-string\">'dog'<\/span>, <span class=\"hljs-string\">'frog'<\/span>, <span class=\"hljs-string\">'horse'<\/span>, <span class=\"hljs-string\">'ship'<\/span>, <span class=\"hljs-string\">'truck'<\/span>]\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">plot_sample_images<\/span><span class=\"hljs-params\">(x, y, class_names)<\/span>:<\/span>\n    fig, axes = plt.subplots(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">10<\/span>, figsize=(<span class=\"hljs-number\">20<\/span>, <span class=\"hljs-number\">2<\/span>))\n    <span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> range(<span class=\"hljs-number\">10<\/span>):\n        axes&#91;i].imshow(x&#91;i])\n        axes&#91;i].set_title(class_names&#91;np.argmax(y&#91;i])])\n        axes&#91;i].axis(<span class=\"hljs-string\">'off'<\/span>)\n    plt.show()\n\nplot_sample_images(x_train, y_train, class_names)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This code will load the CIFAR-10 dataset, normalize the images, one-hot encode the labels, and display some sample images.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Using Pre-trained Models in Keras<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Feature Extraction<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Feature extraction involves using the pre-trained model to extract features from the new dataset without modifying the pre-trained weights. This approach is suitable when the new dataset is small or similar to the dataset on which the pre-trained model was trained.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> tensorflow.keras.applications <span class=\"hljs-keyword\">import<\/span> VGG16\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.models <span class=\"hljs-keyword\">import<\/span> Model\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.layers <span class=\"hljs-keyword\">import<\/span> Dense, Flatten\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.optimizers <span class=\"hljs-keyword\">import<\/span> Adam\n\n<span class=\"hljs-comment\"># Load the VGG16 model without the top fully connected layers<\/span>\nbase_model = VGG16(weights=<span class=\"hljs-string\">'imagenet'<\/span>, include_top=<span class=\"hljs-literal\">False<\/span>, input_shape=(<span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">3<\/span>))\n\n<span class=\"hljs-comment\"># Freeze the base model<\/span>\nbase_model.trainable = <span class=\"hljs-literal\">False<\/span>\n\n<span class=\"hljs-comment\"># Add new classification layers on top of the base model<\/span>\nx = Flatten()(base_model.output)\nx = Dense(<span class=\"hljs-number\">128<\/span>, activation=<span class=\"hljs-string\">'relu'<\/span>)(x)\nx = Dense(<span class=\"hljs-number\">10<\/span>, activation=<span class=\"hljs-string\">'softmax'<\/span>)(x)\n\n<span class=\"hljs-comment\"># Create the new model<\/span>\nmodel = Model(inputs=base_model.input, outputs=x)\n\n<span class=\"hljs-comment\"># Compile the model<\/span>\nmodel.compile(optimizer=Adam(), loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>, metrics=&#91;<span class=\"hljs-string\">'accuracy'<\/span>])\n\n<span class=\"hljs-comment\"># Display the model summary<\/span>\nmodel.summary()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this example, we load the VGG16 model without the top layers and freeze its weights. Then, we add new classification layers on top of the base model and compile the model.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fine-Tuning<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fine-tuning involves unfreezing some of the layers in the pre-trained model and retraining them on the new dataset. This approach is useful when the new dataset is larger or significantly different from the original dataset.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Unfreeze some layers in the base model<\/span>\n<span class=\"hljs-keyword\">for<\/span> layer <span class=\"hljs-keyword\">in<\/span> base_model.layers&#91;<span class=\"hljs-number\">-4<\/span>:]:\n    layer.trainable = <span class=\"hljs-literal\">True<\/span>\n\n<span class=\"hljs-comment\"># Recompile the model with a lower learning rate<\/span>\nmodel.compile(optimizer=Adam(lr=<span class=\"hljs-number\">1e-5<\/span>), loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>, metrics=&#91;<span class=\"hljs-string\">'accuracy'<\/span>])\n\n<span class=\"hljs-comment\"># Display the model summary<\/span>\nmodel.summary()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this example, we unfreeze the last four layers of the base model and recompile the model with a lower learning rate to avoid large weight updates that could disrupt the pre-trained weights.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Practical Example: Image Classification with Transfer Learning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s put it all together and train the model on the CIFAR-10 dataset.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Loading the Data<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> tensorflow.keras.preprocessing.image <span class=\"hljs-keyword\">import<\/span> ImageDataGenerator\n\n<span class=\"hljs-comment\"># Data augmentation<\/span>\ndatagen = ImageDataGenerator(\n    rotation_range=<span class=\"hljs-number\">20<\/span>,\n    width_shift_range=<span class=\"hljs-number\">0.2<\/span>,\n    height_shift_range=<span class=\"hljs-number\">0.2<\/span>,\n    horizontal_flip=<span class=\"hljs-literal\">True<\/span>\n)\n\ndatagen.fit(x_train)\n\n<span class=\"hljs-comment\"># Fit the model<\/span>\nhistory = model.fit(datagen.flow(x_train, y_train, batch_size=<span class=\"hljs-number\">32<\/span>), epochs=<span class=\"hljs-number\">10<\/span>, validation_data=(x_test, y_test))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Evaluating the Model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After training, we evaluate the model on the test dataset.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Evaluate the model on the test dataset<\/span>\ntest_loss, test_acc = model.evaluate(x_test, y_test, verbose=<span class=\"hljs-number\">2<\/span>)\nprint(<span class=\"hljs-string\">f'Test accuracy: <span class=\"hljs-subst\">{test_acc:<span class=\"hljs-number\">.4<\/span>f}<\/span>'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Visualizing Training Results<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We can visualize the training and validation accuracy and loss over the epochs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">plot_training_history<\/span><span class=\"hljs-params\">(history)<\/span>:<\/span>\n    acc = history.history&#91;<span class=\"hljs-string\">'accuracy'<\/span>]\n    val_acc = history.history&#91;<span class=\"hljs-string\">'val_accuracy'<\/span>]\n    loss = history.history&#91;<span class=\"hljs-string\">'loss'<\/span>]\n    val_loss = history.history&#91;<span class=\"hljs-string\">'val_loss'<\/span>]\n    epochs = range(len(acc))\n\n    plt.figure(figsize=(<span class=\"hljs-number\">12<\/span>, <span class=\"hljs-number\">4<\/span>))\n    plt.subplot(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">1<\/span>)\n    plt.plot(epochs, acc, <span class=\"hljs-string\">'r'<\/span>, label=<span class=\"hljs-string\">'Training accuracy'<\/span>)\n    plt.plot(epochs, val_acc, <span class=\"hljs-string\">'b'<\/span>, label=<span class=\"hljs-string\">'Validation accuracy'<\/span>)\n    plt.title(<span class=\"hljs-string\">'Training and validation accuracy'<\/span>)\n    plt.legend()\n\n    plt.subplot(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)\n    plt.plot(epochs, loss, <span class=\"hljs-string\">'r'<\/span>, label=<span class=\"hljs-string\">'Training loss'<\/span>)\n    plt.plot(epochs, val_loss, <span class=\"hljs-string\">'b'<\/span>, label=<span class=\"hljs-string\">'Validation loss'<\/span>)\n    plt.title(<span class=\"hljs-string\">'Training and validation loss'<\/span>)\n    plt.legend()\n\n    plt.show()\n\nplot_training_history(history)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Evaluating and Fine-Tuning the Model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After the initial training, we can fine-tune the model further by unfreezing more layers or adjusting the learning rate. This process involves iterative experimentation to achieve the best performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Unfreezing More Layers<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Unfreeze additional layers<\/span>\n<span class=\"hljs-keyword\">for<\/span> layer <span class=\"hljs-keyword\">in<\/span> base_model.layers&#91;<span class=\"hljs-number\">-8<\/span>:]:\n    layer.trainable = <span class=\"hljs-literal\">True<\/span>\n\n<span class=\"hljs-comment\"># Recompile the model with a lower learning rate<\/span>\nmodel.compile(optimizer=Adam(lr=<span class=\"hljs-number\">1e-6<\/span>), loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>, metrics=&#91;<span class=\"hljs-string\">'accuracy'<\/span>])\n\n<span class=\"hljs-comment\"># Continue training<\/span>\nhistory = model.fit(datagen.flow(x_train, y_train, batch_size=<span class=\"hljs-number\">32<\/span>), epochs=<span class=\"hljs-number\">5<\/span>, validation_data=(x_test, y_test))\n\n<span class=\"hljs-comment\"># Evaluate the model<\/span>\ntest\n\n_loss, test_acc = model.evaluate(x_test, y_test, verbose=<span class=\"hljs-number\">2<\/span>)\nprint(<span class=\"hljs-string\">f'Test accuracy after fine-tuning: <span class=\"hljs-subst\">{test_acc:<span class=\"hljs-number\">.4<\/span>f}<\/span>'<\/span>)\n\n<span class=\"hljs-comment\"># Plot the training history<\/span>\nplot_training_history(history)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Adjusting the Learning Rate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fine-tuning often requires careful adjustment of the learning rate. Lower learning rates are typically preferred to avoid disrupting the pre-trained weights too much.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> tensorflow.keras.callbacks <span class=\"hljs-keyword\">import<\/span> ReduceLROnPlateau\n\n<span class=\"hljs-comment\"># Add a learning rate scheduler<\/span>\nlr_scheduler = ReduceLROnPlateau(monitor=<span class=\"hljs-string\">'val_loss'<\/span>, factor=<span class=\"hljs-number\">0.1<\/span>, patience=<span class=\"hljs-number\">3<\/span>, min_lr=<span class=\"hljs-number\">1e-7<\/span>)\n\n<span class=\"hljs-comment\"># Recompile the model with the new learning rate scheduler<\/span>\nmodel.compile(optimizer=Adam(lr=<span class=\"hljs-number\">1e-5<\/span>), loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>, metrics=&#91;<span class=\"hljs-string\">'accuracy'<\/span>])\n\n<span class=\"hljs-comment\"># Continue training with the learning rate scheduler<\/span>\nhistory = model.fit(datagen.flow(x_train, y_train, batch_size=<span class=\"hljs-number\">32<\/span>), epochs=<span class=\"hljs-number\">5<\/span>, validation_data=(x_test, y_test), callbacks=&#91;lr_scheduler])\n\n<span class=\"hljs-comment\"># Evaluate the model<\/span>\ntest_loss, test_acc = model.evaluate(x_test, y_test, verbose=<span class=\"hljs-number\">2<\/span>)\nprint(<span class=\"hljs-string\">f'Test accuracy after learning rate adjustment: <span class=\"hljs-subst\">{test_acc:<span class=\"hljs-number\">.4<\/span>f}<\/span>'<\/span>)\n\n<span class=\"hljs-comment\"># Plot the training history<\/span>\nplot_training_history(history)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Transfer learning is a valuable technique for leveraging pre-trained models to tackle new tasks efficiently and effectively. By using Keras and its support for pre-trained models, you can implement transfer learning with ease. This tutorial has covered the essential concepts and practical steps, including feature extraction, fine-tuning, and iterative model improvement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task. This is particularly useful when dealing with image data, as training deep neural networks from scratch can be computationally expensive and time-consuming. Keras, a popular high-level neural networks API [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[18,4,6],"tags":[],"class_list":["post-2096","post","type-post","status-publish","format-standard","category-artificial-intelligence","category-programming-languages","category-python","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Transfer Learning with Pre-trained Models in Keras<\/title>\n<meta name=\"description\" content=\"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Transfer Learning with Pre-trained Models in Keras\" \/>\n<meta property=\"og:description\" content=\"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-09T11:47:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-09T11:47:52+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"Using Transfer Learning with Pre-trained Models in Keras\",\"datePublished\":\"2024-07-09T11:47:49+00:00\",\"dateModified\":\"2024-07-09T11:47:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/\"},\"wordCount\":778,\"articleSection\":[\"Artificial Intelligence\",\"Programming Languages\",\"Python\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/\",\"name\":\"Using Transfer Learning with Pre-trained Models in Keras\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-07-09T11:47:49+00:00\",\"dateModified\":\"2024-07-09T11:47:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-transfer-learning-with-pre-trained-models-in-keras\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Artificial Intelligence\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/artificial-intelligence\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Using Transfer Learning with Pre-trained Models in Keras\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Transfer Learning with Pre-trained Models in Keras","description":"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/","og_locale":"en_US","og_type":"article","og_title":"Using Transfer Learning with Pre-trained Models in Keras","og_description":"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task","og_url":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/","article_published_time":"2024-07-09T11:47:49+00:00","article_modified_time":"2024-07-09T11:47:52+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"Using Transfer Learning with Pre-trained Models in Keras","datePublished":"2024-07-09T11:47:49+00:00","dateModified":"2024-07-09T11:47:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/"},"wordCount":778,"articleSection":["Artificial Intelligence","Programming Languages","Python"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/","url":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/","name":"Using Transfer Learning with Pre-trained Models in Keras","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-07-09T11:47:49+00:00","dateModified":"2024-07-09T11:47:52+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Transfer learning is a powerful technique in the field of machine learning where a pre-trained model is reused as the starting point for a new task","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/using-transfer-learning-with-pre-trained-models-in-keras\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Artificial Intelligence","item":"https:\/\/www.w3computing.com\/articles\/artificial-intelligence\/"},{"@type":"ListItem","position":3,"name":"Using Transfer Learning with Pre-trained Models in Keras"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=2096"}],"version-history":[{"count":1,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2096\/revisions"}],"predecessor-version":[{"id":2097,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2096\/revisions\/2097"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=2096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=2096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=2096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}