<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[AI for Mortals by Carlos Cortez]]></title><description><![CDATA[Hi #MyDearMortals, This is a site where you will learn the world of AI, ML and Reinforcement Learning from scratch, and  to use it on AWS. I am learning and I am sharing at the same time.]]></description><link>https://aiformortals.cortez.cloud</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1617308431421/cecgid2pm.png</url><title>AI for Mortals by Carlos Cortez</title><link>https://aiformortals.cortez.cloud</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 08:41:23 GMT</lastBuildDate><atom:link href="https://aiformortals.cortez.cloud/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Starting with NLP on AWS from scratch — NLP Series part 1 | by Carlos Cortez | Breaking the Cloud]]></title><description><![CDATA[It would be great to start segmenting our texts as well as the cover image, which is an Open Source software called Coreference created by Hugging Face, right? Let's go in parts ...
In case you are interested in hearing about Hugging Face and SageMak...]]></description><link>https://aiformortals.cortez.cloud/starting-with-nlp-on-aws-from-scratch-1</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/starting-with-nlp-on-aws-from-scratch-1</guid><category><![CDATA[AWS]]></category><category><![CDATA[nlp]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Mon, 12 Apr 2021 05:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302709275/PlOSJI-uD.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It would be great to start segmenting our texts as well as the cover image, which is an Open Source software called Coreference created by Hugging Face, right? Let's go in parts ...</p>
<p>In case you are interested in hearing about Hugging Face and SageMaker, I spoke in depth a few days ago about this topic and its recent alliance with AWS here:</p>
<h2 id="the-learning-curve">The learning curve</h2>
<p>The learning curve is long and can get complex if we want to. For that there are flows and frameworks that will help us know where we are right now.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302701101/3HmIhkMah.png" alt /></p>
<ul>
<li>Natural Language Processing (NLP) flow *</li>
</ul>
<p>Many times we skip key steps before we really understand each of these procedures. For example, data ingestion, web scraping, text analytics, EDA (exploratory analysis, and much more)</p>
<h2 id="remember-crisp-dm">Remember CRISP-DM?</h2>
<p>It is a framework for data mining, which is now known more as Machine Learning, Deep Learning, Data Science, etc.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302702643/DZ3Jz2N1r.png" alt /></p>
<h2 id="essentials-to-get-started-on-aws">Essentials to get started on AWS</h2>
<p>Always to each place we go, we keep this pair in our pocket:</p>
<ul>
<li>Python 3.x + boto3 *</li>
</ul>
<p><strong> Boto3 </strong>, is the AWS python library that will give us access to run and manage any resource within the cloud, as simple as <strong> import boto3, </strong> and have your private keys configured or your roles correctly created .</p>
<h2 id="pre-trained-models">Pre-trained models</h2>
<p>Pre-trained models help us to shorten research, training and analysis time, and not start inventing what already exists. and for this we can use cloud services.</p>
<p><strong> Amazon Comprehend (Applied NLP) </strong>, It is a SaaS type service, which means that it is ready to consume an API with the AWS boto3 library and begin to obtain insights from the data. It contains models already trained by Amazon Web Services, which we can reuse to start our own, and we will start knowing this great service and start building interesting applications using other AWS services.</p>
<p><strong> Hugging Face (advanced) </strong>, later we will play with transformers, tokenizers, and more with these Deep Learning models of Hugging Face.</p>
<h2 id="build-your-own-models">Build your own models:</h2>
<p>Once we have a good understanding of NLP's self-managed cloud services, we can move to the next level with Amazon Sagemaker.</p>
<p>Or, with your own containers, which we will also learn, or locally</p>
<h2 id="nlp-open-source-libraries">NLP Open Source Libraries</h2>
<p>I will mention these for now and we will surely know more than 2 of this list in the coming months:</p>
<ul>
<li><p>NLTK</p>
</li>
<li><p>Spark NLP</p>
</li>
<li><p>CoreNLP</p>
</li>
<li><p>SpaCy</p>
</li>
<li><p>Pytorch</p>
</li>
<li><p>Tensorflow</p>
</li>
<li><p>etc..</p>
</li>
</ul>
<h2 id="tools-and-ides">Tools and IDEs</h2>
<p>From now on we will begin to know and learn step by step, what it is like to work in the cloud with an IDE for Data Science, and learn about AI services on AWS.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302704296/VhO8Biq_S.png" alt /></p>
<p>I recommend taking a look at the following, some paid and some free.</p>
<ol>
<li><p>Sagemaker Studio / Sagemaker Notebooks</p>
</li>
<li><p>Jupyter Notebooks / Jupyter Lab</p>
</li>
<li><p>Databricks</p>
</li>
<li><p>Google Colab</p>
</li>
<li><p>among others ...</p>
</li>
</ol>
<p>To start for free, I suggest <strong> Databricks and Colab </strong>, the first one, has a community platform that allows you to create free clusters and they are eliminated if you do not use it for limited times, and Google's Colab, you can run it directly on your Google Drive, at no cost.</p>
<h2 id="deployment-of-my-models-in-the-cloud">Deployment of my models in the cloud</h2>
<p>It is not yet time to think about deploying, and yes, we will find many, many ways to do it, from the oldest to the most modern.</p>
<ul>
<li><p>Traditional servers (VMs, Bare Metal)</p>
</li>
<li><p>Containers (such as AWS ECS, EKS, Fargate)</p>
</li>
<li><p>Without Servers (Functions as a Service)</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302705945/LwB3XTNac.png" alt /></p>
<p>This is a very good way to start, putting together serverless and Sagemaker.</p>
<h2 id="think-serverless-first">Think Serverless First</h2>
<p>Now we can start working without having to run servers using AWS Lambda, AWS Step Functions, Sagemaker Pipelines, AWS CodePipeline, which are services already deployed in the cloud that we can use to speed up our development and start-up.</p>
<p>In the following posts we learn how to deploy with AWS Lambda and Amazon Comprehend.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1617302707534/bVlD5Vv-i.png" alt /></p>
<h2 id="amazon-comprehend-and-its-superpowers">Amazon Comprehend and its superpowers</h2>
<p>Can you imagine something as simple as writing a few lines of code to create a word detector and phrase extraction in just a few minutes instead of many hours of research? It is possible if you start to take advantage of Amazon Comprehend, a little Python and a couple of drops of Serverless</p>
<p>Phrase extraction:</p>
<p>We are using Python 3.6 here with boto3, the library</p>
<pre><code>response <span class="hljs-strong">**=**</span> client<span class="hljs-strong">**.**</span>detect<span class="hljs-emphasis">_key_</span>phrases(

Text=’string’,

LanguageCode=’en’|’es’

)
</code></pre><p>Extraction of Entities, sentiment, language, syntax, topics, and document classification, are some of the additional things that we are going to do with Comprehend, as well as a specific version for Medicine, called <strong> Amazon Comprehend Medical </strong></p>
<h2 id="what-do-we-continue-with">What do we continue with?</h2>
<p>Data ingestion and text Analytics is part of the important bases to understand NLP, so in the next post, we will start to build our first data ingestion of a web, to be able to obtain data, texts, titles, in a data frame to play.</p>
<p><strong> Next post: (on air on April 02) </strong></p>
<p>(Post Original: <a target="_blank" href="https://ccortezb.medium.com/empezando-con-nlp-en-aws-desde-cero-nlp-series-parte-1-por-carlos-cortez-breaking-the-cloud-13da2adc0151">Medium</a> and 
<a target="_blank" href="https://dev.cortez.cloud/posts/empezando-con-nlp-en-aws-desde-cero-nlp-series-1-3nak/">Dev.cortez.cloud</a> )</p>
<p>If you liked this post, give it a like, share and comment.</p>
<h2 id="learn-by-breaking-things">Learn by breaking things.</h2>
<p>Subscribe to my channel, Breaking the Cloud and be Up to date with AWS at <a target="_blank" href="https://cortez.cloud/">https://cortez.cloud</a></p>
<p>⭐Subscribe to my channel : <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>videos, AWS news, analytics, reviews, demos, workshops</p>
<h2 id="sigueme-en-mis-redes">🔥🔥 Sígueme en mis redes 🔥🔥</h2>
<p>follow me:</p>
<p>🦜 My Twitter: <a target="_blank" href="https://twitter.com/ccortezb">https://twitter.com/ccortezb</a></p>
<p>📺 Youtube Channel: <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>📺 AWSUGPerú: <a target="_blank" href="https://www.youtube.com/awsusergroupperuoficial">https://www.youtube.com/awsusergroupperuoficial</a></p>
<p>📟 My Facebook: <a target="_blank" href="https://www.facebook.com/ccortezb/">https://www.facebook.com/ccortezb/</a></p>
<p>🤳 My Instagram: ccortezbazan</p>
<p>📜My AWS Courses: <a target="_blank" href="https://cennticloud.thinkific.com/">https://cennticloud.thinkific.com</a></p>
<p>🕮 My blog — <a target="_blank" href="https://cortez.cloud/">cortez.cloud</a></p>
<p>Thank you very much, I hope we see each other again</p>
<h2 id="about-me">🔥🔥 About me 🔥🔥</h2>
<p><a target="_blank" href="https://www.cortez.cloud/whoami">Cortez.Cloud/whoami</a></p>
<p>Let me  present to you, my little personal website <a target="_blank" href="https://www.cortez.cloud/">https://www.Cortez.Cloud</a> called “Breaking the Cloud”.</p>
<p>I will continue to create content each week from AWS on Al / ML, Serverless, Security and how to break the rules!</p>
<p>Also my next initiatives, workshops, courses, free videos, awsugperu and more. </p>
]]></content:encoded></item><item><title><![CDATA[Crear un API rest de Análisis de sentimiento con SAM y Amazon Comprehend | NLP Series parte 3]]></title><description><![CDATA[Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4
📢 Leveleando nuestro guerrero 3 niveles hoy!
Soy Carlos Cortez y bienvenidos a la tercera entrega de estas series, pero, ¿qué me estás contando? Vamos a por 3 niveles más!, hoy aprenderemo...]]></description><link>https://aiformortals.cortez.cloud/crear-un-api-rest-de-analisis-de-sentimiento-con-sam-y-amazon-comprehend-nlp-series-parte-3-8971ba151a89</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/crear-un-api-rest-de-analisis-de-sentimiento-con-sam-y-amazon-comprehend-nlp-series-parte-3-8971ba151a89</guid><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Thu, 08 Apr 2021 03:50:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031573336/_G3rLkKwy.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4</p>
<h2 id="leveleando-nuestro-guerrero-3-niveles-hoy">📢 Leveleando nuestro guerrero 3 niveles hoy!</h2>
<p>Soy Carlos Cortez y bienvenidos a la tercera entrega de estas series, pero, ¿qué me estás contando? Vamos a por 3 niveles más!, hoy aprenderemos las bases de Comprehend y de cómo analizar sentimientos, así como extraer las entidades de los textos, usando un modelo pre entrenado de Amazon Comprehend.</p>
<p>Al mismo tiempo, hago Referencia a unas series en paralelo sobre Serverless, llamadas: Away from Servers, porque hoy también repasamos API rest en AWS y codificaremos una plantilla de AWS SAM, el marco de trabajo de amazon web services para gestionar la configuración de nuestras aplicaciones sin servidor.</p>
<p>Además de estos 4 servicios, aprenderemos más sobre boto3, y Python.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031557766/g3ziWq_Zq.png" alt="Fuente: Imagen creada por Carlos Cortez, NLP Series parte 3" /><em>Fuente: Imagen creada por Carlos Cortez, NLP Series parte 3</em></p>
<h2 id="pasar-a-level-2-es-tarea-sencilla">🧩 Pasar a level 2 es tarea sencilla</h2>
<p>Puedes elegir entre, desarrollar el <strong><em>nivel 2, nivel 3 o nivel 4</em></strong> que veremos más abajo en este episodio, en los 3 lograrás el mismo resultado, que es aprender sobre Amazon Comprehend.</p>
<p><strong>OJO</strong>: Siempre es necesario un rol, un permiso, una política cuando creamos un Lambda, en este caso estaremos usando Full Access para Comprehend en IAM.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031559573/qniobgZ9B.png" alt /></p>
<p><strong>El nivel 2</strong>, trata principalmente de crear una función lambda en la consola de AWS directamente y conectarla con Amazon Comprehend, luego definir un evento de prueba con un JSON y empezar a jugar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031561194/o8Y1845Zn.png" alt="Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 2" /><em>Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 2</em></p>
<p>Usemos esta función para darle vida a nuestro Lambda,</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json
<span class="hljs-keyword">import</span> boto3

<span class="hljs-comment">#Using boto3 to call the Comprehend API</span>
client = boto3.client(<span class="hljs-string">'comprehend'</span>)

<span class="hljs-comment">#Lambda function to work with Comprehend</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-params">event, context</span>):</span>

    print(<span class="hljs-string">"event puro:"</span>, event)
    <span class="hljs-comment">#Accessing data</span>
    puro = json.dumps(event) <span class="hljs-comment">#intentando cambiar aqui sino vuelvo a la linea 13</span>
    text = puro[<span class="hljs-number">0</span>]
    json_object = json.loads(puro)
    print(<span class="hljs-string">"texto a analizar: "</span>, json_object[<span class="hljs-string">"body"</span>])
    Body = json.dumps(json_object[<span class="hljs-string">"body"</span>])
    print(<span class="hljs-string">"Body:"</span>, Body)


    <span class="hljs-comment">#Sentiment Analysis</span>
    print(<span class="hljs-string">"iniciando analisis de sentimiento...."</span>)
    sentiment = client.detect_sentiment(Text = Body, LanguageCode = <span class="hljs-string">'en'</span>) <span class="hljs-comment">#API call for sentiment analysis</span>
    sentRes = sentiment[<span class="hljs-string">'Sentiment'</span>] <span class="hljs-comment">#Positive, Neutral, or Negative</span>
    sentScore = sentiment[<span class="hljs-string">'SentimentScore'</span>] <span class="hljs-comment">#Percentage of Positive, Neutral, and Negative</span>
    print(sentRes)
    print(sentScore)

    print(<span class="hljs-string">"iniciando extraccion de entidades...."</span>)
    <span class="hljs-comment">#Entity Extraction</span>
    entities = client.detect_entities(Text = Body, LanguageCode = <span class="hljs-string">'en'</span>) <span class="hljs-comment">#API call for entity extraction</span>
    entities = entities[<span class="hljs-string">'Entities'</span>] <span class="hljs-comment">#all entities</span>
    print(entities)
    textEntities = [dict_item[<span class="hljs-string">'Text'</span>] <span class="hljs-keyword">for</span> dict_item <span class="hljs-keyword">in</span> entities] <span class="hljs-comment">#the text that has been identified as entities</span>
    typeEntities = [dict_item[<span class="hljs-string">'Type'</span>] <span class="hljs-keyword">for</span> dict_item <span class="hljs-keyword">in</span> entities] <span class="hljs-comment">#the type of entity the text is</span>
    print(textEntities)
    print(typeEntities)


    <span class="hljs-keyword">return</span> {
        <span class="hljs-string">'statusCode'</span>: <span class="hljs-number">200</span>,
        <span class="hljs-string">'body'</span>: str(sentiment) + str(entities) <span class="hljs-comment">#body returned from our function</span>
    }
</code></pre>
<p>Explicación:</p>
<ol>
<li><p>LÍNEA 12 extraemos el JSON del evento</p>
</li>
<li><p>LÍNEA 20, detectamos el sentimiento sea positivo negativo o neutral</p>
</li>
<li><p>LÍNEA 28: extraemos las entidades detectadas definidas por AWS</p>
</li>
</ol>
<p>Las pruebas aquí son más sencillas, usando la IDE de Cloud9 en Lambda directo en la consola:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031562761/ofBGxrrAW.png" alt /></p>
<p>Y agregar el evento, es muy rápido, en el level 3 y 4 verán maneras más óptimas de realizar esta prueba. Pueden pasar directo allá.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031564413/omW__igxt5.png" alt /></p>
<h2 id="si-pasaste-el-nivel-2-ahora-en-nivel-3-completamos-el-backend">🧩 Si pasaste el nivel 2, ahora en nivel 3 completamos el Backend</h2>
<p>Al adicionar la capa de API rest vamos a darle más cuerpo a nuestra solución. Además como arquitectos de soluciones que somos o queremos ser, tenemos que construir aplicaciones resilientes, escalables y altamente disponibles. Para ello implementamos una capa de API que nos permita escalar. Más adelante nos servirá para agregar seguridad como Cognito, CORS, Caché, custom headers.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031566157/dSe1dnXZK.png" alt="Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 3" /><em>Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 3</em></p>
<p>No vamos a detallar esta etapa, porque será mucho más genial en nivel 4, pero sí mencionar que probar con API Gateway es mucho más eficiente desde un terminal o una aplicación como Postman. (<a target="_blank" href="https://www.postman.com/">https://www.postman.com/</a>)</p>
<h2 id="nivel-4-evolucionando-a-sam">🧩 Nivel 4: ¡Evolucionando a SAM!</h2>
<p>Llegó la hora, dejen de ver y pongámonos a trabajar aquí, que esta es la parte más interesante.</p>
<p>Los marcos de trabajo para aplicaciones sin servidor, están tomando un lugar más frecuente en el desarrollo de servicios, AWS SAM llegó algo tarde, y es la opción nativa dentro de los servicios de Amazon Web Services que compite con grandes como Serverless Framework, Chalice, Amplify, pulumi, etc.</p>
<p>No se preocupen, en las series dedicadas a Serverless, nos pelearemos con otros frameworks y veremos qué tan divertido es usarlos! Ahora, me enfocaré en subir a mi nivel 4!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031567801/ORDHOzAeN.png" alt="Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4" /><em>Fuente: Imagen creada por Carlos Cortez, AWS Warrior Level 4</em></p>
<p>Cada vez que hago un cambio, se construye toda mi aplicación desde cero. Invierto menos tiempo configurando la consola, que no debería tocarla ni verla más, y me dedico a mejorar el código e integrarlo con más servicios.</p>
<h2 id="actualizar-sam-cli">🧩 Actualizar sam-cli</h2>
<p>Puedes usar una versión más actual si lo prefieres, en este caso:</p>
<pre><code class="lang-shell">➜  comprehend-nlp01 brew upgrade aws-sam-cli

Warning: aws/tap/aws-sam-cli 1.13.2 already installed
</code></pre>
<p>crear ambiente virtual de python 3.6, (yo tengo múltiples versiones)</p>
<pre><code class="lang-shell">➜  comprehend-nlp01 virtualenv -p `which python3.6` nlp01


created virtual environment CPython3.6.5.final.0-64 in 486ms
  creator CPython3Posix(dest=/Users/carlos/repos/cc/nlp/comprehend-nlp01/nlp01, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/carlos/Library/Application Support/virtualenv)
    added seed packages: pip==20.1.1, setuptools==47.3.1, wheel==0.34.2
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
</code></pre>
<p>Iniciamos un template vacío de SAM para Python 3.6</p>
<pre><code><span class="hljs-string">**➜</span> <span class="hljs-string">comprehend-nlp01</span> <span class="hljs-string">source</span> <span class="hljs-string">nlp01/bin/activate**</span>

<span class="hljs-string">(nlp01)</span> <span class="hljs-string">➜</span> <span class="hljs-string">comprehend-nlp01</span> <span class="hljs-string">python</span> <span class="hljs-string">—</span> <span class="hljs-string">version</span>

<span class="hljs-string">Python</span> <span class="hljs-number">3.6</span><span class="hljs-number">.5</span>
</code></pre><h2 id="inicializamos-sam">🧩 Inicializamos SAM</h2>
<pre><code>(nlp01) ➜ comprehend-nlp01 sam <span class="hljs-keyword">init</span>
</code></pre><p>Elegimos un template por default:</p>
<pre><code><span class="hljs-string">Which</span> <span class="hljs-string">template</span> <span class="hljs-string">source</span> <span class="hljs-string">would</span> <span class="hljs-string">you</span> <span class="hljs-string">like</span> <span class="hljs-string">to</span> <span class="hljs-string">use?</span>

<span class="hljs-number">1</span> <span class="hljs-string">—</span> <span class="hljs-string">AWS</span> <span class="hljs-string">Quick</span> <span class="hljs-string">Start</span> <span class="hljs-string">Templates</span>

<span class="hljs-number">2</span> <span class="hljs-string">—</span> <span class="hljs-string">Custom</span> <span class="hljs-string">Template</span> <span class="hljs-string">Location</span>

<span class="hljs-attr">Choice:</span> <span class="hljs-number">1</span>

<span class="hljs-string">Which</span> <span class="hljs-string">runtime</span> <span class="hljs-string">would</span> <span class="hljs-string">you</span> <span class="hljs-string">like</span> <span class="hljs-string">to</span> <span class="hljs-string">use?</span>

<span class="hljs-number">1</span> <span class="hljs-string">—</span> <span class="hljs-string">nodejs12.x</span>

<span class="hljs-number">2</span> <span class="hljs-string">—</span> <span class="hljs-string">python3.8</span>

<span class="hljs-number">3</span> <span class="hljs-string">—</span> <span class="hljs-string">ruby2.7</span>

<span class="hljs-number">4</span> <span class="hljs-string">—</span> <span class="hljs-string">go1.x</span>

<span class="hljs-number">5</span> <span class="hljs-string">—</span> <span class="hljs-string">java11</span>

<span class="hljs-number">6</span> <span class="hljs-string">—</span> <span class="hljs-string">dotnetcore3.1</span>

<span class="hljs-number">7</span> <span class="hljs-string">—</span> <span class="hljs-string">nodejs10.x</span>

<span class="hljs-number">8</span> <span class="hljs-string">—</span> <span class="hljs-string">python3.7</span>

<span class="hljs-number">9</span> <span class="hljs-string">—</span> <span class="hljs-string">python3.6</span>

<span class="hljs-number">10</span> <span class="hljs-string">—</span> <span class="hljs-string">python2.7</span>

<span class="hljs-number">11</span> <span class="hljs-string">—</span> <span class="hljs-string">ruby2.5</span>

<span class="hljs-number">12</span> <span class="hljs-string">—</span> <span class="hljs-string">java8</span>

<span class="hljs-number">13</span> <span class="hljs-string">—</span> <span class="hljs-string">dotnetcore2.1</span>

<span class="hljs-number">14</span> <span class="hljs-string">—</span> <span class="hljs-string">dotnetcore2.0</span>

<span class="hljs-number">15</span> <span class="hljs-string">—</span> <span class="hljs-string">dotnetcore1.0</span>

<span class="hljs-attr">Runtime:</span> <span class="hljs-number">9</span>

<span class="hljs-string">Project</span> <span class="hljs-string">name</span> [<span class="hljs-string">sam-app</span>]<span class="hljs-string">:</span> <span class="hljs-string">comprehend-01-nlpseries-ep-3</span>

<span class="hljs-string">Cloning</span> <span class="hljs-string">app</span> <span class="hljs-string">templates</span> <span class="hljs-string">from</span> <span class="hljs-string">https://github.com/awslabs/aws-sam-cli-app-templates.git</span>

<span class="hljs-attr">AWS quick start application templates:</span>

<span class="hljs-number">1</span> <span class="hljs-string">—</span> <span class="hljs-string">Hello</span> <span class="hljs-string">World</span> <span class="hljs-string">Example</span>

<span class="hljs-number">2</span> <span class="hljs-string">—</span> <span class="hljs-string">EventBridge</span> <span class="hljs-string">Hello</span> <span class="hljs-string">World</span>

<span class="hljs-number">3</span> <span class="hljs-string">—</span> <span class="hljs-string">EventBridge</span> <span class="hljs-string">App</span> <span class="hljs-string">from</span> <span class="hljs-string">scratch</span> <span class="hljs-string">(100+</span> <span class="hljs-string">Event</span> <span class="hljs-string">Schemas)</span>

<span class="hljs-number">4</span> <span class="hljs-string">—</span> <span class="hljs-string">Step</span> <span class="hljs-string">Functions</span> <span class="hljs-string">Sample</span> <span class="hljs-string">App</span> <span class="hljs-string">(Stock</span> <span class="hljs-string">Trader)</span>

<span class="hljs-attr">Template selection:</span> <span class="hljs-number">1</span>

 <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-bullet">-</span>

<span class="hljs-attr">Generating application:</span>

 <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-string">—</span> <span class="hljs-bullet">-</span>

<span class="hljs-attr">Name:</span> <span class="hljs-string">comprehend-01-nlpseries-ep-3</span>

<span class="hljs-attr">Runtime:</span> <span class="hljs-string">python3.6</span>

<span class="hljs-attr">Dependency Manager:</span> <span class="hljs-string">pip</span>

<span class="hljs-attr">Application Template:</span> <span class="hljs-string">hello-world</span>

<span class="hljs-attr">Output Directory:</span> <span class="hljs-string">.</span>

<span class="hljs-string">Next</span> <span class="hljs-string">steps</span> <span class="hljs-string">can</span> <span class="hljs-string">be</span> <span class="hljs-string">found</span> <span class="hljs-string">in</span> <span class="hljs-string">the</span> <span class="hljs-string">README</span> <span class="hljs-string">file</span> <span class="hljs-string">at</span> <span class="hljs-string">./comprehend-01-nlpseries-ep-3/README.md</span>
</code></pre><p>Errores de compatibilidad a la hora de crear los templates</p>
<pre><code><span class="hljs-attribute">Error</span>: Permission denied @ apply2files — /usr/local/lib/node_modules/<span class="hljs-variable">@aws-amplify</span>/cli/node_modules/extglob/lib/.DS_Store
</code></pre><p>No debemos darle permisos a todo, salvo lo necesario</p>
<p><strong>Solución:</strong></p>
<pre><code>sudo <span class="hljs-keyword">chown</span> -R ${LOGNAME}:staff /usr/<span class="hljs-keyword">local</span>/lib/node_modules
</code></pre><p>Aquí vamos a modificar varios archivos,</p>
<p><strong>App.py</strong> es el archivo principal, que será el Lambda que usamos, el mismo del nivel 2 y 3!</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json
<span class="hljs-keyword">import</span> boto3

<span class="hljs-comment">#Using boto3 to call the Comprehend API</span>
client = boto3.client(<span class="hljs-string">'comprehend'</span>)

<span class="hljs-comment">#Lambda function to work with Comprehend</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">lambda_handler</span>(<span class="hljs-params">event, context</span>):</span>

    print(<span class="hljs-string">"event puro:"</span>, event)
    <span class="hljs-comment">#Accessing data</span>
    puro = json.dumps(event) <span class="hljs-comment">#intentando cambiar aqui sino vuelvo a la linea 13</span>
    text = puro[<span class="hljs-number">0</span>]
    json_object = json.loads(puro)
    print(<span class="hljs-string">"texto a analizar: "</span>, json_object[<span class="hljs-string">"body"</span>])
    Body = json.dumps(json_object[<span class="hljs-string">"body"</span>])
    print(<span class="hljs-string">"Body:"</span>, Body)


    <span class="hljs-comment">#Sentiment Analysis</span>
    print(<span class="hljs-string">"iniciando analisis de sentimiento...."</span>)
    sentiment = client.detect_sentiment(Text = Body, LanguageCode = <span class="hljs-string">'en'</span>) <span class="hljs-comment">#API call for sentiment analysis</span>
    sentRes = sentiment[<span class="hljs-string">'Sentiment'</span>] <span class="hljs-comment">#Positive, Neutral, or Negative</span>
    sentScore = sentiment[<span class="hljs-string">'SentimentScore'</span>] <span class="hljs-comment">#Percentage of Positive, Neutral, and Negative</span>
    print(sentRes)
    print(sentScore)

    print(<span class="hljs-string">"iniciando extraccion de entidades...."</span>)
    <span class="hljs-comment">#Entity Extraction</span>
    entities = client.detect_entities(Text = Body, LanguageCode = <span class="hljs-string">'en'</span>) <span class="hljs-comment">#API call for entity extraction</span>
    entities = entities[<span class="hljs-string">'Entities'</span>] <span class="hljs-comment">#all entities</span>
    print(entities)
    textEntities = [dict_item[<span class="hljs-string">'Text'</span>] <span class="hljs-keyword">for</span> dict_item <span class="hljs-keyword">in</span> entities] <span class="hljs-comment">#the text that has been identified as entities</span>
    typeEntities = [dict_item[<span class="hljs-string">'Type'</span>] <span class="hljs-keyword">for</span> dict_item <span class="hljs-keyword">in</span> entities] <span class="hljs-comment">#the type of entity the text is</span>
    print(textEntities)
    print(typeEntities)


    <span class="hljs-keyword">return</span> {
        <span class="hljs-string">'statusCode'</span>: <span class="hljs-number">200</span>,
        <span class="hljs-string">'body'</span>: str(sentiment) + str(entities) <span class="hljs-comment">#body returned from our function</span>
    }
</code></pre>
<p>Luego, el <strong>template.yaml</strong> que es dónde se definirá la estructura de nuestra aplicación serverless con API Gateway y Lambda.</p>
<pre><code class="lang-yaml"><span class="hljs-attr">AWSTemplateFormatVersion:</span> <span class="hljs-string">'2010-09-09'</span>
<span class="hljs-attr">Transform:</span> <span class="hljs-string">AWS::Serverless-2016-10-31</span>
<span class="hljs-attr">Description:</span> <span class="hljs-string">&gt;
  comprehend-01-nlpseries-ep-3
  Sample SAM Template for comprehend-01-nlpseries-ep-3
</span><span class="hljs-attr">Globals:</span>
  <span class="hljs-attr">Function:</span>
    <span class="hljs-attr">Timeout:</span> <span class="hljs-number">3</span>

<span class="hljs-attr">Resources:</span>
  <span class="hljs-attr">Comprehend01nlpseriesep3Function:</span>
    <span class="hljs-attr">Type:</span> <span class="hljs-string">AWS::Serverless::Function</span> 
    <span class="hljs-attr">Properties:</span>
      <span class="hljs-attr">CodeUri:</span> <span class="hljs-string">comprehend_01_nlpseries_ep_3/</span>
      <span class="hljs-attr">Handler:</span> <span class="hljs-string">app.lambda_handler</span>
      <span class="hljs-attr">Runtime:</span> <span class="hljs-string">python3.6</span>
      <span class="hljs-attr">Policies:</span> <span class="hljs-string">ComprehendFullAccess</span>
      <span class="hljs-attr">Events:</span>
        <span class="hljs-attr">HttpPost:</span>
          <span class="hljs-attr">Type:</span> <span class="hljs-string">Api</span>
          <span class="hljs-attr">Properties:</span>
            <span class="hljs-attr">Path:</span> <span class="hljs-string">'/sentiment'</span>
            <span class="hljs-attr">Method:</span> <span class="hljs-string">post</span>

<span class="hljs-attr">Outputs:</span>
  <span class="hljs-comment"># ServerlessRestApi is an implicit API created out of Events key under Serverless::Function</span>
  <span class="hljs-attr">ComprehendApi:</span>
    <span class="hljs-attr">Description:</span> <span class="hljs-string">"API Gateway endpoint URL for Prod stage for Hello World function"</span>
    <span class="hljs-attr">Value:</span> <span class="hljs-type">!Sub</span> <span class="hljs-string">"https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/sentiment/"</span>
  <span class="hljs-attr">Comprehend01nlpseriesep3Function:</span>
    <span class="hljs-attr">Description:</span> <span class="hljs-string">"comprehend_01_nlpseries_ep_3 Function ARN"</span>
    <span class="hljs-attr">Value:</span> <span class="hljs-type">!GetAtt</span> <span class="hljs-string">Comprehend01nlpseriesep3Function.Arn</span>
  <span class="hljs-attr">Comprehend01nlpseriesep3FunctionIamRole:</span>
    <span class="hljs-attr">Description:</span> <span class="hljs-string">"Implicit IAM Role created for comprehend_01_nlpseries_ep_3 function"</span>
    <span class="hljs-attr">Value:</span> <span class="hljs-type">!GetAtt</span> <span class="hljs-string">Comprehend01nlpseriesep3FunctionRole.Arn</span>
</code></pre>
<p>Puedes ir al archivo del repo aquí:
<a target="_blank" href="https://github.com/ccortezb/comprehend_apirest_sentiment_nlpseries/blob/master/template.yaml"><strong>ccortezb/comprehend_apirest_sentiment_nlpseries</strong>
<em>You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or…</em>github.com</a></p>
<p>En este template, creamos el API, los recursos y los métodos, en este caso necesitamos hacer un POST a /sentiment que hará un proxy directo a nuestro Lambda para luego comunicarse con Comprehend</p>
<p><strong>Events:</strong></p>
<pre><code><span class="hljs-attribute">HttpPost</span>:

   <span class="hljs-attribute">Type</span>: Api

      <span class="hljs-attribute">Properties</span>:

         <span class="hljs-attribute">Path</span>: ‘/sentiment’

         <span class="hljs-attribute">Method</span>: post
</code></pre><h2 id="sam-build">🧩 SAM Build:</h2>
<p>Ejecutar lo siguiente:</p>
<pre><code>(nlp01) ➜ comprehend-01-nlpseries-ep-3 <span class="hljs-strong">**sudo sam build**</span>
</code></pre><p>Resultado:</p>
<pre><code>Building resource ‘Comprehend01nlpseriesep3Function’

Running PythonPipBuilder:ResolveDependencies

Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts : .aws-sam/build

Built <span class="hljs-keyword">Template</span> : .aws-sam/build/<span class="hljs-keyword">template</span>.yaml

Commands you can use next

=========================

[*] Invoke <span class="hljs-keyword">Function</span>: sam <span class="hljs-keyword">local</span> invoke

[*] Deploy: sam deploy — guided
</code></pre><h2 id="sam-deploy">🧩 SAM Deploy:</h2>
<p>Haremos el Deploy directo desde la consola, para ejecutar nuestro Stack de CloudFormation de manera programática</p>
<pre><code class="lang-shell">(nlp01) ➜  comprehend-01-nlpseries-ep-3 sudo sam deploy --guided

Configuring SAM deploy
======================

  Looking for samconfig.toml :  Found
  Reading default arguments  :  Success

  Setting default arguments for 'sam deploy'
  =========================================
  Stack Name [comprehend-01-nlp-03]:
  AWS Region [ca-central-1]:
  #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
  Confirm changes before deploy [Y/n]: Y
  #SAM needs permission to be able to create roles to connect to the resources in your template
  Allow SAM CLI IAM role creation [Y/n]: Y
  Save arguments to samconfig.toml [Y/n]: Y

  Looking for resources needed for deployment: Found!

    Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-18d1u3hw3hac2
    A different default S3 bucket can be set in samconfig.toml

  Saved arguments to config file
  Running 'sam deploy' for future deployments will use the parameters saved above.
  The above parameters can be changed by modifying samconfig.toml
  Learn more about samconfig.toml syntax at
  https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

  Deploying with following values
  ===============================
  Stack name                 : comprehend-01-nlp-03
  Region                     : ca-central-1
  Confirm changeset          : True
  Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-18d1u3hw3hac2
  Capabilities               : ["CAPABILITY_IAM"]
  Parameter overrides        : {}

Initiating deployment
=====================

Waiting for changeset to be created..
Error: Failed to create changeset for the stack: comprehend-01-nlp-03, ex: Waiter ChangeSetCreateComplete failed: Waiter encountered a terminal failure state Status: FAILED. Reason: Template error: instance of Fn::GetAtt references undefined resource HelloWorldFunctionRole
(nlp01) ➜  comprehend-01-nlpseries-ep-3 sudo sam deploy --guided

Configuring SAM deploy
======================

  Looking for samconfig.toml :  Found
  Reading default arguments  :  Success

  Setting default arguments for 'sam deploy'
  =========================================
  Stack Name [comprehend-01-nlp-03]:
  AWS Region [ca-central-1]:
  #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
  Confirm changes before deploy [Y/n]: Y
  #SAM needs permission to be able to create roles to connect to the resources in your template
  Allow SAM CLI IAM role creation [Y/n]: Y
  Save arguments to samconfig.toml [Y/n]: Y

  Looking for resources needed for deployment: Found!

    Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-18d1u3hw3hac2
    A different default S3 bucket can be set in samconfig.toml

  Saved arguments to config file
  Running 'sam deploy' for future deployments will use the parameters saved above.
  The above parameters can be changed by modifying samconfig.toml
  Learn more about samconfig.toml syntax at
  https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

  Deploying with following values
  ===============================
  Stack name                 : comprehend-01-nlp-03
  Region                     : ca-central-1
  Confirm changeset          : True
  Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-18d1u3hw3hac2
  Capabilities               : ["CAPABILITY_IAM"]
  Parameter overrides        : {}

Initiating deployment
=====================
Uploading to comprehend-01-nlp-03/eff52ec0ae2140c2154eb8486ef244aa.template  1286 / 1286.0  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
------------------------------------------------------------------------------------------------------------------------------------------------
Operation                                        LogicalResourceId                                ResourceType
------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                            Comprehend01nlpseriesep3FunctionHttpPostPermis   AWS::Lambda::Permission
                                                 sionProd
+ Add                                            Comprehend01nlpseriesep3FunctionRole             AWS::IAM::Role
+ Add                                            Comprehend01nlpseriesep3Function                 AWS::Lambda::Function
+ Add                                            ServerlessRestApiDeployment1449b782f7            AWS::ApiGateway::Deployment
+ Add                                            ServerlessRestApiProdStage                       AWS::ApiGateway::Stage
+ Add                                            ServerlessRestApi                                AWS::ApiGateway::RestApi
------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ca-central-1:[aws_account_number]:changeSet/samcli-deploy1617735990/54bf479f-01a3-49ac-a71f-30219a23f2ba


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2021-04-06 14:06:44 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                       ResourceType                         LogicalResourceId                    ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS                   AWS::IAM::Role                       Comprehend01nlpseriesep3FunctionRo   -
                                                                          le
CREATE_IN_PROGRESS                   AWS::IAM::Role                       Comprehend01nlpseriesep3FunctionRo   Resource creation Initiated
                                                                          le
CREATE_COMPLETE                      AWS::IAM::Role                       Comprehend01nlpseriesep3FunctionRo   -
                                                                          le
CREATE_IN_PROGRESS                   AWS::Lambda::Function                Comprehend01nlpseriesep3Function     Resource creation Initiated
CREATE_IN_PROGRESS                   AWS::Lambda::Function                Comprehend01nlpseriesep3Function     -
CREATE_COMPLETE                      AWS::Lambda::Function                Comprehend01nlpseriesep3Function     -
CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    -
CREATE_COMPLETE                      AWS::ApiGateway::RestApi             ServerlessRestApi                    -
CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    Resource creation Initiated
CREATE_IN_PROGRESS                   AWS::Lambda::Permission              Comprehend01nlpseriesep3FunctionHt   -
                                                                          tpPostPermissionProd
CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment1449b78   -
                                                                          2f7
CREATE_COMPLETE                      AWS::ApiGateway::Deployment          ServerlessRestApiDeployment1449b78   -
                                                                          2f7
CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment1449b78   Resource creation Initiated
                                                                          2f7
CREATE_IN_PROGRESS                   AWS::Lambda::Permission              Comprehend01nlpseriesep3FunctionHt   Resource creation Initiated
                                                                          tpPostPermissionProd
CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
CREATE_COMPLETE                      AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           Resource creation Initiated
CREATE_COMPLETE                      AWS::Lambda::Permission              Comprehend01nlpseriesep3FunctionHt   -
                                                                          tpPostPermissionProd
CREATE_COMPLETE                      AWS::CloudFormation::Stack           comprehend-01-nlp-03                 -
-------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
-------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
-------------------------------------------------------------------------------------------------------------------------------------------------
Key                 ComprehendApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://[api_id].execute-api.ca-central-1.amazonaws.com/Prod/sentiment/

Key                 Comprehend01nlpseriesep3FunctionIamRole
Description         Implicit IAM Role created for comprehend_01_nlpseries_ep_3 function
Value               arn:aws:iam::[aws_account_number]:role/comprehend-01-nlp-03-Comprehend01nlpseriesep3Funct-1363JG49IXNQG

Key                 Comprehend01nlpseriesep3Function
Description         comprehend_01_nlpseries_ep_3 Function ARN
Value               arn:aws:lambda:ca-central-1:[aws_account_number]:function:comprehend-01-nlp-03-Comprehend01nlpseriesep3Funct-BFO9E0QBGG47
-------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - comprehend-01-nlp-03 in ca-central-1
</code></pre>
<p>Una vez esté 100% desplegado, si nos fijamos en los Outputs, tendremos todos los valores necesarios para empezar a testar.</p>
<pre><code>CloudFormation outputs <span class="hljs-keyword">from</span> deployed stack

 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 

Outputs

 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 

Key ComprehendApi

Description API Gateway endpoint URL <span class="hljs-keyword">for</span> Prod stage <span class="hljs-keyword">for</span> your <span class="hljs-keyword">function</span>

<span class="hljs-keyword">Value</span> https://{api}.<span class="hljs-keyword">execute</span>-api.ca-central<span class="hljs-number">-1.</span>amazonaws.com/Prod/sentiment/

Key Comprehend01nlpseriesep3FunctionIamRole

Description Implicit IAM <span class="hljs-keyword">Role</span> created <span class="hljs-keyword">for</span> comprehend_01_nlpseries_ep_3 <span class="hljs-keyword">function</span>

<span class="hljs-keyword">Value</span> arn:aws:iam::cuenta_aws:<span class="hljs-keyword">role</span>/comprehend<span class="hljs-number">-01</span>-nlp<span class="hljs-number">-03</span>-Comprehend01nlpseriesep3Funct<span class="hljs-number">-1363</span>JG49IXNQG

Key Comprehend01nlpseriesep3Function

Description comprehend_01_nlpseries_ep_3 <span class="hljs-keyword">Function</span> ARN

<span class="hljs-keyword">Value</span> arn:aws:lambda:ca-central<span class="hljs-number">-1</span>:cuenta_aws:<span class="hljs-keyword">function</span>:comprehend<span class="hljs-number">-01</span>-nlp<span class="hljs-number">-03</span>-Comprehend01nlpseriesep3Funct-BFO9E0QBGG47
</code></pre><h2 id="pruebas-con-api-rest">🧩 Pruebas con API rest:</h2>
<p>Vamos a probar con un simple request nuestra nueva API vía CuRL:</p>
<p><em>{“body”: “Hola a todos, estamos aprendiendo cómo usar servicios de inteligencia artificial en AWS para el entendimiento del lenguaje natural así que pongamos mucha atención”}</em></p>
<pre><code class="lang-shell">curl -X POST \
  https://d5601zkukf.execute-api.ca-central-1.amazonaws.com/Prod/sentiment \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: ea059b31-e081-24e6-8911-c179362ee99c' \
  -d '{"body": "{\"Body\":\"estoy de humor bueno\"}"}'
</code></pre>
<p>y por qué no también por <strong>Postman</strong>, más interactivo:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031569439/LbtAkY6RJE.png" alt="Imagen: request desde Postman" /><em>Imagen: request desde Postman</em></p>
<pre><code class="lang-json">{
  'Sentiment': 'NEUTRAL',
  'SentimentScore': {
    'Positive': <span class="hljs-number">0.019190235063433647</span>,
    'Negative': <span class="hljs-number">0.027914147824048996</span>,
    'Neutral': <span class="hljs-number">0.937386691570282</span>,
    'Mixed': <span class="hljs-number">0.015508887358009815</span>
  },
  'ResponseMetadata': {
    'RequestId': 'c45999f3<span class="hljs-number">-3021</span><span class="hljs-number">-4e4</span>d<span class="hljs-number">-95e8</span>-bd8763d54337',
    'HTTPStatusCode': <span class="hljs-number">200</span>,
    'HTTPHeaders': {
      'x-amzn-requestid': 'c45999f3<span class="hljs-number">-3021</span><span class="hljs-number">-4e4</span>d<span class="hljs-number">-95e8</span>-bd8763d54337',
      'content-type': 'application/x-amz-json<span class="hljs-number">-1.1</span>',
      'content-length': '<span class="hljs-number">163</span>',
      'date': 'Wed, 07 Apr 2021 00:<span class="hljs-number">12</span>:<span class="hljs-number">21</span> GMT'
    },
    'RetryAttempts': <span class="hljs-number">0</span>
  }
}
</code></pre>
<h2 id="otro-ejemplo">Otro ejemplo:</h2>
<pre><code>{
 “body”: “Me encanta aprender cosas nuevas, más aún si es sobre Ai o ML, la verdad es un tema muy interesante y lo explicas de manera entretenida”
}
</code></pre><h2 id="resultado-a-prueba-de-analisis-de-sentimiento">Resultado a prueba de análisis de sentimiento</h2>
<pre><code><span class="hljs-string">‘Sentiment’:</span> <span class="hljs-string">‘POSITIVE’,</span> <span class="hljs-string">‘SentimentScore’:</span> {<span class="hljs-string">‘Positive’:</span> <span class="hljs-number">0.9948458671569824</span>, <span class="hljs-string">‘Negative’:</span> <span class="hljs-number">9.346976730739698e-05</span>, <span class="hljs-string">‘Neutral’</span>
</code></pre><p>Mientras más se acerca a 1, la probabilidad de que sea positivo es mayor. así como mientras más se acerca a 0, la probabilidad de que NO lo sea, es casi nula.</p>
<p>Probemos de nuevo cambiando algunos términos, porque no obtuvimos ningún ENTITY reconocido por el API de Amazon Comprehend usando el lenguaje ‘es’, así que veamos:</p>
<pre><code>{
 <span class="hljs-string">“body”:</span> <span class="hljs-string">“Hola</span>, <span class="hljs-string">Soy</span> <span class="hljs-string">Carlos</span> <span class="hljs-string">y</span> <span class="hljs-string">me</span> <span class="hljs-string">encanta</span> <span class="hljs-string">aprender</span> <span class="hljs-string">lenguajes</span> <span class="hljs-string">nuevos</span> <span class="hljs-string">en</span> <span class="hljs-string">internet</span>, <span class="hljs-string">más</span> <span class="hljs-string">aún</span> <span class="hljs-string">si</span> <span class="hljs-string">es</span> <span class="hljs-string">sobre</span> <span class="hljs-string">AI</span> <span class="hljs-string">o</span> <span class="hljs-string">ML</span>, <span class="hljs-string">la</span> <span class="hljs-string">verdad</span> <span class="hljs-string">es</span> <span class="hljs-string">un</span> <span class="hljs-string">tema</span> <span class="hljs-string">muy</span> <span class="hljs-string">interesante</span> <span class="hljs-string">y</span> <span class="hljs-string">lo</span> <span class="hljs-string">explicas</span> <span class="hljs-string">de</span> <span class="hljs-string">manera</span> <span class="hljs-string">entretenida</span> <span class="hljs-string">en</span> <span class="hljs-string">tu</span> <span class="hljs-string">web.</span> <span class="hljs-string">visitalo</span> <span class="hljs-string">en</span> <span class="hljs-string">cortez.cloud</span> <span class="hljs-string">a</span> <span class="hljs-string">las</span> <span class="hljs-string">8pm</span> <span class="hljs-string">de</span> <span class="hljs-string">lunes</span> <span class="hljs-string">a</span> <span class="hljs-string">domingo</span> <span class="hljs-string">y</span> <span class="hljs-string">en</span> <span class="hljs-string">youtube</span> <span class="hljs-string">también.</span> <span class="hljs-string">¡ya</span> <span class="hljs-string">tiene</span> <span class="hljs-string">más</span> <span class="hljs-string">de</span> <span class="hljs-number">30</span> <span class="hljs-string">suscriptores!</span> <span class="hljs-string">que</span> <span class="hljs-string">bueno”</span>
}
</code></pre><h2 id="resultado-a-prueba-para-extraccion-de-entidades">Resultado a prueba para extracción de entidades:</h2>
<pre><code>[‘Carlos’, ‘AI’, ‘ML’, ‘<span class="hljs-number">8</span>pm’, ‘lunes’, ‘domingo’, ‘youtube’, ’<span class="hljs-number">30</span> suscriptores’]
[‘PERSON’, ‘OTHER’, ‘OTHER’, ‘DATE’, ‘DATE’, ‘DATE’, ‘TITLE’, ‘QUANTITY’]
</code></pre><h2 id="conclusion">🧩 Conclusión</h2>
<p>Estamos en la punta del iceberg, recién entendiendo NLP usando servicios auto administrados, lo cual nos da resultados aceptables y discutibles. Pero espera!Recién estamos empezando con Comprehend, y además también vamos a aprender librerías propias open source para poder compararlo y llevarlo a AWS Sagemaker luego. Eso ya suena como level 10 o 15 no? Vamos con calma y a paso seguro.</p>
<p>¡Estamos en la nube podemos romperlo todo y no pasa nada. (en desarrollo…)</p>
<p>Puedes revisar todo el código aquí en mi <strong>github</strong>:
<a target="_blank" href="https://github.com/ccortezb/comprehend_apirest_sentiment_nlpseries"><strong>ccortezb/comprehend_apirest_sentiment_nlpseries</strong>
<em>estos son los 3 archvos que necesitas editar si empieazas desde cero un repo de SAM de Hello World.</em>github.com</a></p>
<p><strong>Siguiente post: (Al Aire el 12 de Abril)</strong></p>
<p><strong>Parte 2: <a target="_blank" href="https://ccortezb.medium.com/ingestando-noticias-de-mi-propia-web-text-analytics-basics-nlp-series-parte-2-por-carlos-7899bedd0995">https://ccortezb.medium.com/ingestando-noticias-de-mi-propia-web-text-analytics-basics-nlp-series-parte-2-por-carlos-7899bedd0995</a></strong></p>
<p><strong>Parte 1: <a target="_blank" href="https://ccortezb.medium.com/empezando-con-nlp-en-aws-desde-cero-nlp-series-parte-1-por-carlos-cortez-breaking-the-cloud-13da2adc0151">https://ccortezb.medium.com/empezando-con-nlp-en-aws-desde-cero-nlp-series-parte-1-por-carlos-cortez-breaking-the-cloud-13da2adc0151</a></strong></p>
<p>Si te gustó este post, dale un like, comparte y comenta.</p>
<p>Estas series son parte de una nueva sección llamada AI for Mortals, donde me incluyo con ustedes para enseñarles lo que voy aprendiendo.</p>
<p>Visitar AI for Mortals: (<a target="_blank" href="https://aiformortals.cortez.cloud">https://aiformortals.cortez.cloud</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031571217/Kza1CvVfgL.png" alt /></p>
<h2 id="rompiendo-se-aprende">☢ Rompiendo se aprende</h2>
<p>Suscríbete a mi canal, Breaking the Cloud y Al día con AWS en <a target="_blank" href="https://cortez.cloud/">https://cortez.cloud</a></p>
<p>⭐Suscríbete a mi canal : <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>videos, noticas de AWS, análisis, demos, workshops</p>
<h2 id="sigueme-en-mis-redes">🔥🔥 Sígueme en mis redes 🔥🔥</h2>
<p>follow &lt;- me()</p>
<p>🦜 Mi Twitter: <a target="_blank" href="https://twitter.com/ccortezb">https://twitter.com/ccortezb</a></p>
<p>📺 Youtube Channel: <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>📺 AWSUGPerú: <a target="_blank" href="https://www.youtube.com/awsusergroupperuoficial">https://www.youtube.com/awsusergroupperuoficial</a></p>
<p>📟 Mi Facebook: <a target="_blank" href="https://www.facebook.com/ccortezb/">https://www.facebook.com/ccortezb/</a></p>
<p>🤳 Mi Instagram: ccortezbazan</p>
<p>📜 Mis cursos de AWS: <a target="_blank" href="https://cennticloud.thinkific.com/">https://cennticloud.thinkific.com</a></p>
<p>🕮 Mi blog — <a target="_blank" href="https://cortez.cloud/">cortez.cloud</a></p>
<p>Muchas gracias, espero nos volvamos a ver</p>
<h2 id="acerca-de-mi">🔥🔥 Acerca de mí 🔥🔥</h2>
<p><a target="_blank" href="https://www.cortez.cloud/whoami">Cortez.Cloud/whoami</a></p>
<p>Les presento mi pequeña web personal <a target="_blank" href="https://www.cortez.cloud/">https://www.Cortez.Cloud</a> llamado “Breaking the Cloud”.</p>
<p>Seguiré creando contenido cada semana de AWS sobre Al/ML, Serverless, Security y como romper las reglas!</p>
<p>También mis próximas iniciativas, talleres, cursos, videos gratuitos, awsugperu y más.</p>
]]></content:encoded></item><item><title><![CDATA[Ingestando noticias de mi propia web (Text Analytics basics ) — NLP Series parte 2 | por Carlos…]]></title><description><![CDATA[📢 📢 Let’s DIY (do it yourself):
De quiénes se ensucian las manos, ruedan en el barro, y se llenan de esa adrenalina de hacer las cosas tú mismo y no por un managed service de algún cloud provider. De quiénes pueden inventar sus propios métodos, sus...]]></description><link>https://aiformortals.cortez.cloud/ingestando-noticias-de-mi-propia-web-text-analytics-basics-nlp-series-parte-2-por-carlos-7899bedd0995</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/ingestando-noticias-de-mi-propia-web-text-analytics-basics-nlp-series-parte-2-por-carlos-7899bedd0995</guid><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Fri, 02 Apr 2021 20:59:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031552633/7j1nHB5z7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="lets-diy-do-it-yourself">📢 📢 Let’s DIY (do it yourself):</h2>
<p>De quiénes se ensucian las manos, ruedan en el barro, y se llenan de esa adrenalina de hacer las cosas tú mismo y no por un managed service de algún cloud provider. De quiénes pueden inventar sus propios métodos, sus propios principios y su propio camino. Yo te pregunto, ¿aún puedes seguir inventando si mezclas lo mejor de ambos mundos no?</p>
<p>Estas series son parte de una nueva sección llamada AI for Mortals, donde me incluyo con ustedes para enseñarles lo que voy aprendiendo.</p>
<p>Visitar AI for Mortals: (<a target="_blank" href="https://aiformortals.cortez.cloud">https://aiformortals.cortez.cloud</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031540149/K3lYkXeCY.png" alt /></p>
<h2 id="primero-lo-primero-a-ingestar-con-nuestras-propias-manos">🧩 Primero lo primero: A ingestar con nuestras propias manos</h2>
<p>Generaremos una ingesta de datos con información propia, tomada de mi blog <a target="_blank" href="https://cortez.cloud">https://cortez.cloud</a>, para obtener categorías, títulos, y descripciones de los posts publicados.</p>
<p>Si estuviésemos en un <strong>MMORPG</strong> , nuestro guerrero aún estaría en Level 1:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031542337/JJlx87hIM.png" alt /></p>
<blockquote>
<p>Hagámoslo lo más simple posible pero no Simplón — Albert Einstein</p>
</blockquote>
<p>y recordando dónde nos encontramos en nuestro viaje en este mundo:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031544276/q7rj6rWnv.png" alt /></p>
<h2 id="que-usaremos">🧩 ¿Que usaremos?</h2>
<p>Beautiful Soap, una librería de Python que nos ayudará a extraer data de la web, lo que llamamos “Web Scraping”</p>
<p>Veamos paso a paso que es lo que estamos haciendo aquí,</p>
<ol>
<li>Importamos nuestras librerías que usaremos durante todos los ejemplos desde hoy en adelante:</li>
</ol>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">from</span> bs4 <span class="hljs-keyword">import</span> BeautifulSoup
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">import</span> os
</code></pre>
<ol>
<li>Definimos cuáles URLs vamos a usar:</li>
</ol>
<pre><code class="lang-python">cortezcloud_urls = [<span class="hljs-string">'https://www.cortez.cloud/categories/fundamentals'</span>,
             <span class="hljs-string">'https://www.cortez.cloud/categories/serverless'</span>,
             <span class="hljs-string">'https://www.cortez.cloud/categories/awsugperu'</span>]
</code></pre>
<ol>
<li>Inspeccionamos y entendamos las etiquetas que existen en la web:</li>
</ol>
<p>En una de las URLS, <a target="_blank" href="https://www.cortez.cloud/categories/awsugperu">https://www.cortez.cloud/categories/awsugperu</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031545860/zUVeccWOB.png" alt /></p>
<p>Los títulos están en un <strong>&lt;div class=”blog-title”&gt;</strong>, y esto es lo que tenemos que ir buscando</p>
<ol>
<li>Obtenemos palabras clave de las URLS como las categorías</li>
</ol>
<pre><code class="lang-python">cloud_category = url.split(<span class="hljs-string">'/'</span>)[<span class="hljs-number">4</span>]
</code></pre>
<ol>
<li>Ahora bajamos toda la info y parseamos todo el HTML con Beautiful Soap. Parsing es un método de programación que nos permite analizar el HTML, pero también diferentes tipos de archivos como <strong>json</strong>.</li>
</ol>
<pre><code class="lang-python">data = requests.get(url)
soup = BeautifulSoup(data.content, <span class="hljs-string">'html.parser'</span>)
</code></pre>
<ol>
<li>Buscamos todo los divs que hemos ido encontrando para los títulos “headlines”, los blog posts “news_blog” y las categorías ya las tenemos .</li>
</ol>
<pre><code class="lang-python">
news_blogs = [{<span class="hljs-string">'news_headline'</span>: headline.find(<span class="hljs-string">'div'</span>, 
                                                         attrs={<span class="hljs-string">"class"</span>: <span class="hljs-string">"blog-title"</span>}).string,
                          <span class="hljs-string">'news_blog'</span>: blog.find(<span class="hljs-string">'div'</span>, 
                                                       attrs={<span class="hljs-string">"class"</span>: <span class="hljs-string">"preview-text"</span>}).string,
                          <span class="hljs-string">'cloud_category'</span>: cloud_category}
</code></pre>
<ol>
<li>Creamos nuestro Data Frame y colocamos toda la data encontrada y segmentada en 3 columnas:</li>
</ol>
<pre><code class="lang-python">
df =  pd.DataFrame(cortezcloud_data)
    df = df[[<span class="hljs-string">'news_headline'</span>, <span class="hljs-string">'news_blog'</span>, <span class="hljs-string">'cloud_category'</span>]]
</code></pre>
<ol>
<li>Revisamos nuestra data recién salida del horno:</li>
</ol>
<pre><code class="lang-python">
ultimos_posts = ingestar_noticias(cortezcloud_urls)
ultimos_posts.head(<span class="hljs-number">10</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031547706/Uf1boMUSa.png" alt /></p>
<h2 id="ejercicio-completo-de-este-tutorial">🧩 Ejercicio completo de este tutorial:</h2>
<p>El código completo es el siguiente y lo puedes encontrar en mi <a target="_blank" href="https://gist.github.com/ccortezb/315c16d6a61208229e0db3ffd095affe">github</a> en Colab para que puedan editarlo y usarlo:</p>
<p><code>jupyter notebook
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Ingestando noticias de mi propia web.ipynb",
      "provenance": [],
      "authorship_tag": "ABX9TyPpymjo5tVL1p5qAm0AbRN5",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "&lt;a href=\"https://colab.research.google.com/gist/ccortezb/315c16d6a61208229e0db3ffd095affe/ingestando-noticias-de-mi-propia-web.ipynb\" target=\"_parent\"&gt;&lt;img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/&gt;&lt;/a&gt;"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BBWvh-jVtn8J"
      },
      "source": [
        "import requests\n",
        "from bs4 import BeautifulSoup\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import os\n",
        "%matplotlib inline\n",
        "\n",
        "cortezcloud_urls = ['https://www.cortez.cloud/categories/fundamentals',\n",
        "             'https://www.cortez.cloud/categories/serverless',\n",
        "             'https://www.cortez.cloud/categories/awsugperu']\n",
        "\n",
        "def ingestar_noticias(cortezcloud_urls):\n",
        "    cortezcloud_data = []\n",
        "    for url in cortezcloud_urls:\n",
        "        cloud_category = url.split('/')[4]\n",
        "        data = requests.get(url)\n",
        "        soup = BeautifulSoup(data.content, 'html.parser')\n",
        "        \n",
        "        news_blogs = [{'news_headline': headline.find('div', \n",
        "                                                         attrs={\"class\": \"blog-title\"}).string,\n",
        "                          'news_blog': blog.find('div', \n",
        "                                                       attrs={\"class\": \"preview-text\"}).string,\n",
        "                          'cloud_category': cloud_category}\n",
        "                         \n",
        "                            for headline, blog in \n",
        "                             zip(soup.find_all('div', \n",
        "                                               class_=[\"thumbnail-text\"]),\n",
        "                                 soup.find_all('div', \n",
        "                                               class_=[\"thumbnail-text\"]))\n",
        "                        ]\n",
        "        cortezcloud_data.extend(news_blogs)\n",
        "        \n",
        "    df =  pd.DataFrame(cortezcloud_data)\n",
        "    df = df[['news_headline', 'news_blog', 'cloud_category']]\n",
        "    return df\n"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 162
        },
        "id": "ERIXIl2ewiwn",
        "outputId": "eb1495a0-7d4c-4671-b00f-c10b67558ebf"
      },
      "source": [
        "ultimos_posts = ingestar_noticias(cortezcloud_urls)\n",
        "ultimos_posts.head(10)"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "&lt;div&gt;\n",
              "&lt;style scoped&gt;\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "&lt;/style&gt;\n",
              "&lt;table border=\"1\" class=\"dataframe\"&gt;\n",
              "  &lt;thead&gt;\n",
              "    &lt;tr style=\"text-align: right;\"&gt;\n",
              "      &lt;th&gt;&lt;/th&gt;\n",
              "      &lt;th&gt;news_headline&lt;/th&gt;\n",
              "      &lt;th&gt;news_blog&lt;/th&gt;\n",
              "      &lt;th&gt;cloud_category&lt;/th&gt;\n",
              "    &lt;/tr&gt;\n",
              "  &lt;/thead&gt;\n",
              "  &lt;tbody&gt;\n",
              "    &lt;tr&gt;\n",
              "      &lt;th&gt;0&lt;/th&gt;\n",
              "      &lt;td&gt;2 Trabajando con Amazon DocumentDB desde mi local&lt;/td&gt;\n",
              "      &lt;td&gt;Seguimos en las series de Docdb, esta vez, 2da...&lt;/td&gt;\n",
              "      &lt;td&gt;fundamentals&lt;/td&gt;\n",
              "    &lt;/tr&gt;\n",
              "    &lt;tr&gt;\n",
              "      &lt;th&gt;1&lt;/th&gt;\n",
              "      &lt;td&gt;5 cosas que necesitas empezar a aprender para ...&lt;/td&gt;\n",
              "      &lt;td&gt;Aún no entiendes bien cómo empezar a migrar tu...&lt;/td&gt;\n",
              "      &lt;td&gt;fundamentals&lt;/td&gt;\n",
              "    &lt;/tr&gt;\n",
              "    &lt;tr&gt;\n",
              "      &lt;th&gt;2&lt;/th&gt;\n",
              "      &lt;td&gt;Primeros pasos con Amazon DocumentDB y AWS CLI&lt;/td&gt;\n",
              "      &lt;td&gt;Estas serán unas series donde hablaremos de un...&lt;/td&gt;\n",
              "      &lt;td&gt;fundamentals&lt;/td&gt;\n",
              "    &lt;/tr&gt;\n",
              "    &lt;tr&gt;\n",
              "      &lt;th&gt;3&lt;/th&gt;\n",
              "      &lt;td&gt;Cómo me convierto en un AWS Community Builder ...&lt;/td&gt;\n",
              "      &lt;td&gt;Empieza tu travesía para educar AWS en el Perú&lt;/td&gt;\n",
              "      &lt;td&gt;awsugperu&lt;/td&gt;\n",
              "    &lt;/tr&gt;\n",
              "  &lt;/tbody&gt;\n",
              "&lt;/table&gt;\n",
              "&lt;/div&gt;"
            ],
            "text/plain": [
              "                                       news_headline  ... cloud_category\n",
              "0  2 Trabajando con Amazon DocumentDB desde mi local  ...   fundamentals\n",
              "1  5 cosas que necesitas empezar a aprender para ...  ...   fundamentals\n",
              "2     Primeros pasos con Amazon DocumentDB y AWS CLI  ...   fundamentals\n",
              "3  Cómo me convierto en un AWS Community Builder ...  ...      awsugperu\n",
              "\n",
              "[4 rows x 3 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 2
        }
      ]
    }
  ]
}</code></p>
<h2 id="casos-de-uso-distintos-y-automatizacion">🧩 Casos de uso distintos y automatización</h2>
<p>Pasémoslo a Funciones como Servicio usando AWS Lambda y empecemos a automatizar y crear nuestros propios pipelines de ingesta de datos.</p>
<p>Lo puedes replicar para hacer ingesta en Twitter o de cualquier otra red social y empezar a generar tus propios análisis.</p>
<p>Nosotros nos iremos por la rama de Procesamiento de lenguaje natural tanto con librerías open source como con Amazon Web Services</p>
<h2 id="con-que-continuamos">🧩 ¿Con qué continuamos?</h2>
<p>Si en el próximo episodio, cambiamos de aires y nos vamos a Amazon Comprehend?</p>
<p>No se preocupen vamos paso a paso y alternando entre ambos caminos.</p>
<h2 id="spoiler-alert">📢 📢 Spoiler alert:</h2>
<p>Doble click a nuestro MMORPG , nuestro guerrero tiene la meta de llegar a level 5:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031549296/VToYp535M.png" alt /></p>
<p><strong>Siguiente post: (Al Aire el 05 de Abril)</strong></p>
<p><strong>Post Anterior: Empezando con nlp en AWS desde cero</strong></p>
<p>Si te gustó este post, dale un like, comparte y comenta.</p>
<p>Estas series son parte de una nueva sección llamada AI for Mortals, donde me incluyo con ustedes para enseñarles lo que voy aprendiendo.</p>
<p>Visitar AI for Mortals: (<a target="_blank" href="https://aiformortals.cortez.cloud">https://aiformortals.cortez.cloud</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031550932/xFzAw3IA4.png" alt /></p>
<h2 id="rompiendo-se-aprende">☢ Rompiendo se aprende</h2>
<p>Suscríbete a mi canal, Breaking the Cloud y Al día con AWS en <a target="_blank" href="https://cortez.cloud/">https://cortez.cloud</a></p>
<p>⭐Suscríbete a mi canal : <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>videos, noticas de AWS, análisis, demos, workshops</p>
<h2 id="sigueme-en-mis-redes">🔥🔥 Sígueme en mis redes 🔥🔥</h2>
<p>follow &lt;- me()</p>
<p>🦜 Mi Twitter: <a target="_blank" href="https://twitter.com/ccortezb">https://twitter.com/ccortezb</a></p>
<p>📺 Youtube Channel: <a target="_blank" href="http://bit.ly/aldiaconaws">http://bit.ly/aldiaconaws</a></p>
<p>📺 AWSUGPerú: <a target="_blank" href="https://www.youtube.com/awsusergroupperuoficial">https://www.youtube.com/awsusergroupperuoficial</a></p>
<p>📟 Mi Facebook: <a target="_blank" href="https://www.facebook.com/ccortezb/">https://www.facebook.com/ccortezb/</a></p>
<p>🤳 Mi Instagram: ccortezbazan</p>
<p>📜 Mis cursos de AWS: <a target="_blank" href="https://cennticloud.thinkific.com/">https://cennticloud.thinkific.com</a></p>
<p>🕮 Mi blog — <a target="_blank" href="https://cortez.cloud/">cortez.cloud</a></p>
<p>Muchas gracias, espero nos volvamos a ver</p>
<h2 id="acerca-de-mi">🔥🔥 Acerca de mí 🔥🔥</h2>
<p><a target="_blank" href="https://www.cortez.cloud/whoami">Cortez.Cloud/whoami</a></p>
<p>Les presento mi pequeña web personal <a target="_blank" href="https://www.cortez.cloud/">https://www.Cortez.Cloud</a> llamado “Breaking the Cloud”.</p>
<p>Seguiré creando contenido cada semana de AWS sobre Al/ML, Serverless, Security y como romper las reglas!</p>
<p>También mis próximas iniciativas, talleres, cursos, videos gratuitos, awsugperu y más.</p>
]]></content:encoded></item><item><title><![CDATA[Hi my dear mortals]]></title><description><![CDATA[Im also a mere mortal here so lets start!]]></description><link>https://aiformortals.cortez.cloud/hi-my-dear-mortals</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/hi-my-dear-mortals</guid><category><![CDATA[AI]]></category><category><![CDATA[ML]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Thu, 25 Mar 2021 21:02:39 GMT</pubDate><content:encoded><![CDATA[<p>Im also a mere mortal here so lets start!</p>
]]></content:encoded></item><item><title><![CDATA[DeepFridays, Tu camino hacia el aprendizaje de AWS DeepRacer]]></title><description><![CDATA[Nació DeepFridays

Qué es? Y quiénes somos?
Somos 3! A la izquierda, Carlos Cortez (AWS UG Perú Leader & Founder), al centro Damian Olguín (AWS Hero), y a la derecha Matías Kreder (re:invent 2020 qualifier finalist)

Unas series educativas para acerc...]]></description><link>https://aiformortals.cortez.cloud/deepfridays-tu-camino-hacia-el-aprendizaje-de-aws-deepracer-f3512368d145</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/deepfridays-tu-camino-hacia-el-aprendizaje-de-aws-deepracer-f3512368d145</guid><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Thu, 11 Mar 2021 03:15:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031523815/wQfB2FobJ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Nació DeepFridays</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031509339/YlqgdCBMO.png" alt /></p>
<h2 id="que-es-y-quienes-somos">Qué es? Y quiénes somos?</h2>
<p>Somos 3! A la izquierda, Carlos Cortez (AWS UG Perú Leader &amp; Founder), al centro Damian Olguín (AWS Hero), y a la derecha Matías Kreder (re:invent 2020 qualifier finalist)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031511467/uXwIUtdwF.png" alt /></p>
<p>Unas series educativas para acercarnos al Aprendizaje por refuerzos (reinforcement Learning) y en AWS</p>
<p>Aquí los episodios que hemos lanzado hasta el momento:</p>
<p>Episodio 1: <a target="_blank" href="https://www.youtube.com/watch?v=TtOznh3G6z0">https://www.youtube.com/watch?v=TtOznh3G6z0</a></p>
<p>Episodio 2: <a target="_blank" href="https://www.youtube.com/watch?v=eUWSdrxQOrw">https://www.youtube.com/watch?v=eUWSdrxQOrw</a></p>
<p>Episodio 3: <a target="_blank" href="https://www.youtube.com/watch?v=Ww1HMEzEJ-8">https://www.youtube.com/watch?v=Ww1HMEzEJ-8</a></p>
<p>Episode 4: the final cup at awsugperuconf</p>
<p>Nos acercamos a una tecnología emergente dentro de la inteligencia artificial, llamada aprendizaje reforzado, y AWS DeepRacer es un servicio autogestionado donde podemos aplicar este tipo de modelos basado en este tipo de aprendizaje por recompensas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031514093/ZHuUrws6e.png" alt /></p>
<h2 id="creamos-ligas-de-aws-deepracer-en-latinoamerica">‍ Creamos ligas de AWS DeepRacer en Latinoamérica</h2>
<p>Las primeras hechas en español en latam.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031516171/3L3GVRM-W.png" alt /></p>
<p><strong>Las 3 ligas oficiales que creamos:</strong></p>
<p>League #1:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031518417/rhR1AqcQQ.png" alt /></p>
<p><strong>League #2:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031520608/CZtW1Ce7Q.png" alt /></p>
<p><strong>League #3:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031522145/ZPU1FWP-J.png" alt /></p>
<h2 id="hacemos-que-el-entrenamiento-reforzado-sea-mas-sencillo-de-entender">Hacemos que el entrenamiento reforzado sea más sencillo de entender</h2>
<p>En los siguientes posts, les enseñaré cómo entrar en el mundo de RL, teórico y práctico y así entender cómo es que funciona detrás de tanta genialidad que es AWS DeepRacer.</p>
]]></content:encoded></item><item><title><![CDATA[First 5 things to start learning PyTorch Tensors in Sagemaker Notebooks]]></title><description><![CDATA[Let’s begin our TorchAdventure in AWS! with this 11 basic functions distributed in the following sections:

Creating tensors: Empty() and Zeros()

Measuring tensors: Size() and Shape(), Sum() and Dimensions

Changing and copying tensors: Reshape(), v...]]></description><link>https://aiformortals.cortez.cloud/first-5-things-to-start-learning-pytorch-tensors-in-sagemaker-notebooks-67151576f6e3</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/first-5-things-to-start-learning-pytorch-tensors-in-sagemaker-notebooks-67151576f6e3</guid><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Sat, 12 Dec 2020 22:11:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031587708/XFcVopNnV.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let’s begin our TorchAdventure in AWS! with this 11 basic functions distributed in the following sections:</p>
<ul>
<li><p><strong>Creating tensors: </strong>Empty() and Zeros()</p>
</li>
<li><p><strong>Measuring tensors:</strong> Size() and Shape(), Sum() and Dimensions</p>
</li>
<li><p><strong>Changing and copying tensors:</strong> Reshape(), view() and randn()</p>
</li>
<li><p><strong>Modifying tensor</strong>s: Unsqueeze()</p>
</li>
<li><p><strong>Comparing tensors</strong>: Element-Wise Equality: Eq</p>
</li>
</ul>
<p>First lets spin up a new sagemaker instance:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031578815/0LddKYN5n.png" alt /></p>
<p>Now go to Jupyter Lab and import or create a new Notebook with this kernel for Pytorch:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031580718/PAYSD9NMX.png" alt /></p>
<p>Select the appropiate kernel, for this case it could be: conda_pytorch_p36</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031582993/LpXsMjgIE.png" alt /></p>
<p>Here is where I will start from scratch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031584931/XA9MUFKvy.png" alt /></p>
<p>Before we begin, let’s install and import PyTorch</p>
<pre><code>*<span class="hljs-comment"># Uncomment and run the appropriate command for your operating system, if required*</span>

<span class="hljs-comment"># Linux / Binder</span>
<span class="hljs-comment"># !pip install numpy torch==1.7.0+cpu torchvision==0.8.1+cpu torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html</span>

<span class="hljs-comment"># Windows</span>
<span class="hljs-comment"># !pip install numpy torch==1.7.0+cpu torchvision==0.8.1+cpu torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html</span>

<span class="hljs-comment"># MacOS</span>
<span class="hljs-comment"># !pip install numpy torch torchvision torchaudio</span>
</code></pre><p>Import Pytorch from the Notebook instance</p>
<pre><code><span class="hljs-strong">**import**</span> <span class="hljs-strong">**torch**</span>
</code></pre><h2 id="function-1-empty-and-zeros-how-to-initialize-tensors">Function 1 — Empty and Zeros — how to initialize tensors</h2>
<p>We need to start working with the basics pytorch functions, and the first thing is create our matrix</p>
<pre><code><span class="hljs-string">*#</span> <span class="hljs-string">Creates</span> <span class="hljs-string">a</span> <span class="hljs-number">3</span> <span class="hljs-string">x</span> <span class="hljs-number">2</span> <span class="hljs-string">matrix</span> <span class="hljs-string">which</span> <span class="hljs-string">is</span> <span class="hljs-string">empty*</span>
<span class="hljs-string">a</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.empty(3,</span> <span class="hljs-number">2</span><span class="hljs-string">)</span>
<span class="hljs-string">print(a)</span>

<span class="hljs-string">tensor([[1.5842e-35,</span> <span class="hljs-number">0.0000e+00</span><span class="hljs-string">],</span>
        [<span class="hljs-number">4.4842e-44</span>, <span class="hljs-number">0.0000e+00</span>]<span class="hljs-string">,</span>
        [       <span class="hljs-string">nan</span>, <span class="hljs-number">0.0000e+00</span>]<span class="hljs-string">])</span>
</code></pre><p>Here is how PyTorch is allocating memory for this tensor. Whatever, it will not erase anything previous content in the memory.</p>
<p>by default, when you initializes a tensor is used the float32 dtype. you can review it here: <a target="_blank" href="https://pytorch.org/docs/stable/generated/torch.set_default_tensor_type.html#torch.set_default_tensor_type">https://pytorch.org/docs/stable/generated/torch.set_default_tensor_type.html#torch.set_default_tensor_type</a></p>
<p>But you can also start working with torch.zeros</p>
<pre><code>*<span class="hljs-comment"># Applying the zeros function and *</span>
*<span class="hljs-comment"># storing the resulting tensor*</span>

a = torch.zeros([<span class="hljs-number">3</span>, <span class="hljs-number">5</span>]) 
print(<span class="hljs-string">"a = "</span>, a) 

b = torch.zeros([<span class="hljs-number">2</span>, <span class="hljs-number">4</span>]) 
print(<span class="hljs-string">"b = "</span>, b) 

c = torch.zeros([<span class="hljs-number">4</span>, <span class="hljs-number">1</span>]) 
print(<span class="hljs-string">"c = "</span>, c) 

d = torch.zeros([<span class="hljs-number">4</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>]) 
print(<span class="hljs-string">"d = "</span>, d)
</code></pre><p>the result will be:</p>
<pre><code><span class="hljs-string">a</span> <span class="hljs-string">=</span>  <span class="hljs-string">tensor([[0.,</span> <span class="hljs-number">0</span><span class="hljs-string">.,</span> <span class="hljs-number">0</span><span class="hljs-string">.,</span> <span class="hljs-number">0</span><span class="hljs-string">.,</span> <span class="hljs-number">0</span><span class="hljs-string">.],</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">])</span>
<span class="hljs-string">b</span> <span class="hljs-string">=</span>  <span class="hljs-string">tensor([[0.,</span> <span class="hljs-number">0</span><span class="hljs-string">.,</span> <span class="hljs-number">0</span><span class="hljs-string">.,</span> <span class="hljs-number">0</span><span class="hljs-string">.],</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">])</span>
<span class="hljs-string">c</span> <span class="hljs-string">=</span>  <span class="hljs-string">tensor([[0.],</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">])</span>
<span class="hljs-string">d</span> <span class="hljs-string">=</span>  <span class="hljs-string">tensor([[[0.,</span> <span class="hljs-number">0</span><span class="hljs-string">.],</span>
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">,</span>
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">,</span>
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]<span class="hljs-string">],</span>

[[<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]]<span class="hljs-string">,</span>

[[<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]]<span class="hljs-string">,</span>

[[<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>],
         [<span class="hljs-number">0</span><span class="hljs-string">.</span>, <span class="hljs-number">0</span><span class="hljs-string">.</span>]]<span class="hljs-string">])</span>
</code></pre><p>this tensor is filled with zeros, so PyTorch allocates memory and zero-initializes the tensor elements inside</p>
<p>You cannot change the way a tensor is created, if you create a zeros tensor, make sure is not referenced to any other.</p>
<pre><code>*<span class="hljs-comment"># correctly initialized*</span>
a = torch.<span class="hljs-keyword">empty</span>(<span class="hljs-number">3</span>,<span class="hljs-number">3</span>)
<span class="hljs-keyword">print</span>(a)

<span class="hljs-comment">#also correct</span>
b = torch.<span class="hljs-keyword">empty</span>(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)

<span class="hljs-keyword">print</span>(b)
</code></pre><p>the results will be:</p>
<pre><code><span class="hljs-string">tensor([[2.4258e-35,</span> <span class="hljs-number">0.0000e+00</span><span class="hljs-string">,</span> <span class="hljs-number">1.5975e-43</span><span class="hljs-string">],</span>
        [<span class="hljs-number">1.3873e-43</span>, <span class="hljs-number">1.4574e-43</span>, <span class="hljs-number">6.4460e-44</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">1.4153e-43</span>, <span class="hljs-number">1.5274e-43</span>, <span class="hljs-number">1.5695e-43</span>]<span class="hljs-string">])</span>
<span class="hljs-string">tensor([[[2.3564e-35,</span> <span class="hljs-number">0.0000e+00</span><span class="hljs-string">,</span> <span class="hljs-number">1.4013e-45</span><span class="hljs-string">],</span>
         [<span class="hljs-number">1.4574e-43</span>, <span class="hljs-number">6.4460e-44</span>, <span class="hljs-number">1.4153e-43</span>]<span class="hljs-string">]])</span>
</code></pre><p>Lets see now, how you cannot use the zeros function:</p>
<pre><code>*<span class="hljs-comment"># incorrect reference, you must create a new one*</span>
c = torch.zeros(b,<span class="hljs-number">1</span>) 
print(<span class="hljs-string">"c = "</span>, c)
</code></pre><p>output:</p>
<pre><code><span class="hljs-comment">---------------------------------------------------------------------------</span>
TypeError                                 Traceback (most recent <span class="hljs-keyword">call</span> <span class="hljs-keyword">last</span>)
&lt;ipython-<span class="hljs-keyword">input</span><span class="hljs-number">-35</span>-c044e2995879&gt; <span class="hljs-keyword">in</span> &lt;<span class="hljs-keyword">module</span>&gt;()
**      <span class="hljs-number">1</span>** <span class="hljs-comment"># incorrect reference, you must create a new one</span>
<span class="hljs-comment">----&gt; 2 c = torch.zeros(b,1)</span>
**      <span class="hljs-number">3</span>** print(<span class="hljs-string">"c = "</span>, c)

TypeError: zeros() received an invalid combination <span class="hljs-keyword">of</span> arguments - got (Tensor, <span class="hljs-built_in">int</span>), but expected one <span class="hljs-keyword">of</span>:
 * (tuple <span class="hljs-keyword">of</span> ints <span class="hljs-keyword">size</span>, *, tuple <span class="hljs-keyword">of</span> <span class="hljs-keyword">names</span> <span class="hljs-keyword">names</span>, torch.dtype dtype, torch.layout layout, torch.device device, <span class="hljs-built_in">bool</span> pin_memory, <span class="hljs-built_in">bool</span> requires_grad)
 * (tuple <span class="hljs-keyword">of</span> ints <span class="hljs-keyword">size</span>, *, Tensor <span class="hljs-keyword">out</span>, torch.dtype dtype, torch.layout layout, torch.device device, <span class="hljs-built_in">bool</span> pin_memory, <span class="hljs-built_in">bool</span> requires_grad)
</code></pre><p>lets review the zero method closely:</p>
<p>Our documentation says:</p>
<pre><code><span class="hljs-attribute">Syntax</span>: torch.zeros(size, out=None)

<span class="yaml"><span class="hljs-attr">Parameters:</span>
<span class="hljs-attr">size:</span> <span class="hljs-string">a</span> <span class="hljs-string">sequence</span> <span class="hljs-string">of</span> <span class="hljs-string">integers</span> <span class="hljs-string">defining</span> <span class="hljs-string">the</span> <span class="hljs-string">shape</span> <span class="hljs-string">of</span> <span class="hljs-string">the</span> <span class="hljs-string">output</span> <span class="hljs-string">tensor</span>
<span class="hljs-string">out</span> <span class="hljs-string">(Tensor,</span> <span class="hljs-string">optional):</span> <span class="hljs-string">the</span> <span class="hljs-string">output</span> <span class="hljs-string">tensor</span>

<span class="hljs-attr">Return type:</span> <span class="hljs-string">A</span> <span class="hljs-string">tensor</span> <span class="hljs-string">filled</span> <span class="hljs-string">with</span> <span class="hljs-string">scalar</span> <span class="hljs-string">value</span> <span class="hljs-number">0</span><span class="hljs-string">,</span> <span class="hljs-string">of</span> <span class="hljs-string">same</span> <span class="hljs-string">shape</span> <span class="hljs-string">as</span> <span class="hljs-string">size.</span></span>
</code></pre><p>torch.zeros and torch.empty are the first functions to start working with pytorch tensors and learning a little bit of matrix and vectors</p>
<h2 id="function-2-tensor-size-shape-and-dimension-operations">Function 2 — Tensor Size, Shape and Dimension Operations</h2>
<p>Lets understand dimensions in Pytorch.</p>
<p>Now lets create some tensors and determine the size of every one</p>
<pre><code>**<span class="hljs-keyword">import</span>** **torch** 
*# <span class="hljs-type">Create</span> a tensor from data*
<span class="hljs-built_in">c</span> = torch.tensor([[<span class="hljs-number">3.2</span> , <span class="hljs-number">1.6</span>, <span class="hljs-number">2</span>], [<span class="hljs-number">1.3</span>, <span class="hljs-number">2.5</span> , <span class="hljs-number">6.9</span>]])
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">c</span>)

<span class="hljs-built_in">print</span>(<span class="hljs-built_in">c</span>.size())
</code></pre><p>output</p>
<pre><code><span class="hljs-string">tensor([[3.2000,</span> <span class="hljs-number">1.6000</span><span class="hljs-string">,</span> <span class="hljs-number">2.0000</span><span class="hljs-string">],</span>
        [<span class="hljs-number">1.3000</span>, <span class="hljs-number">2.5000</span>, <span class="hljs-number">6.9000</span>]<span class="hljs-string">])</span>
<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">3</span><span class="hljs-string">])</span>
</code></pre><p>Lets see torch.shape and take a closer look at how size is given here</p>
<p>Now in the next example lets use shape functions to get the size of a tensor</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">x</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([</span>
     [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<span class="hljs-string">,</span>
     [<span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>]
   <span class="hljs-string">])</span>
<span class="hljs-string">x.shape</span>
<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">3</span><span class="hljs-string">])</span>
</code></pre><p>Out[ ]:</p>
<pre><code><span class="hljs-selector-tag">torch</span><span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[2, 3]</span>)
</code></pre><p>Shape and Size give us the same correct dimensions of the tensor.</p>
<p>in this case we have a 3D-tensor (with 3 dimensions)</p>
<p>Dimension 0 Dimension 1 and Dimension 2</p>
<p>lets create a new tensor:</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">y</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([</span>
     [
       [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],
       [<span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>]
     ]<span class="hljs-string">,</span>
     [
       [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],
       [<span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>]
     ]<span class="hljs-string">,</span>
     [
       [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],
       [<span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>]
     ]
   <span class="hljs-string">])</span>

<span class="hljs-string">y.shape</span>
</code></pre><p>Out[ ]:</p>
<pre><code><span class="hljs-attribute">torch</span>.Size([<span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>])
</code></pre><p>Lets se how we can make operations using a 3d tensor now for every dimension layer and see how it behaves</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">sum1</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.sum(y,</span> <span class="hljs-string">dim=0)</span>
<span class="hljs-string">print(sum1)</span>

<span class="hljs-string">sum2</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.sum(y,</span> <span class="hljs-string">dim=1)</span>
<span class="hljs-string">print(sum2)</span>

<span class="hljs-string">sum3</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.sum(y,</span> <span class="hljs-string">dim=2)</span>
<span class="hljs-string">print(sum3)</span>

<span class="hljs-string">tensor([[</span> <span class="hljs-number">3</span><span class="hljs-string">,</span>  <span class="hljs-number">6</span><span class="hljs-string">,</span>  <span class="hljs-number">9</span><span class="hljs-string">],</span>
        [<span class="hljs-number">12</span>, <span class="hljs-number">15</span>, <span class="hljs-number">18</span>]<span class="hljs-string">])</span>
<span class="hljs-string">tensor([[5,</span> <span class="hljs-number">7</span><span class="hljs-string">,</span> <span class="hljs-number">9</span><span class="hljs-string">],</span>
        [<span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">9</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">9</span>]<span class="hljs-string">])</span>
<span class="hljs-string">tensor([[</span> <span class="hljs-number">6</span><span class="hljs-string">,</span> <span class="hljs-number">15</span><span class="hljs-string">],</span>
        [ <span class="hljs-number">6</span>, <span class="hljs-number">15</span>]<span class="hljs-string">,</span>
        [ <span class="hljs-number">6</span>, <span class="hljs-number">15</span>]<span class="hljs-string">])</span>
</code></pre><p>we can see now a 3d tensor is more complicated as we advance, and we can perform custom operations within every dimension</p>
<p>its limited right now to 3 dims so we cannot perform this:</p>
<p>In []</p>
<pre><code><span class="hljs-attribute">sum2</span> = torch.sum(y, dim=<span class="hljs-number">3</span>)
<span class="hljs-attribute">print</span>(sum<span class="hljs-number">1</span>)
</code></pre><p>Out [ ]:</p>
<pre><code><span class="hljs-comment">---------------------------------------------------------------------------</span>
IndexError                                Traceback (most recent <span class="hljs-keyword">call</span> <span class="hljs-keyword">last</span>)
&lt;ipython-<span class="hljs-keyword">input</span><span class="hljs-number">-56</span><span class="hljs-number">-7</span>caf723c6102&gt; <span class="hljs-keyword">in</span> &lt;<span class="hljs-keyword">module</span>&gt;()
<span class="hljs-comment">----&gt; 1 sum2 = torch.sum(y, dim=3)</span>
**      <span class="hljs-number">2</span>** print(sum1)

IndexError: <span class="hljs-keyword">Dimension</span> <span class="hljs-keyword">out</span> <span class="hljs-keyword">of</span> <span class="hljs-keyword">range</span> (expected <span class="hljs-keyword">to</span> be <span class="hljs-keyword">in</span> <span class="hljs-keyword">range</span> <span class="hljs-keyword">of</span> [<span class="hljs-number">-3</span>, <span class="hljs-number">2</span>], but got <span class="hljs-number">3</span>)
</code></pre><p>to accomplish adding more layers of dimensions we can review the unsqueeze functions → .unsqueeze() but for now let’s go to the next basic function</p>
<h2 id="function-3-reshape-view-and-random">Function 3 — Reshape, View and Random</h2>
<p>There is a function in NunPy called ndarray.reshape() for reshaping an array.</p>
<p>Now in pytorch, there is torch.view(tensor) for the same purpose, but at the same time, there is also a torch.reshape(tensor).</p>
<p>let’s figure out the differences between them and when you should use either of them.</p>
<p>First of all we are going to use a new functions for randomize our tensor.</p>
<p>In [ ]:</p>
<pre><code>**<span class="hljs-keyword">import</span>** **torch** 
x = torch.randn(<span class="hljs-number">5</span>, <span class="hljs-number">3</span>)

<span class="hljs-built_in">print</span>(x)
</code></pre><p>Out []</p>
<pre><code><span class="hljs-string">tensor([[-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">],</span>
        [<span class="hljs-number">-0.9810</span>,  <span class="hljs-number">0.0626</span>,  <span class="hljs-number">0.4100</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.6519</span>, <span class="hljs-number">-0.0595</span>, <span class="hljs-number">-1.2156</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.3973</span>, <span class="hljs-number">-0.3103</span>,  <span class="hljs-number">1.6253</span>]<span class="hljs-string">,</span>
        [ <span class="hljs-number">0.2775</span>, <span class="hljs-number">-0.0045</span>, <span class="hljs-number">-0.2985</span>]<span class="hljs-string">])</span>
</code></pre><p>this is basic usage of torch.randm, so now lets use View from another variable “y” and describe all elements</p>
<p>In [ ]:</p>
<pre><code>*<span class="hljs-comment"># Return a view of the x, but only having *</span>
*<span class="hljs-comment"># one dimension and max number of elements*</span>
y = x.view(<span class="hljs-number">5</span> * <span class="hljs-number">3</span>)

*<span class="hljs-comment">#lets see the size of every tensor*</span>
print(<span class="hljs-string">"lets see the size of every tensor"</span>)
print(<span class="hljs-string">'Size of x:'</span>, x.size())
print(<span class="hljs-string">'Size of y:'</span>, y.size())

*<span class="hljs-comment">#and the elements of very tensor to compare*</span>
print(<span class="hljs-string">"and the elements of very tensor to compare"</span>)
print(<span class="hljs-string">"X:"</span>, x)
print(<span class="hljs-string">"Y:"</span>, y)
</code></pre><p>Out []</p>
<pre><code><span class="hljs-string">lets</span> <span class="hljs-string">see</span> <span class="hljs-string">the</span> <span class="hljs-string">size</span> <span class="hljs-string">of</span> <span class="hljs-string">every</span> <span class="hljs-string">tensor</span>
<span class="hljs-attr">Size of x:</span> <span class="hljs-string">torch.Size([5,</span> <span class="hljs-number">3</span><span class="hljs-string">])</span>
<span class="hljs-attr">Size of y:</span> <span class="hljs-string">torch.Size([15])</span>
<span class="hljs-string">and</span> <span class="hljs-string">the</span> <span class="hljs-string">elements</span> <span class="hljs-string">of</span> <span class="hljs-string">very</span> <span class="hljs-string">tensor</span> <span class="hljs-string">to</span> <span class="hljs-string">compare</span>
<span class="hljs-attr">X:</span> <span class="hljs-string">tensor([[-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">],</span>
        [<span class="hljs-number">-0.9810</span>,  <span class="hljs-number">0.0626</span>,  <span class="hljs-number">0.4100</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.6519</span>, <span class="hljs-number">-0.0595</span>, <span class="hljs-number">-1.2156</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.3973</span>, <span class="hljs-number">-0.3103</span>,  <span class="hljs-number">1.6253</span>]<span class="hljs-string">,</span>
        [ <span class="hljs-number">0.2775</span>, <span class="hljs-number">-0.0045</span>, <span class="hljs-number">-0.2985</span>]<span class="hljs-string">])</span>
<span class="hljs-attr">Y:</span> <span class="hljs-string">tensor([-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">,</span> <span class="hljs-number">-0.9810</span><span class="hljs-string">,</span>  <span class="hljs-number">0.0626</span><span class="hljs-string">,</span>  <span class="hljs-number">0.4100</span><span class="hljs-string">,</span> <span class="hljs-number">-0.6519</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0595</span><span class="hljs-string">,</span>
        <span class="hljs-number">-1.2156</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3973</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3103</span><span class="hljs-string">,</span>  <span class="hljs-number">1.6253</span><span class="hljs-string">,</span>  <span class="hljs-number">0.2775</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0045</span><span class="hljs-string">,</span> <span class="hljs-number">-0.2985</span><span class="hljs-string">])</span>
</code></pre><p>take a look at Y tensor, it only has 1 dimension. so Viewing another tensor may be difficult for some operations</p>
<p>Now lets use Reshape to replicate the exact dimensions of X</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">*#</span> <span class="hljs-string">Get</span> <span class="hljs-string">back</span> <span class="hljs-string">the</span> <span class="hljs-string">original</span> <span class="hljs-string">tensor</span> <span class="hljs-string">with</span> <span class="hljs-string">reshape()*</span>
<span class="hljs-string">z</span> <span class="hljs-string">=</span> <span class="hljs-string">y.reshape(5,</span> <span class="hljs-number">3</span><span class="hljs-string">)</span>
<span class="hljs-string">print(z)</span>

<span class="hljs-string">tensor([[-0.2927,</span>  <span class="hljs-number">0.0329</span><span class="hljs-string">,</span>  <span class="hljs-number">0.8485</span><span class="hljs-string">],</span>
        [ <span class="hljs-number">1.9581</span>,  <span class="hljs-number">0.8313</span>, <span class="hljs-number">-0.1529</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.2330</span>, <span class="hljs-number">-0.1887</span>,  <span class="hljs-number">1.8206</span>]<span class="hljs-string">,</span>
        [ <span class="hljs-number">1.5252</span>,  <span class="hljs-number">1.0909</span>,  <span class="hljs-number">0.0547</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.1231</span>, <span class="hljs-number">-0.4238</span>, <span class="hljs-number">-0.6724</span>]<span class="hljs-string">])</span>
</code></pre><p>we cannot only reshape the original, we can also change the dimensions with some limited actions related to the maximum elements:</p>
<p>first lets reshape to 1 more dimension</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">*#</span> <span class="hljs-string">Get</span> <span class="hljs-string">back</span> <span class="hljs-string">the</span> <span class="hljs-string">original</span> <span class="hljs-string">tensor</span> <span class="hljs-string">with</span> <span class="hljs-string">reshape()*</span>
<span class="hljs-string">z</span> <span class="hljs-string">=</span> <span class="hljs-string">y.reshape(15)</span>
<span class="hljs-string">print(z)</span>

<span class="hljs-comment">#reshaping 15 elements, 1 dim</span>
<span class="hljs-string">z</span> <span class="hljs-string">=</span> <span class="hljs-string">y.reshape(3*5)</span>
<span class="hljs-string">print(z)</span>

<span class="hljs-comment">#reshaping in different order, 3 dimensions</span>
<span class="hljs-string">z</span> <span class="hljs-string">=</span> <span class="hljs-string">y.reshape(3,5)</span>
<span class="hljs-string">print(z)</span>

<span class="hljs-comment">#Reshaping with more dimensions but its 15 elements always</span>
<span class="hljs-string">z</span> <span class="hljs-string">=</span> <span class="hljs-string">y.reshape(3,5,1)</span>
<span class="hljs-string">print(z)</span>

<span class="hljs-string">tensor([-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">,</span> <span class="hljs-number">-0.9810</span><span class="hljs-string">,</span>  <span class="hljs-number">0.0626</span><span class="hljs-string">,</span>  <span class="hljs-number">0.4100</span><span class="hljs-string">,</span> <span class="hljs-number">-0.6519</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0595</span><span class="hljs-string">,</span>
        <span class="hljs-number">-1.2156</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3973</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3103</span><span class="hljs-string">,</span>  <span class="hljs-number">1.6253</span><span class="hljs-string">,</span>  <span class="hljs-number">0.2775</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0045</span><span class="hljs-string">,</span> <span class="hljs-number">-0.2985</span><span class="hljs-string">])</span>
<span class="hljs-string">tensor([-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">,</span> <span class="hljs-number">-0.9810</span><span class="hljs-string">,</span>  <span class="hljs-number">0.0626</span><span class="hljs-string">,</span>  <span class="hljs-number">0.4100</span><span class="hljs-string">,</span> <span class="hljs-number">-0.6519</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0595</span><span class="hljs-string">,</span>
        <span class="hljs-number">-1.2156</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3973</span><span class="hljs-string">,</span> <span class="hljs-number">-0.3103</span><span class="hljs-string">,</span>  <span class="hljs-number">1.6253</span><span class="hljs-string">,</span>  <span class="hljs-number">0.2775</span><span class="hljs-string">,</span> <span class="hljs-number">-0.0045</span><span class="hljs-string">,</span> <span class="hljs-number">-0.2985</span><span class="hljs-string">])</span>
<span class="hljs-string">tensor([[-0.5793,</span>  <span class="hljs-number">0.6999</span><span class="hljs-string">,</span>  <span class="hljs-number">1.7417</span><span class="hljs-string">,</span> <span class="hljs-number">-0.9810</span><span class="hljs-string">,</span>  <span class="hljs-number">0.0626</span><span class="hljs-string">],</span>
        [ <span class="hljs-number">0.4100</span>, <span class="hljs-number">-0.6519</span>, <span class="hljs-number">-0.0595</span>, <span class="hljs-number">-1.2156</span>, <span class="hljs-number">-0.3973</span>]<span class="hljs-string">,</span>
        [<span class="hljs-number">-0.3103</span>,  <span class="hljs-number">1.6253</span>,  <span class="hljs-number">0.2775</span>, <span class="hljs-number">-0.0045</span>, <span class="hljs-number">-0.2985</span>]<span class="hljs-string">])</span>
<span class="hljs-string">tensor([[[-0.5793],</span>
         [ <span class="hljs-number">0.6999</span>]<span class="hljs-string">,</span>
         [ <span class="hljs-number">1.7417</span>]<span class="hljs-string">,</span>
         [<span class="hljs-number">-0.9810</span>]<span class="hljs-string">,</span>
         [ <span class="hljs-number">0.0626</span>]<span class="hljs-string">],</span>

        [[ <span class="hljs-number">0.4100</span>],
         [<span class="hljs-number">-0.6519</span>],
         [<span class="hljs-number">-0.0595</span>],
         [<span class="hljs-number">-1.2156</span>],
         [<span class="hljs-number">-0.3973</span>]]<span class="hljs-string">,</span>

        [[<span class="hljs-number">-0.3103</span>],
         [ <span class="hljs-number">1.6253</span>],
         [ <span class="hljs-number">0.2775</span>],
         [<span class="hljs-number">-0.0045</span>],
         [<span class="hljs-number">-0.2985</span>]]<span class="hljs-string">])</span>
</code></pre><p>Now lets reshape exceeding the number of elements in the tensor:</p>
<p>In [ ]:</p>
<pre><code>z = y.reshape(<span class="hljs-number">16</span>)
print(z)
</code></pre><p>Out []</p>
<pre><code><span class="hljs-comment">---------------------------------------------------------------------------</span>
RuntimeError Traceback (most recent <span class="hljs-keyword">call</span> <span class="hljs-keyword">last</span>)
&lt;ipython-<span class="hljs-keyword">input</span><span class="hljs-number">-78</span>-c7ae174fce73&gt; <span class="hljs-keyword">in</span> &lt;<span class="hljs-keyword">module</span>&gt;()
<span class="hljs-comment">----&gt; 1 z = y.reshape(16)</span>
**      <span class="hljs-number">2</span>** print(z)

RuntimeError: shape <span class="hljs-string">'[16]'</span> <span class="hljs-keyword">is</span> invalid <span class="hljs-keyword">for</span> <span class="hljs-keyword">input</span> <span class="hljs-keyword">of</span> <span class="hljs-keyword">size</span> <span class="hljs-number">15</span>
</code></pre><p>it will fail also for z = y.reshape(3*6) or putting more elements that does not exist in the tensor.</p>
<p>Now let’s keep going to the next section.</p>
<h2 id="function-4-unsqueeze">Function 4 — Unsqueeze()</h2>
<p>Mainly, it allows us to add more dimensions at specific index you define.</p>
<p>lets take a look:</p>
<p>In [ ]:</p>
<pre><code>**<span class="hljs-keyword">import</span>** **torch**

<span class="hljs-comment">#dim=1, that is (3)</span>
x = torch.tensor([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>])
print(<span class="hljs-string">'x: '</span>, x)
print(<span class="hljs-string">'x.size: '</span>, x.size())

<span class="hljs-comment">#x1 becomes a matrix of (3,1)</span>
x1 = torch.unsqueeze(x, <span class="hljs-number">1</span>)
print(<span class="hljs-string">'x1: '</span>, x1)
print(<span class="hljs-string">'x1.size: '</span>, x1.size())
</code></pre><p>Out []</p>
<pre><code><span class="hljs-selector-tag">x</span>:  <span class="hljs-selector-tag">tensor</span>(<span class="hljs-selector-attr">[1, 2, 3]</span>)
<span class="hljs-selector-tag">x</span><span class="hljs-selector-class">.size</span>:  <span class="hljs-selector-tag">torch</span><span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[3]</span>)
<span class="hljs-selector-tag">x1</span>:  <span class="hljs-selector-tag">tensor</span>(<span class="hljs-selector-attr">[[1]</span>,
        <span class="hljs-selector-attr">[2]</span>,
        <span class="hljs-selector-attr">[3]</span>])
<span class="hljs-selector-tag">x1</span><span class="hljs-selector-class">.size</span>:  <span class="hljs-selector-tag">torch</span><span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[3, 1]</span>)
<span class="hljs-selector-tag">x2</span>:  <span class="hljs-selector-tag">tensor</span>(<span class="hljs-selector-attr">[[1, 2, 3]</span>])
<span class="hljs-selector-tag">x2</span><span class="hljs-selector-class">.size</span>:  <span class="hljs-selector-tag">torch</span><span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 3]</span>)
</code></pre><p>Our initial tensor is Tensor([1,2,3]), and the output size is [3].</p>
<p>And then we proceed with adding 1 dimenson with unsqueeze operation, namely torch.unsqueeze(x, 1), the size of x1 is [3,1].</p>
<p>In [ ]:</p>
<pre><code>*<span class="hljs-comment">#x2 becomes a matrix of (1,3)*</span>
x2 = torch.unsqueeze(x, <span class="hljs-number">0</span>)
print(<span class="hljs-string">'x2: '</span>, x2)
print(<span class="hljs-string">'x2.size: '</span>, x2.size())
</code></pre><p>Out []</p>
<pre><code><span class="hljs-attribute">x2</span>:  tensor([[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]])
<span class="hljs-attribute">x2</span>.size:  torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">3</span>])
</code></pre><p>When we perform torch.unsqueeze(x, 0), the size of x2 is [1,3].</p>
<p>In [ ]:</p>
<pre><code>*<span class="hljs-comment"># Example 3 - breaking (to illustrate when it breaks)*</span>


print(x.unsqueeze())
</code></pre><p>Out []</p>
<pre><code><span class="hljs-comment">---------------------------------------------------------------------------</span>
TypeError  Traceback (most recent <span class="hljs-keyword">call</span> <span class="hljs-keyword">last</span>)
&lt;ipython-<span class="hljs-keyword">input</span><span class="hljs-number">-89</span><span class="hljs-number">-5</span>a320a828907&gt; <span class="hljs-keyword">in</span> &lt;<span class="hljs-keyword">module</span>&gt;()
**      <span class="hljs-number">2</span>** 
**      <span class="hljs-number">3</span>** 
<span class="hljs-comment">----&gt; 4 print(x.unsqueeze())</span>

TypeError: unsqueeze() <span class="hljs-keyword">missing</span> <span class="hljs-number">1</span> <span class="hljs-keyword">required</span> positional arguments: <span class="hljs-string">"dim"</span>
</code></pre><p>We must specified the dimension correctly, although we are just adding 1 dim, it is necessary to put like this: x.unqueeze(0)</p>
<h2 id="function-5-torch-eq-element-wise-equality">Function 5 — Torch Eq (Element Wise equality)</h2>
<p>This function is under comparison category and it computes equality in element-wise and returns a boolean tensor. True if equal, False otherwise.</p>
<p>Lets review how we can operate with different sizes of tensors:</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">*#</span> <span class="hljs-string">Example</span> <span class="hljs-number">1</span> <span class="hljs-bullet">-</span> <span class="hljs-string">working</span> <span class="hljs-string">*</span>
<span class="hljs-string">x1</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([[1,</span> <span class="hljs-number">2</span><span class="hljs-string">],</span> [<span class="hljs-number">3</span>, <span class="hljs-number">4</span><span class="hljs-string">.</span>]<span class="hljs-string">])</span>
<span class="hljs-string">x2</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([[2,</span> <span class="hljs-number">2</span><span class="hljs-string">],</span> [<span class="hljs-number">2</span>, <span class="hljs-number">5</span>]<span class="hljs-string">])</span>
<span class="hljs-string">x3</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.randn(3,5)</span>

<span class="hljs-comment">#size x1 and z2</span>
<span class="hljs-string">print(x1.size())</span>
<span class="hljs-string">print(x2.size())</span>

<span class="hljs-comment"># tensors 1 and 2</span>
<span class="hljs-string">print(x1)</span>
<span class="hljs-string">print(x2)</span>


<span class="hljs-comment">#size x3</span>
<span class="hljs-string">print(x3.size())</span>

<span class="hljs-comment">#tensors 3</span>
<span class="hljs-string">print(x3)</span>

<span class="hljs-string">torch.eq(x1,x2)</span>

<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">2</span><span class="hljs-string">])</span>
<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">2</span><span class="hljs-string">])</span>
<span class="hljs-string">tensor([[1.,</span> <span class="hljs-number">2</span><span class="hljs-string">.],</span>
        [<span class="hljs-number">3</span><span class="hljs-string">.</span>, <span class="hljs-number">4</span><span class="hljs-string">.</span>]<span class="hljs-string">])</span>
<span class="hljs-string">tensor([[2,</span> <span class="hljs-number">2</span><span class="hljs-string">],</span>
        [<span class="hljs-number">2</span>, <span class="hljs-number">5</span>]<span class="hljs-string">])</span>
<span class="hljs-string">torch.Size([3,</span> <span class="hljs-number">5</span><span class="hljs-string">])</span>
<span class="hljs-string">tensor([[-1.3040,</span> <span class="hljs-number">-0.4658</span><span class="hljs-string">,</span> <span class="hljs-number">-0.5269</span><span class="hljs-string">,</span>  <span class="hljs-number">0.7409</span><span class="hljs-string">,</span>  <span class="hljs-number">0.9135</span><span class="hljs-string">],</span>
        [ <span class="hljs-number">1.0780</span>,  <span class="hljs-number">2.0584</span>, <span class="hljs-number">-0.9629</span>, <span class="hljs-number">-1.1412</span>, <span class="hljs-number">-0.3105</span>]<span class="hljs-string">,</span>
        [ <span class="hljs-number">0.3613</span>, <span class="hljs-number">-1.4196</span>,  <span class="hljs-number">2.1145</span>,  <span class="hljs-number">0.3649</span>,  <span class="hljs-number">0.2037</span>]<span class="hljs-string">])</span>
</code></pre><p>Out[ ]:</p>
<pre><code><span class="hljs-string">tensor([[False,</span>  <span class="hljs-literal">True</span><span class="hljs-string">],</span>
        [<span class="hljs-literal">False</span>, <span class="hljs-literal">False</span>]<span class="hljs-string">])</span>
</code></pre><p>x1 and x3 have the same size, but x3 is [3,5], has bigger size.</p>
<p>comparing x1 and x2 is Ok.</p>
<p>In [ ]:</p>
<pre><code>*<span class="hljs-comment"># Example 2 - working (with broadcasting)*</span>
x4 = torch.tensor([[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>], [<span class="hljs-number">3</span>, <span class="hljs-number">4</span>]])
<span class="hljs-keyword">print</span>(x4.size())
x5 = torch.tensor([<span class="hljs-number">2</span>, <span class="hljs-number">5</span>])
<span class="hljs-keyword">print</span>(x5.size())
torch.e<span class="hljs-string">q(x4, x5)</span>

torch.Size([<span class="hljs-number">2</span>, <span class="hljs-number">2</span>])
torch.Size([<span class="hljs-number">2</span>])
</code></pre><p>Out[ ]:</p>
<pre><code><span class="hljs-string">tensor([[False,</span> <span class="hljs-literal">False</span><span class="hljs-string">],</span>
        [<span class="hljs-literal">False</span>, <span class="hljs-literal">False</span>]<span class="hljs-string">])</span>
</code></pre><p>we can also compare, different sizes only if the seconf value, in this case x5, that has size of [2] is broadcastable with the frist one thst is [2,2]</p>
<p>In [ ]:</p>
<pre><code><span class="hljs-string">*#</span> <span class="hljs-string">Example</span> <span class="hljs-number">3</span> <span class="hljs-bullet">-</span> <span class="hljs-string">breaking</span> <span class="hljs-string">(to</span> <span class="hljs-string">illustrate</span> <span class="hljs-string">when</span> <span class="hljs-string">it</span> <span class="hljs-string">breaks)*</span>
<span class="hljs-string">x6</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([[0,</span> <span class="hljs-number">2</span><span class="hljs-string">,</span> <span class="hljs-number">4</span><span class="hljs-string">],</span> [<span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]<span class="hljs-string">])</span>
<span class="hljs-string">print(x6.size())</span>
<span class="hljs-string">x7</span> <span class="hljs-string">=</span> <span class="hljs-string">torch.tensor([[2,</span> <span class="hljs-number">3</span><span class="hljs-string">],</span> [<span class="hljs-number">2</span>, <span class="hljs-number">4</span>]<span class="hljs-string">])</span>
<span class="hljs-string">print(x7.size())</span>

<span class="hljs-string">torch.eq(x6,</span> <span class="hljs-string">x3)</span>

<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">3</span><span class="hljs-string">])</span>
<span class="hljs-string">torch.Size([2,</span> <span class="hljs-number">2</span><span class="hljs-string">])</span>

<span class="hljs-string">---------------------------------------------------------------------------</span>
<span class="hljs-string">RuntimeError</span>                              <span class="hljs-string">Traceback</span> <span class="hljs-string">(most</span> <span class="hljs-string">recent</span> <span class="hljs-string">call</span> <span class="hljs-string">last)</span>
<span class="hljs-string">&lt;ipython-input-98-ac2ad1ecd5b0&gt;</span> <span class="hljs-string">in</span> <span class="hljs-string">&lt;module&gt;()</span>
      <span class="hljs-number">5</span> <span class="hljs-string">print(x7.size())</span>
      <span class="hljs-number">6</span> 
<span class="hljs-string">----&gt;</span> <span class="hljs-number">7</span> <span class="hljs-string">torch.eq(x6,</span> <span class="hljs-string">x3)</span>

<span class="hljs-attr">RuntimeError:</span> <span class="hljs-string">The</span> <span class="hljs-string">size</span> <span class="hljs-string">of</span> <span class="hljs-string">tensor</span> <span class="hljs-string">a</span> <span class="hljs-string">(3)</span> <span class="hljs-string">must</span> <span class="hljs-string">match</span> <span class="hljs-string">the</span> <span class="hljs-string">size</span> <span class="hljs-string">of</span> <span class="hljs-string">tensor</span> <span class="hljs-string">b</span> <span class="hljs-string">(5)</span> <span class="hljs-string">at</span> <span class="hljs-string">non-singleton</span> <span class="hljs-string">dimension</span> <span class="hljs-number">1</span>
</code></pre><p>finally, we cant compare different sizes if the second arguments shape is not broadcastable with the first argument.</p>
<h2 id="conclusion">Conclusion</h2>
<p>we review 5 basic topics covering more than 10 PyTorch functions.</p>
<p>in the next post i’ll talk about Linear Regression.</p>
<h2 id="reference-links">Reference Links</h2>
<p>Provide links to your references and other interesting articles about tensors</p>
<ul>
<li><p>Official documentation for tensor operations: <a target="_blank" href="https://pytorch.org/docs/stable/torch.html">https://pytorch.org/docs/stable/torch.html</a></p>
</li>
<li><p>Squeeze and unsqueeze functions here: <a target="_blank" href="https://www.programmersought.com/article/65705814717/">https://www.programmersought.com/article/65705814717/</a></p>
</li>
<li><p>Understanding dimensions in Pytorch: <a target="_blank" href="https://towardsdatascience.com/understanding-dimensions-in-pytorch-6edf9972d3be">https://towardsdatascience.com/understanding-dimensions-in-pytorch-6edf9972d3be</a></p>
</li>
</ul>
<p>#aws #reinvent2020 #awsperu #awsugperu #awscloud</p>
<p>Carlos Cortez — AWS UG Perú Leader / AWS ML Community Builder
ccortez@aws.pe
<a target="_blank" href="https://dev.to/ccortezb">@ccortezb</a>
Podcast: imperiocloud.com @imperiocloud
twitch.tv/awsugperu
cennticloud.thinkific.com
<a target="_blank" href="https://www.linkedin.com/in/carloscortezcloud/"><strong>Carlos Cortez ML Engineer — Senior Cloud Architect — Pro Services Cluster — BGH Tech Partner |…</strong>
<em>Hello Everyone, I’m the Founder of AWS User Group Perú 🇵🇪 (2014) and also an AWS Solutions Architect Certified…</em>www.linkedin.com</a></p>
]]></content:encoded></item><item><title><![CDATA[Lanzamiento del programa AWS DeepRacer League Perú]]></title><description><![CDATA[Bienvenidos!
Seremos los primeros en generar conocimiento y crear una liga en Perú de AWS DeepRacer. Es un gran reto y para eso nos reuniremos.
Para empezar, agradecemos a todos los inscritos a este programa realizado y creado por la comunidad AWS Us...]]></description><link>https://aiformortals.cortez.cloud/lanzamiento-del-programa-aws-deepracer-league-per%C3%BA-2ceb7dfd5945</link><guid isPermaLink="true">https://aiformortals.cortez.cloud/lanzamiento-del-programa-aws-deepracer-league-per%C3%BA-2ceb7dfd5945</guid><dc:creator><![CDATA[Carlos Eduardo Cortez Bazan]]></dc:creator><pubDate>Thu, 05 Mar 2020 18:16:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031535029/-GZtFBiJR.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="bienvenidos">Bienvenidos!</h2>
<p>Seremos los primeros en generar conocimiento y crear una liga en Perú de AWS DeepRacer. Es un gran reto y para eso nos reuniremos.</p>
<p>Para empezar, agradecemos a todos los inscritos a este programa realizado y creado por la comunidad AWS User Group Perú y queremos darle la bienvenida en este evento. Por este medio les enviaremos información relevante respecto a este programa.</p>
<h2 id="nuestro-objetivo">Nuestro objetivo</h2>
<p>Es hacer que AWS realice una competencia oficial de DeepRacer durante nuestro próximo AWS Community Day 2020. para ello debemos de crear un grupo inicial de líderes y entusiastas en aprender y difundir.</p>
<h2 id="de-que-trata-este-programa-gratuito">De qué trata este programa gratuito?</h2>
<p>El programa de DeepRacer League Perú, se creó para incentivar el aprendizaje reforzado, y los servicios de AWS involucrados en el funcionamiento y entrenamiento de éste vehículo autónomo.</p>
<p>El programa incluye lo siguiente:</p>
<ul>
<li>1ra Convocatoria de voluntariado e interesados a unirse al clan</li>
<li>Asistir a CETAM para revisar DeepRacer en funcionamiento con la PUCP</li>
<li>Introducción a AWS DeepRacer y AWS Robomaker, series de 3 partes</li>
<li>Introducción a RL series de 3 partes</li>
<li>2da Convocatoria de voluntariado e interesados a unirse al clan</li>
<li>Taller de AWS DeepRacer básico, series de 3 partes</li>
<li>Gestionar la impresión de 1 pista básica
3ra Convocatoria de voluntariado e interesados a unirse al clan
Taller de AWS DeepRacer a profundidad
Conseguir créditos para participantes.</li>
</ul>
<h2 id="las-reglas-del-programa-son-las-siguientes">Las reglas del programa son las siguientes:</h2>
<ul>
<li>No somos expertos en AWS DeepRacer, aprenderemos juntos cada vez investigando.</li>
<li>Cada uno tendrá oportunidad de exponer y enseñar lo investigado y logrado ante todos.</li>
<li>Haremos sesiones online y presenciales</li>
<li>Divertirnos y aprender muchísimo de cómo funciona Reinforcement Learning en AWS</li>
</ul>
<p>Gracias,
El equipo de AWS User Group Perú</p>
<p><img src="https://cdn-images-1.medium.com/max/2000/0*HRV8xQeUqqSw8few.png" alt="[awsperu](https://cdn.hashnode.com/res/hashnode/image/upload/v1618031528507/xwGxOSKGN.html)" /><em><a target="_blank" href="https://www.facebook.com/awsperu/">awsperu</a></em></p>
<p><img src="https://cdn-images-1.medium.com/max/2000/0*6dBlapJ-C7WX3H2e.png" alt="[awsperu](https://cdn.hashnode.com/res/hashnode/image/upload/v1618031529792/DT5KDhbi9.html)" /><em><a target="_blank" href="https://www.linkedin.com/company/awsperu/">awsperu</a></em></p>
<p><img src="https://cdn-images-1.medium.com/max/2000/0*azBTl7LQJTyIg4He.png" alt="[AWSPeru](https://cdn.hashnode.com/res/hashnode/image/upload/v1618031531289/cPReCikdr.html)" /><em><a target="_blank" href="https://twitter.com/AWSPeru">AWSPeru</a></em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1618031532837/EtL35R0Mt.png" alt /></p>
<blockquote>
<p>AWS User Group Perú, 931886680</p>
</blockquote>
]]></content:encoded></item></channel></rss>