One way to create animations of Keras models learning

Say you want to create an animation that shows how a neural network learns from data. Maybe something like this, where a neural network learns the shape of a sine function:

Here’s how I did that. First, get the code for the neural network, so you can follow along: ml-sine on GitHub

When training your model you’ll usually use a statement like this:

model.fit(x_train, y_train, batch_size=128, epochs=100)

After every epoch we want to take a snapshot of how well our prediction fits the training data. Let’s iterate the epochs manually instead of using the epochs=100 argument:

epochs = 100
for epoch in np.arange(1, epochs):
      self.model.fit(x_train, y_train, batch_size=128)

This allows us to run additional code in between the training epochs. We want to save a plot of our prediction and the ‘ground-truth’ y_train. Using matplotlib:

import matplotlib.pyplot as plt

plt.plot(x_train, y_train, 'g.', ms=1)
plt.plot(x_train, self.model.predict(x_train), 'r.', ms=1)
plt.axis([
   x_train.min() - 0.5, x_train.max() + 0.5,
   y_train.min() - 0.5, y_train.max() + 0.5,
])
plt.title(f"Epoch #{epoch}")
plt.savefig(f"img/plot_{epoch}.png")
plt.clf()

We’re using plt.savefig() to store an image of the plot on disk. We will end up with 100 images that we can turn into a slideshow video using ffmpeg. Assuming the images are stored in a subfolder named img:

ffmpeg -n -framerate 4  -i "img/plot_%d.png"  -vf "fps=25,format=yuv420p" movie.mp4

The option -framerate 4 makes each image appear for a quarter of a second.

Have fun

Impressum

Impressum

Angaben gemäß § 5 TMG

Philipp Antar Rhinower Str. 7 10437 Berlin Vertreten durch: Philipp Antar Kontakt: Telefon: 0178-1457886 E-Mail: [email protected]

Haftungsausschluss:

Haftung für Inhalte

Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.

Haftung für Links

Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.

Urheberrecht

Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.

Datenschutz

Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben. Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.

Impressum vom Impressum Generator der Kanzlei Hasselbach, Bonn

my pgp key

Send me encrypted messages for big bonus points!

https://keybase.io/p886

Fingerprint: AB19 9923 F1B6 F633 4756 B21A 2DBF 53C2 E30E D27C

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQINBFRwTxwBEAC1Cx9Ka/LuC9YmWZ3bC90OzxRoerR/qk8j4ahvKhSdHUh/UGrH
U5QogadiXTGK77jMA2rpKZ1WP26xJhv3V7f6z31Qg2hq4mUDe7G8s1/xTYxYSaSl
S8Hpcs6/yDcxJMXp53nZLbrEoA2WfZp8VNhRJuzF8fL21B3pjzt7U9+gw90aVGHA
UFUEhWVsbUz8BuWyfS8p0qECChJKMzLk/uKpvtsGxmTEqsWgmka1pMDXc5YIYpq8
3Lf6zd66slOlOvcU72n/AK5VgHRT2koRHddwldN7o9DjBCHeRFMWDKAdXatZ0jik
rJ7bQwPUN0ONTlDg1SxEiFpkG8j6+d1d8JLOH8+/KW9P1z0qLMy3XyxOSw0CAmRK
X+69/wFoqd0MgA9ErDnJ5GayT/qUXodA+XlGEY//zU/hoI/Eu1AowR0PegGDuNiK
umGIMDEMl1dO6zIF2QwiMsVqhtmTevlzSZWgoejn/CuPjwgbGcUCO46wevGk/szb
KO7rxvA0pjXPN29o8HLBh2TQi9XfjWrwXl7ufEKt+N4z84/lgbVfoThwJz3dzTOF
c+tu3mEScvimyRHRPQ4s9jC8OqQdAniU5Vft+kIpHH51ts7JEUseju7dxsfSUYCc
8Y6CiqMb5A2K4Q2yA3vsYWEYHrAQ6Lx7zB3/kpfM32AKEZ3df6gaIJYnIQARAQAB
tCZQaGlsaXBwIEFudGFyIDxwaGlsaXBwYW50YXJAZ21haWwuY29tPokCPQQTAQoA
JwUCVHBPHAIbAwUJAeEzgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRAtv1PC
4w7SfMqID/sETi8HvzmY9luO1QZO5w0J/ggbyggp8rlD8396kbQ8f7rjJjRLoG1u
q9WY+yYIbNNBZUJ9GRSRkBM0cJyk0sRgabc2btN7GFQFi3jWJp4blyb3u70El3fs
woupfnsyUTZ+11I2ouahu6LjjnLsbv/xPXx3q9LRNiZgIPK6HnYlVT6DRgIr5M5f
NlFYUKC2U/hC9ZH6CpO9Scjd+k1fczG0GRttcj72Gy5L9UjNOECXFvIp3PN7KWAg
MrXn7m28+4vfzNE9UemFEFsFUuuc8M3U9SfQwlV1IqN0FKvZAlSkKMIdN3cfOrJy
Y+HdN3ktyXBXM2y3eSzpr5xMUW8sSEttTUX1+uLVeQP+IiZwv9GszvpZhXR8t54n
h7i2sONb8haPkDQn8ZmKssfPEljjJMBWq/FEfpa45XE1fFoOo4AT5Uk3qR1+b6LX
UdYAxCMc45jJMW2S7W3jbMtDeYaMrH6T6ds+Y+VtJDPcxdMKm4R0pTr9a9zpTeU7
S5iK1Rw2O2cXBCCvIYzrlPdjKTKPiuVq/8zwkWmJis+x2qAqCpzNPGtGQVaaCp8N
sPEnGraWd6fkjg0NaArh5sBi4tBKAF86nEiWMOLIDWO5dcCTashvB+GQGcg7VQkf
hfCaK0Gw4+gYP3o1AIGBGXIIOW6veuXRwxKsHJ5hDpO1C1M5zROFbYkCPQQTAQoA
JwIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVjo+5gUJBYxWwQAKCRAtv1PC
4w7SfBDtEACmHEfwJHMhya7nazUaiLv1oaqJFm3Z2cO2z8plvo8c3KXskzXwOGLP
6z/IQNGSL18LUzzY32+8JYsiau2pPraP3lxznZ2aY2/PS5ivXVyUoJdyEyWH+Y9S
VReFy9kMqWdJULD3v7/EaHq063p546LYSKGqf5+667ke51UhbaVc3HELSFhNgkq6
4aagkP3CLBSF/4+QSC5djUA3LaMkxex9xA1zrMHxYXk7sJxXrDFbW+VSExucwUjM
t/4XDIn+uXTmdfN0D2lZaO2gEMyPAMpGa/8bzYtfaZKPSTe44xB2w8OKl6VKBIRP
sc8mb6B5BFHiTBAtowl8QMqAlblhFSuUJ9tkzaCqQl75LHvpRZJ+sJXsPUSxgqNZ
IFA/oz64LwOqRr6zDD6XgBAWIhQoGDI5NSV9bgAd7TQ+8uk/kYqQ8MNue3xmR+RC
teUq/5MqAO1BgX2ypm9+xiOQa5A42cg1WA9wzRiUM3Rc/b874hMsU6DE3nwPwgXe
d0dbG6t75xaoJg7KsD07nqR6pbmrBC6fy/ZsTsJCVLK4R15y3adSsw1+0A/VAC0n
eh50QKBV9NVJBx4M8JyCLJGxk0c/TIWIhDDbBOqW1mt8ONKksNmQMGjXXXAwwUyL
UA/xWc151arZws3acz13ZOExnyuyLNyH+q/6hMzR+7Nua9ITbnhSmrkCDQRUcE8c
ARAAtdGGMQdQuUn7qsFaywkGrEBdy5RPAqyl/MKpmVK0UaXWadMEEFyDXM/xSFor
OPfagtiTB4+hbrHlzq8m4xQCNKyMaHV7G0wBXBMBJZJIidlQj2DWNCkLAFBbUQGL
93kOf9yltyF+6frTfQTnjt18wsy0vde6fumaOElBq6kXlF6QAv6/DVOCEjnC+wjp
dViUwgD8W/TH3BdWwC1l8yVi6lXYsSrOGOMrTqkH/dg/A+Aa8/mi3HfnyngJl5f9
OzWH4HWE4PdJfMacVD8beksQlbfuWOMWFSPThIED/eLtQlPhM57tfez++vvbq7b+
dDQKQm1ePWEtju5SFQ9EHJc6lLRxSZKftEwB+Xmxo7uDXRk6cK98ic5xIryI9JX3
K5SnNrTkmHBas93ITKCuqs38eBsNW8EBvcmW/V3arEDVxkvMKMhzX88RSSHVnsBt
G66XU9QEX+FQ62x7whbwxNeV12iqanGdSC+UqZIWa/B79zxZ4s9ES7G3QIsWcgJY
5e4p7pp6jrQo42YAyTKcJEFRkpHYBxCGzmc71XymACLOw9XsqfMMZK13MHEjnR0H
/OZM8BIn6w5KTg4aYAcIe5J0wtpCgCjYgp73foY835u0YTtk97T7ycy7nKSl+9XT
HFxM2X5jNNy0TWhWwsdSjCLs8fFRSlFp4hZ8WzaZOy6IudcAEQEAAYkCJQQYAQoA
DwUCVHBPHAIbDAUJAeEzgAAKCRAtv1PC4w7SfCo5D/oC2lnopK/cyQ8tZ5WVH6ue
7IA2zUAyeds4JnISPktJNUH8UVIL0S+lR1tNy7TEiKG6NZ3ZvTyUN6pcwWywgvHv
LTQNilZWeiBXLfL03vGb274zPIwv99/wMwJNJhf9z/0DmrLO0b/s/6ksbHjY1ITA
PNxAK7KFpFTRKZw3dCi8TTvbk3VyWgj030OjBfUyKHbCCa4tM2iWJRuYi3W1r9+s
8fjYaqP7dP7/dxbITbOx3R/aHvfSsg0YNUcloAtyMUd5ZU4RR8t7vtPXHyeCePC3
NUW2arbjqGvfY5NGHeTXA22SOemr87uMOj+tvfj6ExpqhRLo+uYYFux0UwMRRrm+
j4r12lv/9PKGZ2N2zE7TCnHTZW+2tyty70+nQ+pvh5J+Cy3arfPxF5/8cp0X/HOz
B8KiMQHQamE0jyc7AMXVGMoZ8okapx/g/boHFZtYkVIlPwyfeMpc9e7HX1jlxh9f
+zScpI/4+fBcNzNZm60Xu25Bqwep2hz/LeyYtB0yRtY7CYOGIe/Dr86ldDaSmhI0
/BGMki9xGGAJUXYhEo7P/B2VWMRCzmBKJzwvbYG+IXM5yEPbtiqxfsAHPbdwsLDb
VFIS1OIkk0iCKAcHWFdeKt8z2T4ihtC8qBWcaA3lD3oxS5yKLyQiISNc5Y9oov/u
U7KNQBjcBVTV22IBFiG6XYkCJQQYAQoADwIbDAUCVjo/IQUJBYxXAQAKCRAtv1PC
4w7SfE9wEACa6aFJisDQQvm6toxL8y5TOZO9/ohIGsP3Mo7SUnSESfvUOJcLepN1
NOPqjWRcB5xixHYCgNq8wkP2kmNRCujfZPeIueAzhFKQEVK4RVgz4SSGIOlnYTfr
FUE/XaBEmhisVE8NZspGwEJABlOm1zkloz/dNzpegpxHyL5aTpEpCZrNJnd+LwG4
WXH60iYc92ofrO6uXs3eIsnAAoaQpVhdxO11xX141Eg4hF8w2HD30Yiz75s6Q5et
XA9O2HEN0VAaN5kklPUjnoZdUHGKUWYoBXwb/q8arBCLYz7DN/JlcRC50YqGKf8O
a/zLWbJmgcyGUPda359JTTc0g0mi9lVqXBDsWYxo1abcey1QVelAzW6QwxCSx17N
XMak6VlZLLbgYPGdTRrHpc/wYI4AmXdbSKsCEsY+ViRzhLWLwlNbU108/SgprVMu
9vHlVjxd+pBuBPxmiaG8Iyy7G251CMgmWZ7gUz2zUnBbkwCSB3cwhHuKmFglr7vX
bEcNjWdspAWTaaOzWSqSLJxdbgc2R2jnupZB7XqOu9oYLnkL50F8tBKJVC4L+/Q4
PNfP2hz2IG2jRACVbkIMSLbIFiAC7WE1gD3qO/oxL5C37iS8Vv8mvnx6ZAY6VvCr
gCf7If3KEtjQDopTKkoj2bcmhzjhVRyE7jJXSbAJ89SGABWTpYq/IQ==
=aq+I
-----END PGP PUBLIC KEY BLOCK-----

curriculum vitae

Philipp Antar

Personal Information

  • born: 1986-08-07
  • location: Berlin, Germany

Contact me

Education

  • 2007 - 2010 BSc Studies, Agricultural Science, University of Bonn
  • 2010 - 2012 MSc Studies, Agricultural Science, University of Bonn
  • 2013-02 – 2013-08 Career change into web development with online courses at https://teamtreehouse.com/ and https://codecademy.com/

Career

  • 2013-01 – 2013-08 PhD student, Institute for Soil Science, University of Bonn
  • 2013-08 – 2016-05 Web Developer, Distribusion Technologies GmbH (formerly: FahrtenFuchs GmbH)
  • 2016-06 – 2016-07 Web Developer, SayWay GmbH
  • since 2016-09 Developer, Cash Payment Solutions GmbH

Certificates

Expertise

Programming Languages & Frameworks

  • Ruby (+++)
  • Go(+++) [golang]
  • JavaScript(++)
  • Python, numpy, keras

Databases & Caches

  • PostgreSQL(++)
  • Redis

DevOps

  • Linux, Ubuntu Server(+), macOS
  • Ansible(+)
  • docker

Development Tools

  • Sublime Text(+++)
  • git(+++)
  • GitLab, GitHub
  • vagrant
  • Virtual Box
  • zsh(++)

Miscellaneous

  • HTML5, CSS3, Capistrano, nodeJS, Kanban

Natural Languages

  • German (native)
  • English (fluent)
  • French (beginner)

How I deploy to GitHub Pages

How does Github pages work? (skip if you know this)

Many static pages generators will generate a single public as output. This folders contains the entire generated site. On GitHub you can create a repository with the special name <your GitHub username>.github.io, in my case p886.github.io. Doing so will create a webpage at the address http://github_user_name.github.io.

The problem with static page generators and GitHub pages

The tricky part is that the master branch of that repository should contain the site (the content of the aforementioned public folder), while on the other hand you probably want to keep the source files of that page (in my case of collection of markdown files) in the same repository.

The solution

My p886.github.io repository has two branches: master and source. master contains the generated HTML, which is copied over on each deployment from the source branches’ public folder. How do I go about copying the HTML files from one branch to another? I found that the easiest solution is to have the project cloned locally two times. One clone contains only the master branch, another one only the source branch. When creating a post I add the markdown file in the source clone. After commiting the new post I run the static page generator to create the public directory. Subsequently I copy the contents of the public directory to the master clone. A new commit in the master checkout is created which contains the site. This commit is then pushed to the remote repository to have the new content online.

In reality I automated most of this. After I created the commit containing the new post in the source checkout I run this bash script:

Summary

The key is two have two branches in the repository: master and source. Locally the repository is cloned twice: once with the master and again with the source branch.

Mental Models

A list of higher mental models that I use in my thinking. Will be expanded as I learn and grow.

Last update: 2016-10-23

What I'm currently doing

  • Working as a web developer
  • Playing Guitar
  • Playing Piano
  • Singing
  • Improving my body (weightlifting)
  • Improving my personality