<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ahirton Lopes</title>
    <description>The latest articles on Forem by Ahirton Lopes (@ahirtonlopes).</description>
    <link>https://forem.com/ahirtonlopes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F401931%2F5b67c640-ea34-40b8-862b-22962aeaa1b7.jpg</url>
      <title>Forem: Ahirton Lopes</title>
      <link>https://forem.com/ahirtonlopes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ahirtonlopes"/>
    <language>en</language>
    <item>
      <title>You've Got Mail📨 (and Recommendations!): Delivering Recs with Keras, JAX &amp; KerasRS</title>
      <dc:creator>Ahirton Lopes</dc:creator>
      <pubDate>Tue, 01 Jul 2025 09:19:58 +0000</pubDate>
      <link>https://forem.com/ahirtonlopes/youve-got-mail-and-recommendations-delivering-recs-with-keras-jax-kerasrs-1j33</link>
      <guid>https://forem.com/ahirtonlopes/youve-got-mail-and-recommendations-delivering-recs-with-keras-jax-kerasrs-1j33</guid>
      <description>&lt;p&gt;Recommendations are everywhere — from your email inbox to the shopping carts you abandon (but never escape 😅). Whether it’s suggesting a movie, a product, or a next best action, recommender systems have become fundamental to today’s digital experience.&lt;/p&gt;

&lt;p&gt;Until recently, building robust recommender pipelines meant stitching together lots of custom layers, custom losses, and custom evaluation metrics by hand. That’s why the introduction of &lt;strong&gt;KerasRS&lt;/strong&gt; is such a game-changer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is KerasRS?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KerasRS&lt;/strong&gt; (Keras Recommenders) is an open-source extension for Keras 3 that delivers building blocks specifically designed for recommender systems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ retrieval layers&lt;/li&gt;
&lt;li&gt;✅ ranking layers&lt;/li&gt;
&lt;li&gt;✅ specialized recommender losses&lt;/li&gt;
&lt;li&gt;✅ ranking metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best of all, &lt;strong&gt;KerasRS is multi-backend&lt;/strong&gt;, working seamlessly with &lt;strong&gt;TensorFlow&lt;/strong&gt;, &lt;strong&gt;PyTorch&lt;/strong&gt;, and &lt;strong&gt;JAX&lt;/strong&gt;. That means you can combine the familiar Keras API with the high-performance JAX compiler and TPU acceleration for your recsys workflows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;☝️ Did you know? The Google Play feed uses KerasRS behind the scenes! (&lt;a href="https://developers.googleblog.com/en/build-train-recommender-system-keras-jax/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why JAX + KerasRS?
&lt;/h2&gt;

&lt;p&gt;If you want &lt;strong&gt;fast&lt;/strong&gt; training, JAX is your secret weapon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JIT compilation for speed&lt;/li&gt;
&lt;li&gt;XLA acceleration&lt;/li&gt;
&lt;li&gt;Automatic vectorization&lt;/li&gt;
&lt;li&gt;TPU support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pairing JAX with KerasRS means you get production-grade recommender building blocks with &lt;strong&gt;superior performance&lt;/strong&gt;. It’s like having your cake and eating it too. 🍰&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing KerasRS
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;keras-rs
&lt;span class="c"&gt;# or, for the nightly:&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; keras-rs-nightly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then set your backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KERAS_BACKEND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jax&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  A Quick Retrieval Example
&lt;/h2&gt;

&lt;p&gt;Let’s build a minimal retrieval recommender in just a few lines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;keras_rs&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;

&lt;span class="c1"&gt;# Dummy user-item pairs
&lt;/span&gt;&lt;span class="n"&gt;user_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;item_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;user_embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;item_embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;retrieval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras_rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BruteForceRetrieval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;query_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;user_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Flatten&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;candidate_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;item_embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Flatten&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;retrieval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index_from_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_tensor_slices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidate_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras_rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RetrievalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;candidate_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;candidate_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retrieval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;retrieval&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optimizers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Adagrad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3e-4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;keras_rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;losses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PairwiseHingeLoss&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;keras_rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NDCG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s a minimal retrieval system — you can expand this with categorical features, embeddings, or even sequence models.&lt;/p&gt;




&lt;h2&gt;
  
  
  Going Further: Transformers &amp;amp; Two-Tower
&lt;/h2&gt;

&lt;p&gt;KerasRS supports more advanced recommender architectures too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep &amp;amp; Cross Networks (DCN)&lt;/li&gt;
&lt;li&gt;Two-Tower models&lt;/li&gt;
&lt;li&gt;Sequence-based recommenders with transformers&lt;/li&gt;
&lt;li&gt;SASRec-style sequence recommenders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to see a transformer-based recommender in action, check out &lt;a href="https://keras.io/examples/structured_data/movielens_recommendations_transformers/" rel="noopener noreferrer"&gt;this Movielens demo&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next for KerasRS?
&lt;/h2&gt;

&lt;p&gt;🚀 KerasRS is on a fast-moving roadmap, with upcoming features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DistributedEmbedding&lt;/code&gt; for large-scale TPU sharded embedding tables&lt;/li&gt;
&lt;li&gt;SparseCore support&lt;/li&gt;
&lt;li&gt;Ultra-scalable retrieval across billions of items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a great time to build recsys pipelines with these tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it Yourself
&lt;/h2&gt;

&lt;p&gt;If you’re excited to build your own recommender with KerasRS, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://keras.io/keras_rs/" rel="noopener noreferrer"&gt;Official KerasRS docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/en/build-train-recommender-system-keras-jax/" rel="noopener noreferrer"&gt;Developer blog announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A starter &lt;a href="https://keras.io/guides/writing_a_custom_training_loop_in_jax/" rel="noopener noreferrer"&gt;Colab notebook&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Keras GitHub repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KerasRS makes scalable, production-grade recommendation models delightfully easy. Give it a try, and share your experiments!&lt;/p&gt;




&lt;p&gt;📨 So next time you see that &lt;em&gt;“You might like…”&lt;/em&gt; email, remember: there’s probably a &lt;strong&gt;KerasRS&lt;/strong&gt; model working hard behind the scenes. 😉&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, feel free to leave a comment or share!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>keras</category>
      <category>jax</category>
    </item>
    <item>
      <title>Dynamic Knowledge Retrieval: Creating Real-Time RAG Solutions with Gemini and Vector Search</title>
      <dc:creator>Ahirton Lopes</dc:creator>
      <pubDate>Sun, 02 Mar 2025 23:53:22 +0000</pubDate>
      <link>https://forem.com/ahirtonlopes/dynamic-knowledge-retrieval-creating-real-time-rag-solutions-with-gemini-and-vector-search-5hf7</link>
      <guid>https://forem.com/ahirtonlopes/dynamic-knowledge-retrieval-creating-real-time-rag-solutions-with-gemini-and-vector-search-5hf7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During my time at TIVIT, I was involved in the early stages of a mergers and acquisitions (M&amp;amp;A) process, where I assessed several companies in the Brazilian data and AI ecosystem. &lt;/p&gt;

&lt;p&gt;One of the biggest challenges in such processes is the need to quickly analyze vast amounts of financial, legal, and technical documents, while also keeping up with real-time market trends and regulatory changes. &lt;/p&gt;

&lt;p&gt;This experience inspired me to explore how RAG (Retrieval-Augmented Generation) combined with Gemini and Vector Search can revolutionize knowledge retrieval for high-stakes decision-making.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge: M&amp;amp;A Knowledge Bottleneck&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;M&amp;amp;A transactions involve multiple stakeholders—financial analysts, legal teams, and industry experts—all working with fragmented knowledge sources. Key pain points include:&lt;/p&gt;

&lt;p&gt;Scattered Information: Documents are spread across data rooms, legal databases, and regulatory reports.&lt;/p&gt;

&lt;p&gt;Time-Sensitive Decisions: Delays in retrieving relevant insights can impact negotiations and risk assessments.&lt;/p&gt;

&lt;p&gt;Contextual Complexity: Extracting meaningful patterns from different formats, such as contracts, financial statements, and news reports, requires advanced AI-driven contextual understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: A RAG-Powered M&amp;amp;A Intelligence Assistant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By integrating Gemini with RAG and Vertex AI’s Vector Search, we can build an M&amp;amp;A Intelligence Assistant that dynamically retrieves and synthesizes knowledge from structured and unstructured data sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest and Index Data:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Upload contracts, financial reports, and regulatory filings into a vector database.&lt;/p&gt;

&lt;p&gt;Convert text into embeddings using Gemini to enable semantic search.&lt;/p&gt;

&lt;p&gt;Integrate real-time news and market data feeds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic Query Processing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users ask high-level questions (e.g., “What are the biggest compliance risks for acquiring this company?”).&lt;/p&gt;

&lt;p&gt;The RAG system retrieves relevant documents using Vector Search.&lt;/p&gt;

&lt;p&gt;Gemini generates an AI-powered response, citing the sources dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actionable Insights for Decision-Makers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Risk assessment: Identify contractual red flags and financial anomalies.&lt;/p&gt;

&lt;p&gt;Regulatory compliance tracking: Monitor global and local regulations in real time.&lt;/p&gt;

&lt;p&gt;Competitor intelligence: Extract market positioning insights from industry reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation: Building the System on Vertex AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting Up Vector Search on Vertex AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;from google.cloud import aiplatform&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Initialize Vertex AI
project_id = "my-gcp-project"
aiplatform.init(project=project_id, location="us-central1")

# Create a Vector Search Index
vector_index = aiplatform.MatchingEngineIndex.create(
    display_name="mna-docs-index",
    contents_delta_uri="gs://my-bucket/embedding-data/"")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Generating Embeddings with Gemini&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from vertexai.language_models import TextEmbeddingModel

gemini = TextEmbeddingModel.from_pretrained("gemini-1")

def generate_embedding(text):
    return gemini.get_embeddings([text])[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Querying Documents with RAG&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def retrieve_knowledge(query):
    query_embedding = generate_embedding(query)
    results = vector_index.find_neighbors(query_embedding, top_k=5)
    return results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Answering with Gemini&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def generate_response(query):
    relevant_docs = retrieve_knowledge(query)
    context = "\n".join([doc["content"] for doc in relevant_docs])

    prompt = f"Based on the following documents, answer the query: {query}\n\n{context}"
    response = gemini.predict(prompt)
    return response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By leveraging Gemini, RAG, and Vector Search, we can transform M&amp;amp;A processes by eliminating knowledge retrieval bottlenecks and providing real-time, AI-powered insights. This approach not only enhances decision-making but also accelerates due diligence, making transactions more efficient and data-driven.&lt;/p&gt;

&lt;p&gt;What other applications of RAG-powered AI do you see in your industry? Let’s discuss! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI-Powered Automation: Fine-tuning Gemma for Function Calling</title>
      <dc:creator>Ahirton Lopes</dc:creator>
      <pubDate>Sun, 02 Mar 2025 23:33:40 +0000</pubDate>
      <link>https://forem.com/ahirtonlopes/ai-powered-automation-fine-tuning-gemma-for-function-calling-af1</link>
      <guid>https://forem.com/ahirtonlopes/ai-powered-automation-fine-tuning-gemma-for-function-calling-af1</guid>
      <description>&lt;p&gt;Starting a new job always comes with a mix of excitement and challenges. As I joined Accenture as a Data &amp;amp; AI Senior Manager, I experienced firsthand the complexity of onboarding processes—countless forms, account setups, and access provisioning across multiple systems. This got me thinking:&lt;/p&gt;

&lt;p&gt;"How can AI-powered automation streamline employee onboarding and make the experience seamless, for both, new hires and HR teams?"&lt;/p&gt;

&lt;p&gt;This project explores how fine-tuning Gemma on Vertex AI can enhance its function-calling capabilities, enabling seamless API integration and workflow automation. By leveraging Gemma's ability to interpret function descriptions, we can dynamically trigger external actions such as fetching data, interacting with databases, and automating enterprise tasks.&lt;/p&gt;

&lt;p&gt;This project fine-tunes Gemma to enhance its function-calling capabilities, enabling seamless API integration and workflow automation. Using Vertex AI, we optimize Gemma to interpret function descriptions and dynamically trigger external actions such as fetching data, interacting with databases, and automating enterprise tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Function Calling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Function calling allows language models to identify and execute functions based on user inputs. This is useful for automating workflows and integrating AI into real-world applications such as chatbots, virtual assistants, and enterprise process automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automating the Employee Onboarding Process with AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A practical use case for function calling is automating the onboarding of new employees. With a fine-tuned Gemma model, we can create an automated workflow that performs essential tasks such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Registering the new employee in the CRM&lt;/li&gt;
&lt;li&gt;Creating accounts and provisioning access&lt;/li&gt;
&lt;li&gt;Sending a welcome email&lt;/li&gt;
&lt;li&gt;Scheduling initial training sessions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Setting Up the Environment on Vertex AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we start, we need to configure our environment on Vertex AI. Make sure you have the Google Cloud SDK installed and authenticated:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install google-cloud-aiplatform&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then, initialize the Vertex AI client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from google.cloud import aiplatform

aiplatform.init(project="my-project", location="us-central1")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Creating a Dataset for Fine-Tuning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To train the model on executing onboarding functions, we create a JSONL dataset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"input": "Register new employee John Doe with email john@email.com and role Software Engineer", "function": "create_employee_record", "arguments": {"name": "John Doe", "email": "john@email.com", "role": "Software Engineer"}}

{"input": "Provision access for Mary Johnson to the ERP system", "function": "provision_access", "arguments": {"employee_name": "Mary Johnson", "system": "ERP"}}

{"input": "Send welcome email to Carla Smith", "function": "send_welcome_email", "arguments": {"recipient": "Carla Smith"}}

{"input": "Schedule security training for Mark Lewis", "function": "schedule_training", "arguments": {"employee": "Mark Lewis", "training": "Security"}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dataset is uploaded to Cloud Storage for training:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bucket_name = "my-bucket"
dataset_path = f"gs://{bucket_name}/dataset.jsonl"

# Upload the dataset
aiplatform.gcs_upload_file("dataset.jsonl", dataset_path)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fine-Tuning Gemma on Vertex AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, we initiate the fine-tuning of the Gemma model using Vertex AI's API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tuning_job = aiplatform.CustomJob(
    display_name="fine-tuning-gemma",
    script_path="train.py",  # Training script
    container_uri="us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-8:latest",
    args=["--dataset", dataset_path]
)

tuning_job.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The train.py script contains the logic for adjusting the model weights, utilizing LoRA (Low-Rank Adaptation) for efficient optimization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing the Fine-Tuned Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After training, we can deploy the model and test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;endpoint = aiplatform.Endpoint.create(
    display_name="gemma-function-calling",
    model_name=tuning_job.model_name
)

response = endpoint.predict(instances=[{"input": "Register new employee John Doe with email john@email.com and role Software Engineer"}])
print(response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model now automatically returns the correct function to be called with the appropriate arguments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fine-tuning Gemma on Vertex AI is an efficient way to enable function calling, allowing intelligent automation of tasks in real applications. In this example, we created an automated workflow for employee onboarding, demonstrating how AI can optimize enterprise processes.&lt;/p&gt;

&lt;p&gt;Want to learn more? Drop your questions in the comments.&lt;/p&gt;

&lt;p&gt;Let's go! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fashion Forward: Leveraging Keras 3.0 for Beginner-Friendly Deep Learning</title>
      <dc:creator>Ahirton Lopes</dc:creator>
      <pubDate>Mon, 30 Sep 2024 22:50:32 +0000</pubDate>
      <link>https://forem.com/ahirtonlopes/exploring-the-new-features-of-keras-30-with-cnns-on-fashion-mnist-1l0j</link>
      <guid>https://forem.com/ahirtonlopes/exploring-the-new-features-of-keras-30-with-cnns-on-fashion-mnist-1l0j</guid>
      <description>&lt;h1&gt;
  
  
  Exploring the New Features of Keras 3.0 with CNNs on Fashion MNIST
&lt;/h1&gt;

&lt;p&gt;In this post, we will explore the new features introduced in Keras 3.0, which was showcased at Google I/O 2024. We will also dive into a practical example of using Convolutional Neural Networks (CNNs) on the Fashion MNIST dataset, illustrating how to implement these updates effectively.&lt;/p&gt;

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

&lt;p&gt;Ref. &lt;a href="https://blog.gopenai.com/tensorflow-vs-pytorch-vs-keras-9161988c19b9" rel="noopener noreferrer"&gt;https://blog.gopenai.com/tensorflow-vs-pytorch-vs-keras-9161988c19b9&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s New in Keras 3.0?
&lt;/h2&gt;

&lt;p&gt;Keras 3.0 brings several improvements and updates that enhance the usability and performance of the library. Here are some of the key features:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros of Keras 3.0 Updates:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with TensorFlow&lt;/strong&gt;: Keras is now fully integrated with TensorFlow, allowing for better performance and streamlined workflows. This makes it easier to access the latest TensorFlow features while using Keras.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved API&lt;/strong&gt;: The updated API provides more clarity and consistency, making it easier for developers to implement models without extensive boilerplate code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Performance&lt;/strong&gt;: Keras 3.0 includes optimizations that improve training speed and resource management, allowing for more efficient model training.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;: New functionalities, such as improved model serialization and advanced preprocessing utilities, make it easier to manage data and models.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cons of Keras 3.0 Updates:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;: For users accustomed to the previous versions, transitioning to Keras 3.0 may require some adjustment, especially with the new API and integrated functionalities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Potential Compatibility Issues&lt;/strong&gt;: Existing codebases may face compatibility issues when migrating to the new version, necessitating code revisions and testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation Updates&lt;/strong&gt;: While the documentation is continuously improving, some users may find that certain sections lag behind in terms of clarity or examples for the new features.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before we dive into the code, let’s take a look at the images from the Fashion MNIST dataset. Below are some samples that illustrate the different categories of clothing we will be classifying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Example: CNN on Fashion MNIST
&lt;/h2&gt;

&lt;p&gt;Let's implement a simple CNN using Keras 3.0 to classify images from the Fashion MNIST dataset. Below is the complete code, including data preprocessing and model creation.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Importing Libraries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tensorflow.keras.datasets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;fashion_mnist&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tensorflow.keras.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Sequential&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tensorflow.keras.layers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Conv2D&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Flatten&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MaxPooling2D&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tensorflow.keras.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;to_categorical&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;randint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Loading and Preprocessing the Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Load the Fashion MNIST dataset
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fashion_mnist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Reshape the data to fit the model's input shape
&lt;/span&gt;&lt;span class="n"&gt;img_rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
&lt;span class="n"&gt;x_train&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;img_rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;x_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;img_rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;input_shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Convert class vectors to binary class matrices (one-hot encoding)
&lt;/span&gt;&lt;span class="n"&gt;y_train&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;to_categorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;to_categorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Visualizing Sample Images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Display a random sample image from the training set
&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])],&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Blues_r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building the CNN Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define the CNN model
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# First convolutional layer
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conv2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kernel_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;input_shape&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# First pooling layer
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MaxPooling2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pool_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="c1"&gt;# Second convolutional layer
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conv2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Second pooling layer
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MaxPooling2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pool_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="c1"&gt;# Flatten the output
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Flatten&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Fully connected layer
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Output layer with 10 neurons for 10 classes
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;softmax&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Compile the model
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;adam&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
              &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;categorical_crossentropy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
              &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Model summary
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Keras 3.0 introduces exciting advancements that enhance the deep learning workflow, making it more efficient and user-friendly. While there may be some challenges during the transition, the benefits of improved performance, better integration, and a clearer API make it worthwhile. By leveraging the new features, we can build powerful models with greater ease.&lt;/p&gt;

&lt;p&gt;Feel free to try the code above, and let me know your thoughts on Keras 3.0!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"For those interested in exploring the code further, you can find the complete example on Google Colab: &lt;a href="https://colab.research.google.com/drive/1jvjeyjgjPN0s8PYzFsv21Jbg6LElvkRi?usp=sharing" rel="noopener noreferrer"&gt;Fashion MNIST CNN Example&lt;/a&gt;. Feel free to run the notebook and experiment with the model!"&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>deeplearning</category>
      <category>keras</category>
    </item>
  </channel>
</rss>
