<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Matt Struble</title>
    <link>https://struble.dev/</link>
    <description>Recent content on Matt Struble</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 16 Oct 2025 11:03:27 -0400</lastBuildDate>
    <atom:link href="https://struble.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>About</title>
      <link>https://struble.dev/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/about/</guid>
      <description>&lt;p&gt;My name is Matt Struble, and I am a  Machine Learning and Computer Vision engineer.&lt;/p&gt;&#xA;&lt;p&gt;Software first impacted my life at a very young age with video games. I knew from then that I wanted to create that same wonder and inspiration I experienced growing up. Being able to impact reality always seemed like a distant dream, until my first programming class in High School. There, I realized that I could make my dream into a reality, and that I wanted nothing more than to continually focus my skills towards creating a lasting impact on the world.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Boost Your Workflow, Not Replace It: How AI Can Enhance Developer Productivity</title>
      <link>https://struble.dev/blog/ai-boost-workflow/</link>
      <pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/ai-boost-workflow/</guid>
      <description>&lt;p&gt;When engineers talk about productivity, we often focus on tools.&#xA;But the real measure of productivity is flow. That uninterrupted rhythm where focus turns into progress.&lt;/p&gt;&#xA;&lt;p&gt;As a Principal Engineer, I’ve spent years refining how I work. My editor is tuned exactly the way I like it, my linting rules are strict but purposeful, and my terminal feels more like home than any commercial IDE. When I’m in that environment, I move faster, think clearer, and build better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SageRender</title>
      <link>https://struble.dev/projects/sagerender/</link>
      <pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/projects/sagerender/</guid>
      <description>&lt;p&gt;SageRender is an open-source tool developed at Nike to manage SageMaker pipelines via hierarchical YAML configurations. It enables shared configuration definitions, overrides, and extensibility across multiple pipelines, reducing duplication and improving consistency. This capability was critical in migrating teams from legacy platforms to SageMaker, particularly when managing hundreds of pipelines with similar but slightly different configurations.&lt;/p&gt;&#xA;&lt;p&gt;The tool was designed collaboratively across teams to accelerate migration efforts and provide a &lt;strong&gt;robust, production-ready, open-source solution&lt;/strong&gt; that could scale efficiently.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interview - Overcoming Imposter Syndrome</title>
      <link>https://struble.dev/blog/deeplearning-ai/</link>
      <pubDate>Fri, 24 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/deeplearning-ai/</guid>
      <description></description>
    </item>
    <item>
      <title>Deep Learning Photo Aesthetics - Data Pipeline Optimization</title>
      <link>https://struble.dev/blog/dlpa-data-optimization/</link>
      <pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/dlpa-data-optimization/</guid>
      <description>&lt;p&gt;In my &lt;a&#xA;  href=&#34;https://struble.dev/blog/dlpa-data-preprocessing&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;last post&lt;/a&gt; I talked briefly about my data preparation pipeline and how I encoded the 200k images into TFRecords. As part of this step I first serialized an image into a tensor prior to storing it as a TFRecord. This method of first serializing the image as a tensor is a fairly common step in other tutorials that talk about TFRecord image preparation&#xA;[&lt;a&#xA;  href=&#34;https://towardsdatascience.com/working-with-tfrecords-and-tf-train-example-36d111b3ff4d&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;1&lt;/a&gt;, &lt;a&#xA;  href=&#34;https://medium.com/swlh/using-tfrecords-to-train-a-cnn-on-mnist-aec141d65e3d&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;2&lt;/a&gt;, &lt;a&#xA;  href=&#34;https://medium.com/ai-in-plain-english/a-quick-and-simple-guide-to-tfrecord-c421337a6562&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;3&lt;/a&gt;, &lt;a&#xA;  href=&#34;https://www.kaggle.com/ryanholbrook/tfrecords-basics&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;4&lt;/a&gt;].&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deep Learning Photo Aesthetics - Data Preprocessing</title>
      <link>https://struble.dev/blog/dlpa-data-preprocessing/</link>
      <pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/dlpa-data-preprocessing/</guid>
      <description>&lt;p&gt;During data analysis I found various potential pitfalls in the AVA database that could introduce unwanted biases into the final model. Here is a brief overview as a quick recap:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There exist photos with political, advertisement, pop culture, or emotional bias.&lt;/li&gt;&#xA;&lt;li&gt;The weighted average scores per photo are strongly centralized around 5/10.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;These pitfalls independently can heavily influence my final model; from making it prefer a certain political ideology, to generalizing all its predictions to 5/10. Both of which will impact the final performance and prevent what I really want the model to do: tell me with utmost certainty which photo is the best.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deep Learning Photo Aesthetics - Introduction and Data Analysis</title>
      <link>https://struble.dev/blog/dlpa-intro-data-analysis/</link>
      <pubDate>Mon, 26 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/dlpa-intro-data-analysis/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;a href=&#34;#introduction&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Whenever I’m with my girlfriend, travel, or just outside I tend to take a lot of photos. The problem is that a lot of the photos are of the same object just taken from different angles, different lighting, or with completely different framing. This creates the issue of later needing to go back and filter through 20 photos of the same rock in order to trim it down to just one photo that best represents the rock in the moment. The process is tedious, and I know next to nothing about what makes a good photo, thus creating a loop of trying to differentiate between nearly identical photos until I give up and push it off until the next day, then the next day, then the next day, leaving me with hundreds of leftover vacation photos.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Strengthening Deep Learning Concepts</title>
      <link>https://struble.dev/blog/strengthening-dl-concepts/</link>
      <pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/strengthening-dl-concepts/</guid>
      <description>&lt;p&gt;A couple weeks ago, I posted about how the &lt;a&#xA;  href=&#34;https://struble.dev/blog/overcoming-self-doubt&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;TensorFlow Certification&lt;/a&gt; helped me overcome my imposter syndrome within the deep learning community. The studying, and as a result my certification, was primarily focused on the high-level implementation of various model architectures within the TensorFlow framework. Which meant that even though I was certified, I felt that there was still a lot to learn in regards to deep learning.&lt;/p&gt;&#xA;&lt;p&gt;I wanted to know what was truly happening under the hood in deep learning, to understand the low-level algorithms that make up each individual part of a whole model. I wanted to be able to make intelligent choices when doing my own research and development, and knew that learning the mathematics of deep learning would be the only way to give me that confidence.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overcoming Self-Doubt in Pursuit of TensorFlow Certification</title>
      <link>https://struble.dev/blog/overcoming-self-doubt/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/overcoming-self-doubt/</guid>
      <description>&lt;h2 id=&#34;the-plan&#34;&gt;The Plan&lt;a href=&#34;#the-plan&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Near the end of June I decided to finally take the plunge and start seriously working towards pivoting my career towards ML and deep learning. Even though I have worked with, and deployed, production ML models in the &lt;a&#xA;  href=&#34;https://struble.dev/projects/heineken-ar&#34;&#xA;  &#xA;  &#xA;&gt;past,&lt;/a&gt; and have supported ML researchers and analysts in my job for years, I didn’t consider myself an ML practitioner. While I understood different approaches for supervised and unsupervised learning, and how I could use them to perform rudimentary classifications, I was not confident about developing large productionized models with targeted end users. I truly wanted to go back to the roots, learn deep learning from a practical perspective in order to understand industry expectations, with the goal of filling in gaps leftover from the more theoretical approach of my masters degree. Voila! Enter the TensorFlow Developer Certificate Exam.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating Deep Learning Pipeline With NAS</title>
      <link>https://struble.dev/blog/automating-dl-pipeline/</link>
      <pubDate>Sun, 24 May 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/automating-dl-pipeline/</guid>
      <description>&lt;p&gt;The past few days I&amp;rsquo;ve been working on improving my machine learning pipeline in preparation of some upcoming projects. I wanted to create a system that would allow me to easily train a model&#xA;from any thin client, while also preserving a history of work done on a per-project basis.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-goal&#34;&gt;The Goal&lt;a href=&#34;#the-goal&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I had three main goals in mind for my automated pipeline:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;I wanted to be able to dynamically configure settings on a per-run basis, settings like:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Which server to execute the training on&lt;/li&gt;&#xA;&lt;li&gt;How long to let the training session run for&lt;/li&gt;&#xA;&lt;li&gt;How frequently to back up the checkpoint directory&lt;/li&gt;&#xA;&lt;li&gt;What tensorflow version and conda environment to use.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Next, I wanted to be able to start training from any device.&lt;/li&gt;&#xA;&lt;li&gt;Lastly, I wanted to backup everything that went into each run.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This way I would be able to reproduce the exact same results.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;a href=&#34;#the-solution&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Enter Synology NAS. The pure functionality of a NAS is to provide redundant high-capacity storage on a Linux OS, which conveniently allows the execution of custom bash scripts.&#xA;This allowed me to write a series of scripts, each of which satisfied one of the goals above.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Utilizing Document Fingerprinting for Variable String Matching</title>
      <link>https://struble.dev/blog/utilizing-document-fingerprinting/</link>
      <pubDate>Thu, 16 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/blog/utilizing-document-fingerprinting/</guid>
      <description>&lt;p&gt;A question was posted in a group chat: how many times does my one friend say the phrase “gamers in chat”? At the time I was beginning to dabble with the Discord API, so I took it upon myself to figure out the actual count. The algorithm can be seen in action within my &lt;a&#xA;  href=&#34;https://github.com/mattstruble/gamer-bot&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;Discord GamerBot&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;a href=&#34;#the-problem&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;User submitted text, especially in a group chat, is variable, prone to spelling mistakes, and all-around unreliable data. A simple string compare will only catch an exact match, missing any of the following potential variations: “gamer in the chat”, “gamers int he chat” , “gamers in this chat?”, “gamers get in chat”.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Analyzing Climate Change Stance Through Twitter Data</title>
      <link>https://struble.dev/projects/analyzing-climate-change/</link>
      <pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/projects/analyzing-climate-change/</guid>
      <description>&lt;p&gt;With 22% of US adults indicating they use Twitter, the platform has become a key stage where the climate change conversation unfolds. As such, this project hoped to understand—and visualize—Americans’ views of climate change as seen through the lens of Twitter.&lt;/p&gt;&#xA;&lt;h3 id=&#34;method&#34;&gt;Method&lt;a href=&#34;#method&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The approach was two-pronged:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Develop a multi-layered predictive model trained with labeled data.&lt;/li&gt;&#xA;&lt;li&gt;Create interactive visualizations housed on a dedicated webpage that facilitates comprehension and boosts engagement.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;An important distinguishing characteristic of this project is that it aimed to look past the accuracy of an analytical product and relate the sentiment data to demographic characteristics. It also casts a wider net when collecting raw data, incorporating both critical keywords (i.e., “climate change” and “global warming”) and popular hashtags (e.g., #parisagreement, “#climatehoax”) that represent both sides of the conversation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Heineken® AR Cheers Campaign</title>
      <link>https://struble.dev/projects/heineken-ar/</link>
      <pubDate>Tue, 13 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/projects/heineken-ar/</guid>
      <description>&lt;p&gt;A web app that blended augmented reality and artificial intelligence to create an interactive user experience for the &lt;a&#xA;  href=&#34;https://www.heineken.com/formula-1&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;Heineken® Formula 1&lt;/a&gt; campaign.&#xA;The campaign was the first time a brand has used web-based AR technology to power a live competition globally.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;project-goal&#34;&gt;Project Goal&lt;a href=&#34;#project-goal&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In June I was contracted to develop the image recognition component of the &lt;a&#xA;  href=&#34;https://www.justaftermidnight247.com/case-study/heineken-ar-cheers-campaign/&#34;&#xA;  &#xA;  &#xA;    class=&#34;link--external&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&#xA;  &#xA;&gt;Heineken® AR Cheers Campaign&lt;/a&gt;.&#xA;I was given six weeks to create the Heineken® logo detection logic, which needed to fit the following criteria:&lt;/p&gt;</description>
    </item>
    <item>
      <title>CV</title>
      <link>https://struble.dev/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://struble.dev/resume/</guid>
      <description>&lt;p&gt;&lt;a&#xA;  href=&#34;../resume/struble_resume.pdf&#34;&#xA;  &#xA;  &#xA;&gt;Download full resume in pdf format&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;experience&#34;&gt;Experience&lt;a href=&#34;#experience&#34; class=&#34;post-heading__anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;  &lt;div class=&#34;jr__list jr-work__list&#34;&gt;&#xA;    &#xA;      &lt;div class=&#34;jr__item jr-work__item&#34;&gt;&#xA;        &lt;div class=&#34;jr__item-meta&#34;&gt;&#xA;          &lt;div class=&#34;jr-work__position&#34;&gt;Principal Software Engineer – AI/ML &amp;amp; GenAI&lt;/div&gt;&#xA;          &lt;div class=&#34;jr__date-range&#34;&gt;&#xA;  &lt;span&gt;2025-04&lt;/span&gt;&#xA;  &lt;span&gt;-&lt;/span&gt;&#xA;  &lt;span&gt;present&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;          &#xA;            &lt;div class=&#34;jr-work__name&#34;&gt;&#xA;              &#xA;                &#xA;                  &lt;a href=&#34;https://nike.com&#34;&gt;&#xA;                    Nike&#xA;                  &lt;/a&gt;&#xA;                &#xA;              &#xA;              &#xA;            &lt;/div&gt;&#xA;          &#xA;&#xA;          &#xA;            &lt;div class=&#34;jr-work__location&#34;&gt;Boston, MA&lt;/div&gt;&#xA;          &#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div class=&#34;jr__item-content&#34;&gt;&#xA;          &#xA;            &lt;p class=&#34;jr-work__summary&#34;&gt;Leading development of Nike’s AI/ML and GenAI platforms with a focus on scalable training, inference, and monitoring infrastructure.&lt;/p&gt;&#xA;          &#xA;          &#xA;            &lt;ul class=&#34;jr-work__highlights&#34;&gt;&#xA;              &#xA;                &lt;li&gt;Built unified debugging and observability tools that reduced model pipeline failures by 70%.&lt;/li&gt;&#xA;              &#xA;                &lt;li&gt;Led fine-tuning and serving of large vision-language models including SAM2, GroundingDino, and CLIP.&lt;/li&gt;&#xA;              &#xA;                &lt;li&gt;Created Terraform-based templates that cut GenAI deployment time by 50%.&lt;/li&gt;&#xA;              &#xA;                &lt;li&gt;Authored best-practice playbooks adopted across the Nike AI Community of Practice.&lt;/li&gt;&#xA;              &#xA;            &lt;/ul&gt;&#xA;          &#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;    &#xA;      &lt;div class=&#34;jr__item jr-work__item&#34;&gt;&#xA;        &lt;div class=&#34;jr__item-meta&#34;&gt;&#xA;          &lt;div class=&#34;jr-work__position&#34;&gt;Lead Machine Learning Engineer – Analytics &amp;amp; GenAI&lt;/div&gt;&#xA;          &lt;div class=&#34;jr__date-range&#34;&gt;&#xA;  &lt;span&gt;2021-02&lt;/span&gt;&#xA;  &lt;span&gt;-&lt;/span&gt;&#xA;  &lt;span&gt;2025-04&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;          &#xA;            &lt;div class=&#34;jr-work__name&#34;&gt;&#xA;              &#xA;                &#xA;                  &lt;a href=&#34;https://nike.com&#34;&gt;&#xA;                    Nike&#xA;                  &lt;/a&gt;&#xA;                &#xA;              &#xA;              &#xA;            &lt;/div&gt;&#xA;          &#xA;&#xA;          &#xA;            &lt;div class=&#34;jr-work__location&#34;&gt;Boston, MA&lt;/div&gt;&#xA;          &#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div class=&#34;jr__item-content&#34;&gt;&#xA;          &#xA;            &lt;p class=&#34;jr-work__summary&#34;&gt;Drove engineering excellence and production reliability for Nike’s AI ecosystem.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
