<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Reet</title>
    <description>The latest articles on DEV Community by Reet (@rnay).</description>
    <link>https://dev.to/rnay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2978926%2F132422e0-2ff3-42b6-a7ee-32b7b95057f3.png</url>
      <title>DEV Community: Reet</title>
      <link>https://dev.to/rnay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rnay"/>
    <language>en</language>
    <item>
      <title>Get started with deploying web apps on AWS</title>
      <dc:creator>Reet</dc:creator>
      <pubDate>Tue, 19 Aug 2025 09:27:57 +0000</pubDate>
      <link>https://dev.to/rnay/get-started-with-deploying-web-apps-on-aws-pm9</link>
      <guid>https://dev.to/rnay/get-started-with-deploying-web-apps-on-aws-pm9</guid>
      <description>&lt;h1&gt;
  
  
  A serverless To-Do Web Application on AWS
&lt;/h1&gt;

&lt;p&gt;This document outlines the steps to build and deploy a simple, serverless to-do application. The project uses a suite of AWS services to create a fully functional web app without managing any servers. The frontend has a minimalist, brutalist design and interacts with a serverless backend to manage tasks.&lt;/p&gt;

&lt;p&gt;This project is a great introduction to serverless architecture, demonstrating how to connect a static frontend to a dynamic, event-driven backend in the cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The application is built on a classic serverless pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Hosting:&lt;/strong&gt; An &lt;strong&gt;Amazon S3&lt;/strong&gt; bucket is configured to host the static web files (HTML, CSS, JavaScript).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Layer:&lt;/strong&gt; &lt;strong&gt;Amazon API Gateway&lt;/strong&gt; provides a RESTful API endpoint that the frontend can call. It acts as the front door to our backend logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend Logic:&lt;/strong&gt; An &lt;strong&gt;AWS Lambda&lt;/strong&gt; function, written in Python, contains all the business logic for creating, reading, updating, and deleting tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;, a NoSQL database, stores the tasks in a table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flow is straightforward: The user interacts with the website hosted on S3. The JavaScript on the site makes secure calls to API Gateway, which triggers the Lambda function. The Lambda function then executes the required logic and manipulates the data in the DynamoDB table.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Instructions
&lt;/h2&gt;

&lt;p&gt;Follow these steps carefully to deploy the application in your own AWS account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create the DynamoDB Table
&lt;/h3&gt;

&lt;p&gt;First, we need a database to store our tasks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Navigate to the &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; console.&lt;/li&gt;
&lt;li&gt; Click on &lt;strong&gt;Create table&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Set the &lt;strong&gt;Table name&lt;/strong&gt; to &lt;code&gt;ToDo_Tasks&lt;/code&gt;. This name must match exactly what is in the Lambda function code.&lt;/li&gt;
&lt;li&gt; For the &lt;strong&gt;Partition key&lt;/strong&gt;, enter &lt;code&gt;taskId&lt;/code&gt; and ensure its type is set to &lt;code&gt;String&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Leave all other settings as their default values and click &lt;strong&gt;Create table&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Create the IAM Role
&lt;/h3&gt;

&lt;p&gt;Our backend function will need permission to access the database. We will create an IAM role for this purpose.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Navigate to the &lt;strong&gt;IAM&lt;/strong&gt; console.&lt;/li&gt;
&lt;li&gt; Select &lt;strong&gt;Roles&lt;/strong&gt; from the side menu and click &lt;strong&gt;Create role&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; For the &lt;strong&gt;Trusted entity type&lt;/strong&gt;, select &lt;strong&gt;AWS service&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; For the &lt;strong&gt;Use case&lt;/strong&gt;, choose &lt;strong&gt;Lambda&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; On the "Add permissions" page, search for and attach the following two policies:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AWSLambdaBasicExecutionRole&lt;/code&gt; (This allows the function to write logs).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AmazonDynamoDBFullAccess&lt;/code&gt; (This grants full access to DynamoDB).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Set the &lt;strong&gt;Role name&lt;/strong&gt; to &lt;code&gt;TasksLambdaRole&lt;/code&gt; and click &lt;strong&gt;Create role&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Create the Lambda Function
&lt;/h3&gt;

&lt;p&gt;This is the core of our backend, containing the application logic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Navigate to the &lt;strong&gt;AWS Lambda&lt;/strong&gt; console.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Create function&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Select &lt;strong&gt;Author from scratch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Set the &lt;strong&gt;Function name&lt;/strong&gt; to &lt;code&gt;tasksManager&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; For the &lt;strong&gt;Runtime&lt;/strong&gt;, select a recent &lt;strong&gt;Python&lt;/strong&gt; version (e.g., Python 3.9).&lt;/li&gt;
&lt;li&gt; Expand the &lt;strong&gt;Change default execution role&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt; Select &lt;strong&gt;Use an existing role&lt;/strong&gt; and choose the &lt;code&gt;TasksLambdaRole&lt;/code&gt; you created in the previous step.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Create function&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Once the function is created, go to the &lt;strong&gt;Code source&lt;/strong&gt; editor and replace the default code with the full Python script for the application.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Deploy&lt;/strong&gt; button to save your code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Configure the API Gateway
&lt;/h3&gt;

&lt;p&gt;Next, we will create a public endpoint for our frontend to communicate with the Lambda function.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Navigate to the &lt;strong&gt;Amazon API Gateway&lt;/strong&gt; console.&lt;/li&gt;
&lt;li&gt; Find the &lt;strong&gt;REST API&lt;/strong&gt; option and click &lt;strong&gt;Build&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Select &lt;strong&gt;New API&lt;/strong&gt; and give it an &lt;strong&gt;API name&lt;/strong&gt;, such as &lt;code&gt;TasksAPI&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Create API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create the Resources and Methods:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Select the root (&lt;code&gt;/&lt;/code&gt;) resource, click &lt;strong&gt;Actions&lt;/strong&gt;, and choose &lt;strong&gt;Create Resource&lt;/strong&gt;. Name it &lt;code&gt;tasks&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;With the new &lt;code&gt;/tasks&lt;/code&gt; resource selected, click &lt;strong&gt;Actions&lt;/strong&gt; and &lt;strong&gt;Create Method&lt;/strong&gt;. Choose &lt;strong&gt;GET&lt;/strong&gt; from the dropdown. For the integration, select &lt;strong&gt;Lambda Function&lt;/strong&gt;, check the &lt;strong&gt;Use Lambda Proxy integration&lt;/strong&gt; box, and select your &lt;code&gt;tasksManager&lt;/code&gt; function. Save the method.&lt;/li&gt;
&lt;li&gt;Repeat the process to create a &lt;strong&gt;POST&lt;/strong&gt; method on the &lt;code&gt;/tasks&lt;/code&gt; resource, linking it to the same Lambda function.&lt;/li&gt;
&lt;li&gt;Now, select the &lt;code&gt;/tasks&lt;/code&gt; resource again, click &lt;strong&gt;Actions&lt;/strong&gt;, and &lt;strong&gt;Create Resource&lt;/strong&gt;. For the &lt;strong&gt;Resource Path&lt;/strong&gt;, enter &lt;code&gt;{taskId}&lt;/code&gt;. The curly braces are critical as they define a path parameter.&lt;/li&gt;
&lt;li&gt;On the new &lt;code&gt;/tasks/{taskId}&lt;/code&gt; resource, create &lt;strong&gt;PUT&lt;/strong&gt; and &lt;strong&gt;DELETE&lt;/strong&gt; methods, linking both to the same &lt;code&gt;tasksManager&lt;/code&gt; Lambda function with proxy integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enable CORS (Cross-Origin Resource Sharing):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Select the &lt;code&gt;/tasks&lt;/code&gt; resource, click &lt;strong&gt;Actions&lt;/strong&gt;, and select &lt;strong&gt;Enable CORS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the settings in the dialog box and click the &lt;strong&gt;Enable CORS...&lt;/strong&gt; button. This will automatically create an &lt;code&gt;OPTIONS&lt;/code&gt; method to handle preflight requests from the browser.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Deploy the API:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Actions&lt;/strong&gt; and select &lt;strong&gt;Deploy API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;[New Stage]&lt;/strong&gt; for the deployment stage and enter a name, such as &lt;code&gt;prod&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;After deployment, copy the &lt;strong&gt;Invoke URL&lt;/strong&gt;. You will need this for the frontend configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Prepare the Frontend Files
&lt;/h3&gt;

&lt;p&gt;On your local machine, create the three frontend files: &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, and &lt;code&gt;script.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crucially&lt;/strong&gt;, open the &lt;code&gt;script.js&lt;/code&gt; file and find the &lt;code&gt;API_ENDPOINT&lt;/code&gt; constant. Paste the &lt;strong&gt;Invoke URL&lt;/strong&gt; you copied from API Gateway as its value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example from script.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://xxxxxxxxx.execute-api.your-region.amazonaws.com/prod/tasks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Host the Website on S3
&lt;/h3&gt;

&lt;p&gt;Finally, we will upload our frontend files to S3 and make them publicly accessible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to the &lt;strong&gt;Amazon S3&lt;/strong&gt; console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create bucket&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a &lt;strong&gt;globally unique bucket name&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uncheck&lt;/strong&gt; the "Block all public access" box and acknowledge the warning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create bucket&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open your new bucket and go to the &lt;strong&gt;Properties&lt;/strong&gt; tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll down to &lt;strong&gt;Static website hosting&lt;/strong&gt; and click &lt;strong&gt;Edit&lt;/strong&gt;. Enable it, and set the &lt;strong&gt;Index document&lt;/strong&gt; to &lt;code&gt;index.html&lt;/code&gt;. Save your changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the &lt;strong&gt;Permissions&lt;/strong&gt; tab and edit the &lt;strong&gt;Bucket policy&lt;/strong&gt;. Paste the following JSON, replacing &lt;code&gt;YOUR_BUCKET_NAME&lt;/code&gt; with your actual bucket name.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PublicReadGetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::YOUR_BUCKET_NAME/*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save the policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;strong&gt;Objects&lt;/strong&gt; tab and upload your &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, and &lt;code&gt;script.js&lt;/code&gt; files.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Accessing Your Application
&lt;/h2&gt;

&lt;p&gt;To view your live application, return to the &lt;strong&gt;Properties&lt;/strong&gt; tab of your S3 bucket. Scroll down to the &lt;strong&gt;Static website hosting&lt;/strong&gt; section and click on the &lt;strong&gt;Bucket website endpoint&lt;/strong&gt; URL. Your serverless to-do application is now deployed and ready to use.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating Lambda functions and APIs in AWS and integrating them- Beginners Guide</title>
      <dc:creator>Reet</dc:creator>
      <pubDate>Thu, 01 May 2025 04:37:28 +0000</pubDate>
      <link>https://dev.to/rnay/integrating-lambda-and-api-gateway-in-aws-beginners-guide-2mld</link>
      <guid>https://dev.to/rnay/integrating-lambda-and-api-gateway-in-aws-beginners-guide-2mld</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AWS Lambda lets you run code without provisioning or managing servers&lt;/em&gt;, whereas&lt;br&gt;
&lt;em&gt;Amazon API Gateway is a fully managed service that makes it easy for developers to create, publish, maintain, monitor, and secure APIs.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h6&gt;
  
  
  In this beginners guide we will be creating a Lambda function, we will then create an API and integrate the API to the Lambda function (to invoke the lambda function through API calls). We will do all of this while being in the free tier.
&lt;/h6&gt;

&lt;h3&gt;
  
  
  1. Creating and testing the lambda function
&lt;/h3&gt;

&lt;h5&gt;
  
  
  • In AWS Console, search and open 'Lambda'
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • Click on &lt;code&gt;Create Function&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjvd2je67xrc8m19fx5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjvd2je67xrc8m19fx5j.png" alt="Image description" width="615" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  • In the new page, select &lt;code&gt;Author from scratch&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8gzmyuesoi58t1ba3mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8gzmyuesoi58t1ba3mi.png" alt="Image description" width="621" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  • Give  a name to the function
&lt;/h5&gt;

&lt;p&gt;In 'Runtime' you can give a programming language of your choice.&lt;br&gt;
Select the x86 instruction set architecture. Unless you are writing very low level stuff you can select arm64 too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foomfvxkdxmwbn79t40db.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foomfvxkdxmwbn79t40db.png" alt="Image description" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  • Hover into the &lt;code&gt;Code&lt;/code&gt; tab
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o4bwyffct4gub8m3gbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o4bwyffct4gub8m3gbw.png" alt="Image description" width="750" height="237"&gt;&lt;/a&gt;&lt;br&gt;
Here, you can write the code which you want the function to perform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3outzhtuyc9nkbfssoe9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3outzhtuyc9nkbfssoe9.png" alt="Image description" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After, every change, we use &lt;code&gt;Deploy&lt;/code&gt; to make the change effective.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Test&lt;/code&gt; is pretty self-explanatory, its used to test the code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your code may show different behaviour in &lt;code&gt;Test&lt;/code&gt; and &lt;code&gt;API Calls&lt;/code&gt; since Tests are not invoking HTTP Requests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paste the below code in the code editor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;# Parse JSON body
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid JSON body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no-message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;lambda_handler&lt;/code&gt; - loads the event body, and context object of the execution&lt;br&gt;
&lt;code&gt;event&lt;/code&gt; is the request body passed by the API gateway in a json format&lt;/p&gt;

&lt;p&gt;&lt;code&gt;body = json.loads(event.get("body", "{}"))&lt;/code&gt; - it first checks for the &lt;code&gt;body&lt;/code&gt; key in the event, if present, it returns the string present in it, which the &lt;code&gt;json.loads()&lt;/code&gt; function converts into a &lt;code&gt;(key,value)&lt;/code&gt; dictionary, if theres no &lt;code&gt;body&lt;/code&gt; key present, it loads an empty dictionary.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x = body.get("message", "no-message")&lt;/code&gt; - assign the value stored by the &lt;code&gt;message&lt;/code&gt; key to &lt;code&gt;x&lt;/code&gt;, if there's no &lt;code&gt;message&lt;/code&gt; key, assign &lt;code&gt;"no message"&lt;/code&gt; to &lt;code&gt;x&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;At last we return the message recieved by the API with a status code.&lt;/p&gt;
&lt;h5&gt;
  
  
  • Testing the code with &lt;code&gt;Test Events&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;Test events can be used to create various tests for our code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchww09eae7d5cxsglsnt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchww09eae7d5cxsglsnt.png" alt="Image description" width="374" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;+ Create new test event&lt;/code&gt;.&lt;br&gt;
A new pane in the code appears.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj9d9w0267bqllodtzam.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj9d9w0267bqllodtzam.png" alt="Image description" width="697" height="417"&gt;&lt;/a&gt;&lt;br&gt;
Give a name to the test (for now, we keep the tests private).&lt;br&gt;
Paste a valid test case like the case below -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Hello from client&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on &lt;code&gt;Save&lt;/code&gt; and then the play button next to the test event in the sidebar to perform tests.&lt;br&gt;
A more comprehensive way to handle tests is available in the &lt;code&gt;Test&lt;/code&gt; tab next to &lt;code&gt;Code&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Creating REST API and integrating it with Lambda function
&lt;/h3&gt;
&lt;h5&gt;
  
  
  • Search and open &lt;code&gt;API Gateway&lt;/code&gt;
&lt;/h5&gt;
&lt;h5&gt;
  
  
  • Scroll down to &lt;code&gt;REST API&lt;/code&gt; and select &lt;code&gt;Build&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zkwjj2l077rbzh1xm6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zkwjj2l077rbzh1xm6q.png" alt="Image description" width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  • Give a name to your API, scroll down and select &lt;code&gt;Create API&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3drb8e1saj5f2929qof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3drb8e1saj5f2929qof.png" alt="Image description" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  • Creating a Method
&lt;/h5&gt;

&lt;p&gt;Every API handles its tasks using different &lt;code&gt;HTTP Methods&lt;/code&gt;. Most popularly used htttp methods are &lt;code&gt;GET, POST, PUT, PATCH, and DELETE&lt;/code&gt;, these methods can perform &lt;code&gt;CRUD&lt;/code&gt; operations on the server.&lt;/p&gt;

&lt;p&gt;Therefore, we need to create &lt;code&gt;Methods&lt;/code&gt; which our API can handle.&lt;/p&gt;

&lt;p&gt;In the newly created API, select &lt;code&gt;Create method&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr17vm1948je06ldef7bf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr17vm1948je06ldef7bf.png" alt="Image description" width="341" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;Method type&lt;/code&gt; section, select &lt;code&gt;POST&lt;/code&gt; from the drop down menu.&lt;/p&gt;

&lt;p&gt;Select the &lt;code&gt;Integration type&lt;/code&gt; as &lt;em&gt;Lambda function&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Under the &lt;code&gt;Lambda function&lt;/code&gt; section, click on the search bar and select the lambda function created to integrate with the API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd1l3chv3qkmnar01czo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd1l3chv3qkmnar01czo.png" alt="Image description" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  • Testing the API Method
&lt;/h5&gt;

&lt;p&gt;In the method created, go to &lt;code&gt;Test&lt;/code&gt; tab&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2cvdei6c7izyvog3h56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2cvdei6c7izyvog3h56.png" alt="Image description" width="800" height="86"&gt;&lt;/a&gt;&lt;br&gt;
In the request body paste the following HTTP request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Hello from client&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5wr30oblneijuvbji7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5wr30oblneijuvbji7o.png" alt="Image description" width="752" height="147"&gt;&lt;/a&gt;&lt;br&gt;
and, click &lt;code&gt;Test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should see a response body like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffipxaj727xaotltrpi22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffipxaj727xaotltrpi22.png" alt="Image description" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  • Creating &lt;code&gt;Stages&lt;/code&gt; and Deploying the API
&lt;/h5&gt;

&lt;p&gt;&lt;em&gt;Stages are environments where you can deploy your API. Stages create a referecne to different lifecycles of the API, e.g. &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;, &lt;code&gt;beta&lt;/code&gt;, etc.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the sidebar, select &lt;code&gt;Stages&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlcjjnir2xuk82nn1rjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlcjjnir2xuk82nn1rjs.png" alt="Image description" width="226" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the stages section, select &lt;code&gt;Create stage&lt;/code&gt;, give a name to the stage, e.g. prod, test or dev, and select &lt;code&gt;*new stage*&lt;/code&gt; for stage deployement. The select &lt;code&gt;Create stage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the sidebar, select &lt;code&gt;Resources&lt;/code&gt; and click on &lt;code&gt;Deploy API&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndsvbzpj4sdm9f3k6jph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndsvbzpj4sdm9f3k6jph.png" alt="Image description" width="359" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your API is now live!&lt;/p&gt;
&lt;h5&gt;
  
  
  • Sending requests to the API
&lt;/h5&gt;

&lt;p&gt;In the &lt;code&gt;Stages&lt;/code&gt; section, copy the &lt;code&gt;Invoke url&lt;/code&gt;. This is the url created for a stage, to send requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4i5xvgf2oo5merxed8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4i5xvgf2oo5merxed8a.png" alt="Image description" width="565" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;a href="https://reqbin.com/" rel="noopener noreferrer"&gt;ReqBin&lt;/a&gt;, and paste the &lt;em&gt;invoke url&lt;/em&gt; and request &lt;em&gt;body&lt;/em&gt;, select &lt;code&gt;POST&lt;/code&gt; as request method type and &lt;code&gt;Send&lt;/code&gt; the request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb75kgxhat8eve3a7loxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb75kgxhat8eve3a7loxe.png" alt="Image description" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see a response like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml4z9wzjgcpy1femkt1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml4z9wzjgcpy1femkt1m.png" alt="Image description" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;
  
  
  Sending requests using &lt;em&gt;curl&lt;/em&gt; --
&lt;/h6&gt;

&lt;p&gt;Paste the below command in the command line (&lt;em&gt;curl&lt;/em&gt; should be installed) --&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&amp;lt;your-invoke-url&amp;gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"body": "{\"message\": \"Hello from Command Line\"}"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a reponse like this from AWS --&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"statusCode"&lt;/span&gt;: 200, &lt;span class="s2"&gt;"message"&lt;/span&gt;: &lt;span class="s2"&gt;"Hello from Command Line"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkljls8q76vhsg7bpluuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkljls8q76vhsg7bpluuy.png" alt="Image description" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>api</category>
      <category>apigateway</category>
      <category>lambda</category>
    </item>
    <item>
      <title>Quick &amp; easy way to clean and preprocess image dataset for Machine Learning</title>
      <dc:creator>Reet</dc:creator>
      <pubDate>Sat, 26 Apr 2025 07:37:06 +0000</pubDate>
      <link>https://dev.to/rnay/quick-easy-way-to-clean-and-preprocess-image-dataset-for-machine-learning-2knc</link>
      <guid>https://dev.to/rnay/quick-easy-way-to-clean-and-preprocess-image-dataset-for-machine-learning-2knc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Go to &lt;a href="https://github.com/ReetNayan/skin-melanoma-classification-using-dl-techniques/tree/master/cleaning%20and%20preprocessing" rel="noopener noreferrer"&gt;GitHub - Skin melanoma classification using DL Techniques&lt;/a&gt; for complete source code implementation&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Dataset Description:
&lt;/h3&gt;

&lt;p&gt;Name: Melanoma Skin Cancer Dataset of 10000 Images&lt;br&gt;
&lt;em&gt;Desc: This dataset contains two classes of melanoma cancer, malignant and benign.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Total size: 103.28mb&lt;/p&gt;

&lt;p&gt;Total files: 10.6k&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dataset files:&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;em&gt;type&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;train&lt;/th&gt;
&lt;th&gt;test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;benign&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;5000&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;malignant&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;4605&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;URL: &lt;a href="https://doi.org/10.34740/kaggle/dsv/3376422" rel="noopener noreferrer"&gt;https://doi.org/10.34740/kaggle/dsv/3376422&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Dataset Cleaning and Processing
&lt;/h3&gt;
&lt;h4&gt;
  
  
  2.1 Data Cleaning:
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Data cleaning aims to remove erroneous data from the dataset. We remove images that don't follow a strict set of rules (e.g. have entropy &amp;lt;8.0 and can be decoded correctly).&lt;/em&gt;&lt;br&gt;
Cleaning involves below checks to be performed on images:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. file jpeg signature check using magic number
2. file size thresold
3. image dimesion (must be 300x300)
        3.1 aspect ratio (must be 1)
4. Decoding validity (can the image be loaded)
5. Entropy check:
       For 24-bit RGB images, where each channel is 8-bit, 
       entropy can theoretically go up to: Max Entropy = 24.0 (8 bits × 3 channels),
       where R, G &amp;amp; B are the 3 channels,
       generally, images with entropy 12-15 should be inspected and 
       those having entropy &amp;gt;15 should be discarded

Checks discarded:
1. EXIF data check - no image had exif data &amp;amp; it wasn't required for this use case
2. Uniform color check - gave faulty results for almost all images
3. Progressive Loading Test (JPEG) - not needed for this case
4. Extension mismatch - the images had '.jpg' extension &amp;amp; all the files already had     'jpeg' signatures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2.1.1 File jpeg signature check using magic number
&lt;/h5&gt;

&lt;p&gt;File Signature (Magic Number):&lt;br&gt;
Check if the header bytes match the expected format (e.g., JPEG: FF D8, PNG: 89 50 4E 47).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sig_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;jpeg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\xFF\xD8\xFF&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sig_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Magic: OK (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2.1.2 File size thresold
&lt;/h5&gt;

&lt;p&gt;Unusually small or excessively large files might indicate corruption.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="n"&gt;max_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100000000&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size: Too small (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; B)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size: Too large (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; B)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size: OK (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; B)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2.1.3 Image dimension
&lt;/h5&gt;

&lt;p&gt;For our case we identify the images that aren't 300x300.&lt;br&gt;
Images not having size 300x300 are then checked if their &lt;code&gt;aspect ratio&lt;/code&gt; is 1 or not, they can be then treated accordingly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2.1.4 Decoding validity
&lt;/h5&gt;

&lt;p&gt;Attempt decoding using a reliable image library (e.g., OpenCV, Pillow). Any exceptions indicate corruption.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         &lt;span class="c1"&gt;# structural check
&lt;/span&gt;    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;           &lt;span class="c1"&gt;# pixel data check
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Decode: OK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Decode: ERR (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2.1.5 Entropy check
&lt;/h5&gt;

&lt;p&gt;Checks for very high detail or possibly random noise. Extremely low or high entropy may suggest compression issues or data corruption.&lt;/p&gt;

&lt;p&gt;For 24-bit RGB Images (max 8 bits of entropy in each of R G B channels) —&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entropy&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; 7.0&lt;/td&gt;
&lt;td&gt;Very low detail, possibly blank or flat&lt;/td&gt;
&lt;td&gt;🔴 Discard or review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0 – 12.0&lt;/td&gt;
&lt;td&gt;Normal range for real-world RGB images&lt;/td&gt;
&lt;td&gt;🟢 Accept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12.0 – 15.0&lt;/td&gt;
&lt;td&gt;High detail or noise&lt;/td&gt;
&lt;td&gt;🟡 Inspect if unusual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 15.0&lt;/td&gt;
&lt;td&gt;Highly random or corrupted (e.g., noise)&lt;/td&gt;
&lt;td&gt;🔴 Suspicious, review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 24.0&lt;/td&gt;
&lt;td&gt;Impossible for 8-bit RGB&lt;/td&gt;
&lt;td&gt;❌ Discard (bug or corruption)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️&lt;code&gt;After visual inspection of training images of the dataset chosen—&lt;/code&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Entropy of range 5.5 - 12.0 turned out fine.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;hist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;histogram&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hist&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;entropy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 7.0 – 12.0 is the acceptable entropy for colored 24-bit RGB
# but on visual inspection of training images, entropy range of
# 5.5 - 12.0 is also fine
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;entropy&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;entropy&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;12.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.2 Data Cleaning Verdict:
&lt;/h4&gt;

&lt;h6&gt;
  
  
  &lt;em&gt;All benign &amp;amp; malignant images in train and test were NOT Erroneous&lt;/em&gt;
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;All images returned the [1, 1, 1, 1, 1] array. Where:

&lt;ul&gt;
&lt;li&gt;the array returned represent &lt;code&gt;[valid_magic_number, valid_file_size, valid_image_structure_and_pixel_data, valid_dimensions, valid_entropy]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Verdict of benign training images —&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;benign&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Print&lt;/span&gt; &lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;Erroneous&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verdict of malignant training images —&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;malignant&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Print&lt;/span&gt; &lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;Erroneous&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.3 Data Preprocessing
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;To transform the data into a clean, consistent, and standardized format suitable for model training. &lt;br&gt;
Enhances data quality, reduce noise, and ensure uniformity across the dataset, thereby improving model performance and training efficiency.&lt;/em&gt;&lt;br&gt;
Below are the 4 methods used for data preprocessing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. image resizing (spatial normalization) (optional: all images are 300x300)
2. min-max normalization (pixel scaling) to [0, 1]
3. data augmentation
4. zero-centered normalization (standardization)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Library used - Tensorflow&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  2.3.1 Image resizing (spatial normalization)
&lt;/h5&gt;

&lt;p&gt;This resizes the image to a fixed width &amp;amp; height.&lt;br&gt;
This was needed because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ML models need a fixed-sized input tensors&lt;/li&gt;
&lt;li&gt;Prevents dimension mismatch errors during training
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Athough, for the dataset used, this was optional since all images were already 300x300.&lt;/p&gt;
&lt;h5&gt;
  
  
  2.3.2 Normalize to &lt;a href="https://dev.toor,%20Pixel%20scaling"&gt;0, 1&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;Converts pixel values from the typical 0–255 range to a [0, 1] float range.&lt;br&gt;
[0,1] normalization was needed because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Makes convergence faster
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h5&gt;
  
  
  2.3.3 Data augmentation
&lt;/h5&gt;

&lt;p&gt;Process of artificially increasing the size and diversity of your training dataset by applying random, label-preserving transformations to input images.&lt;br&gt;
Applies random transformations such as flipping, brightness, and contrast adjustments.&lt;br&gt;
Data augmentation was needed because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It increases the diversity of training data without needing more labeled samples.&lt;/li&gt;
&lt;li&gt;Helps models learn invariant features (e.g., object orientation doesn’t matter).&lt;/li&gt;
&lt;li&gt;Reduces overfitting.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random_flip_left_right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random_brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_delta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random_contrast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h5&gt;
  
  
  2.3.4 Zero-centered Normalization (or, Standardization)
&lt;/h5&gt;

&lt;p&gt;Centers pixel values around zero with unit variance &lt;code&gt;((x - mean) / std)&lt;/code&gt;.&lt;br&gt;
Transforms the pixel distribution to have mean = 0 and std = 1 for each channel.&lt;/p&gt;

&lt;p&gt;Zero-centred normalization was needed because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensures input distribution is balanced, which improves training stability.&lt;/li&gt;
&lt;li&gt;Faster convergence&lt;/li&gt;
&lt;li&gt;More stable gradient descent
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;per_image_standardization&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;⚠️&lt;em&gt;We have performed normalization 2 times.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Zero-centered normalization (or, Standardization) becomes neccessary after performing [0,1] Normalization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The values are first scaled from [0-255] to &lt;a href="https://dev.topixel%20scaling"&gt;0-1&lt;/a&gt; then we center them around a reference point (standardization) so the machine handles all inputs &lt;em&gt;symmetrically&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If we skip &lt;code&gt;scaling&lt;/code&gt;, standardization might be skewed due to large initial values.&lt;br&gt;
If we skip &lt;code&gt;standardization&lt;/code&gt;, optimization may be suboptimal — some channels may dominate learning.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  2.4 Building &lt;em&gt;image classification dataset pipeline&lt;/em&gt; after preprocessing
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_tf_dataset_pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;image_dataset_from_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inferred&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# Infers labels from subfolder names
&lt;/span&gt;        &lt;span class="n"&gt;label_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;int&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# Labels are marked as integer indices
&lt;/span&gt;        &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="c1"&gt;# Return individual (img, label) pairs for custom pipeline
&lt;/span&gt;        &lt;span class="n"&gt;image_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# Optional: initially resizes (we’ll override this later)
&lt;/span&gt;        &lt;span class="n"&gt;shuffle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resize_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalize_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;augment_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;standardize_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Returns: A dataset of image tensors.
The returned value is an object of the class tensorflow.python.data.ops.map_op._MapDataset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h6&gt;
  
  
  tf.keras.utils.image_dataset_from_directory() arguments:
&lt;/h6&gt;

&lt;p&gt;&lt;code&gt;directory&lt;/code&gt; - specify the directory of the dataset to be preprocessed, in our case, its, &lt;em&gt;/dataset/train/&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;batch_size&lt;/code&gt; - defines how many images to process at once&lt;/p&gt;

&lt;p&gt;&lt;code&gt;label_mode&lt;/code&gt; - set to &lt;code&gt;int&lt;/code&gt;, defines that the labels will be marked like 0,1,2,3,....&lt;br&gt;
e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    (directory) dataset/train/
                             ├── benign      # label 0
                             ├── malignant   # label 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;labels='inferred'&lt;/code&gt; - infer the labels from the name of the subfolders&lt;/p&gt;

&lt;p&gt;&lt;code&gt;image_size&lt;/code&gt; - sets the image size&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shuffle&lt;/code&gt; - randomizes the dataset order (buffer size = 1000), prevents learning sequence bias&lt;/p&gt;

&lt;p&gt;The image is transformed in memory inside the pipeline — it's just passed along to the next &lt;code&gt;map()&lt;/code&gt; stage.&lt;br&gt;
Each stage of the pipeline (like &lt;code&gt;.map(normalize_image), .map(augment_image)&lt;/code&gt;) creates a new transient image tensor for that step.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The returned &lt;code&gt;tensorflow.python.data.ops.map_op._MapDataset&lt;/code&gt; object contains image tensors with labels, this object can now be passed for model training. &lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>machinelearning</category>
      <category>tensorflow</category>
      <category>deeplearning</category>
    </item>
  </channel>
</rss>
