{"id":25483,"date":"2018-08-23T12:15:43","date_gmt":"2018-08-23T17:15:43","guid":{"rendered":"http:\/\/www.dannyadam.com\/blog\/?p=25483"},"modified":"2018-09-13T15:19:47","modified_gmt":"2018-09-13T20:19:47","slug":"random-bezier-walk-in-a-random-neural-network","status":"publish","type":"post","link":"https:\/\/www.dannyadam.com\/blog\/2018\/08\/random-bezier-walk-in-a-random-neural-network\/","title":{"rendered":"Random B\u00e9zier Walk in a Random Neural Network"},"content":{"rendered":"<p><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"580\" height=\"327\" src=\"https:\/\/www.youtube.com\/embed\/SeQ2lm8UzxQ?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span><\/p>\n<p>The video above was generated using\u00a0<a href=\"https:\/\/github.com\/dstein64\/neuralart\">neuralart<\/a>.<\/p>\n<p><!--more-->The neural network takes position coordinates, distance to origin, and a vector <strong>z<\/strong>\u00a0as inputs, and outputs a corresponding pixel intensity. The weights are randomly initialized. This configuration is described in more detail in the following blog posts and pages from\u00a0<a href=\"http:\/\/otoro.net\/\" rel=\"nofollow\">studio otoro<\/a>.<\/p>\n<ul>\n<li><a href=\"http:\/\/blog.otoro.net\/2015\/06\/19\/neural-network-generative-art\/\" rel=\"nofollow\">Neural Network Generative Art in Javascript<\/a><\/li>\n<li><a href=\"http:\/\/blog.otoro.net\/2016\/03\/25\/generating-abstract-patterns-with-tensorflow\/\" rel=\"nofollow\">Generating Abstract Patterns with TensorFlow<\/a><\/li>\n<li><a href=\"http:\/\/blog.otoro.net\/2015\/07\/31\/neurogram\/\" rel=\"nofollow\">Neurogram<\/a><\/li>\n<li><a href=\"http:\/\/otoro.net\/ml\/netart\/\" rel=\"nofollow\">Interactive Neural Network Art<\/a><\/li>\n<\/ul>\n<p>The video frames are generated by transitioning the <strong>z<\/strong> input. In an earlier experiment, I tried varying <strong>z<\/strong> by transitioning along a straight line. The corresponding video is included in an <a href=\"https:\/\/www.dannyadam.com\/blog\/2018\/08\/neural-art\/\">earlier post<\/a>. I also tried using a random walk, but found that there was too much back-and-forth motion this way.<\/p>\n<p>The video above transitions <strong>z<\/strong> by walking along randomly generated cubic <a href=\"https:\/\/en.wikipedia.org\/wiki\/B%C3%A9zier_curve\">B\u00e9zier curves<\/a>. The curves are connected, and the first handle of each curve has the same slope as the last handle of the preceding curve, in order to achieve smooth transitions across curves. Binary search is used so that the distance of each step along the curve is approximately fixed.<\/p>\n<p>Here&#8217;s the source code.<\/p>\n<style>.gist table { margin-bottom: 0; }<\/style>\n<div style=\"tab-size: 8\" id=\"gist91508732\" class=\"gist\">\n<div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n<div class=\"gist-data\">\n<div class=\"js-gist-file-update-container js-task-list-container\">\n<div id=\"file-bezier_neural_walk-py\" class=\"file my-2\">\n<div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-python  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"bezier_neural_walk.py content, created by dstein64 on 05:13PM on August 23, 2018.\"\n    ><\/p>\n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n<p>  <template class=\"js-file-alert-template\"><\/p>\n<div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n    <span><br \/>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.<br \/>\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a><br \/>\n    <\/span><\/p>\n<div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters<br \/>\n<\/a>\n<\/div>\n<\/div>\n<p><\/template><br \/>\n<template class=\"js-line-alert-template\"><br \/>\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\"><br \/>\n    <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n<\/span><\/template><\/p>\n<table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"bezier_neural_walk.py\">\n<tr>\n<td id=\"file-bezier_neural_walk-py-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC1\" class=\"blob-code blob-code-inner js-file-line\">#!\/usr\/bin\/env python<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC2\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC3\" class=\"blob-code blob-code-inner js-file-line\">from __future__ import print_function<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC4\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"># Images can be converted to video with ffmpeg.<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC6\" class=\"blob-code blob-code-inner js-file-line\">#   &gt; ffmpeg -pattern_type glob \\<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC7\" class=\"blob-code blob-code-inner js-file-line\">#            -i &quot;*.png&quot; \\<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC8\" class=\"blob-code blob-code-inner js-file-line\">#            -vcodec libx264 \\<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC9\" class=\"blob-code blob-code-inner js-file-line\">#            output.avi<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC10\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC11\" class=\"blob-code blob-code-inner js-file-line\">import os<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC12\" class=\"blob-code blob-code-inner js-file-line\">import sys<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC13\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC14\" class=\"blob-code blob-code-inner js-file-line\">from PIL import Image<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC15\" class=\"blob-code blob-code-inner js-file-line\">import neuralart<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC16\" class=\"blob-code blob-code-inner js-file-line\">import numpy as np<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC17\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC18\" class=\"blob-code blob-code-inner js-file-line\">RENDER_SEED = 10<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC19\" class=\"blob-code blob-code-inner js-file-line\">Z_SEED = 0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC20\" class=\"blob-code blob-code-inner js-file-line\">DEVICE = &quot;cpu&quot; # &#39;cpu&#39; for CPU, &#39;cuda&#39; for GPU<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC21\" class=\"blob-code blob-code-inner js-file-line\">ITERATIONS = 10000<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC22\" class=\"blob-code blob-code-inner js-file-line\">MIN_STEP_SIZE = .005<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC23\" class=\"blob-code blob-code-inner js-file-line\">MAX_STEP_SIZE = .006<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC24\" class=\"blob-code blob-code-inner js-file-line\">XRES = 2048<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC25\" class=\"blob-code blob-code-inner js-file-line\">YRES = 2048<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC26\" class=\"blob-code blob-code-inner js-file-line\">XLIM = np.array([-1.0, 1.0])<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC27\" class=\"blob-code blob-code-inner js-file-line\">YLIM = XLIM * (float(YRES) \/ XRES)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC28\" class=\"blob-code blob-code-inner js-file-line\">DEPTH = 9<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC29\" class=\"blob-code blob-code-inner js-file-line\">CHANNELS = 1<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC30\" class=\"blob-code blob-code-inner js-file-line\">OUTPUT_STD = 1.5<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC31\" class=\"blob-code blob-code-inner js-file-line\">HIDDEN_STD = 1.1<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC32\" class=\"blob-code blob-code-inner js-file-line\">Z_DIMS = 4<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC33\" class=\"blob-code blob-code-inner js-file-line\">Z_RANGE = (-1, 1)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC34\" class=\"blob-code blob-code-inner js-file-line\">RADIUS=True<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC35\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC36\" class=\"blob-code blob-code-inner js-file-line\">if len(sys.argv) != 2:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC37\" class=\"blob-code blob-code-inner js-file-line\">    sys.stderr.write(&quot;Usage: {} DIRECTORY\\n&quot;.format(sys.argv[0]))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC38\" class=\"blob-code blob-code-inner js-file-line\">    sys.exit(1)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC39\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC40\" class=\"blob-code blob-code-inner js-file-line\">directory = sys.argv[1]<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L41\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"41\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC41\" class=\"blob-code blob-code-inner js-file-line\">if not os.path.exists(directory):<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L42\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"42\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC42\" class=\"blob-code blob-code-inner js-file-line\">    os.makedirs(directory)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L43\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"43\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC43\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L44\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"44\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC44\" class=\"blob-code blob-code-inner js-file-line\">rng = np.random.RandomState(seed=Z_SEED)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L45\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"45\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC45\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L46\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"46\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC46\" class=\"blob-code blob-code-inner js-file-line\">zfill = len(str(ITERATIONS &#8211; 1))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L47\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"47\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC47\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L48\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"48\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC48\" class=\"blob-code blob-code-inner js-file-line\">M = np.array([<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L49\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"49\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC49\" class=\"blob-code blob-code-inner js-file-line\">    [-1,  3, -3,  1],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L50\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"50\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC50\" class=\"blob-code blob-code-inner js-file-line\">    [ 3, -6,  3,  0],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L51\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"51\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC51\" class=\"blob-code blob-code-inner js-file-line\">    [-3,  3,  0,  0],<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L52\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"52\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC52\" class=\"blob-code blob-code-inner js-file-line\">    [ 1,  0,  0,  0]<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L53\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"53\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC53\" class=\"blob-code blob-code-inner js-file-line\">])<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L54\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"54\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC54\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L55\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"55\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC55\" class=\"blob-code blob-code-inner js-file-line\">P0 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L56\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"56\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC56\" class=\"blob-code blob-code-inner js-file-line\">P1 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L57\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"57\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC57\" class=\"blob-code blob-code-inner js-file-line\">P2 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L58\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"58\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC58\" class=\"blob-code blob-code-inner js-file-line\">P3 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L59\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"59\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC59\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L60\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"60\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC60\" class=\"blob-code blob-code-inner js-file-line\">count = 0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L61\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"61\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC61\" class=\"blob-code blob-code-inner js-file-line\">while count &lt; ITERATIONS:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L62\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"62\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC62\" class=\"blob-code blob-code-inner js-file-line\">    P0 = P3<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L63\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"63\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC63\" class=\"blob-code blob-code-inner js-file-line\">    P1 = 2 * P3 &#8211; P2<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L64\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"64\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC64\" class=\"blob-code blob-code-inner js-file-line\">    P2 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L65\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"65\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC65\" class=\"blob-code blob-code-inner js-file-line\">    P3 = rng.uniform(*Z_RANGE, size=Z_DIMS)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L66\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"66\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC66\" class=\"blob-code blob-code-inner js-file-line\">    pos = P0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L67\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"67\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC67\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L68\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"68\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC68\" class=\"blob-code blob-code-inner js-file-line\">    lo = 0.0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L69\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"69\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC69\" class=\"blob-code blob-code-inner js-file-line\">    hi = 1.0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L70\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"70\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC70\" class=\"blob-code blob-code-inner js-file-line\">    while np.linalg.norm(P3 &#8211; pos) &gt; MIN_STEP_SIZE:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L71\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"71\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC71\" class=\"blob-code blob-code-inner js-file-line\">        if count &gt;= ITERATIONS:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L72\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"72\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC72\" class=\"blob-code blob-code-inner js-file-line\">            break<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L73\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"73\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC73\" class=\"blob-code blob-code-inner js-file-line\">        t = (lo + hi) \/ 2.0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L74\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"74\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC74\" class=\"blob-code blob-code-inner js-file-line\">        P = np.vstack((P0, P1, P2, P3)).T<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L75\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"75\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC75\" class=\"blob-code blob-code-inner js-file-line\">        C = P.dot(M).dot(np.array([t ** 3, t ** 2, t, 1]))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L76\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"76\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC76\" class=\"blob-code blob-code-inner js-file-line\">        distance = np.linalg.norm(C &#8211; pos)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L77\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"77\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC77\" class=\"blob-code blob-code-inner js-file-line\">        if distance &lt; MIN_STEP_SIZE:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L78\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"78\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC78\" class=\"blob-code blob-code-inner js-file-line\">            lo = t<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L79\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"79\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC79\" class=\"blob-code blob-code-inner js-file-line\">            continue<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L80\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"80\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC80\" class=\"blob-code blob-code-inner js-file-line\">        elif distance &gt; MAX_STEP_SIZE:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L81\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"81\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC81\" class=\"blob-code blob-code-inner js-file-line\">            hi = t<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L82\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"82\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC82\" class=\"blob-code blob-code-inner js-file-line\">            continue<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L83\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"83\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC83\" class=\"blob-code blob-code-inner js-file-line\">        pos = C<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L84\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"84\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC84\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L85\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"85\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC85\" class=\"blob-code blob-code-inner js-file-line\">        result = neuralart.render(<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L86\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"86\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC86\" class=\"blob-code blob-code-inner js-file-line\">            depth=DEPTH,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L87\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"87\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC87\" class=\"blob-code blob-code-inner js-file-line\">            xres=XRES,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L88\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"88\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC88\" class=\"blob-code blob-code-inner js-file-line\">            yres=YRES,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L89\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"89\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC89\" class=\"blob-code blob-code-inner js-file-line\">            xlim=XLIM,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L90\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"90\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC90\" class=\"blob-code blob-code-inner js-file-line\">            ylim=YLIM,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L91\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"91\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC91\" class=\"blob-code blob-code-inner js-file-line\">            seed=RENDER_SEED,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L92\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"92\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC92\" class=\"blob-code blob-code-inner js-file-line\">            channels=CHANNELS,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L93\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"93\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC93\" class=\"blob-code blob-code-inner js-file-line\">            output_std=OUTPUT_STD,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L94\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"94\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC94\" class=\"blob-code blob-code-inner js-file-line\">            hidden_std=HIDDEN_STD,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L95\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"95\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC95\" class=\"blob-code blob-code-inner js-file-line\">            radius=RADIUS,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L96\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"96\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC96\" class=\"blob-code blob-code-inner js-file-line\">            z=C,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L97\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"97\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC97\" class=\"blob-code blob-code-inner js-file-line\">            device=DEVICE<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L98\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"98\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC98\" class=\"blob-code blob-code-inner js-file-line\">        )<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L99\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"99\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC99\" class=\"blob-code blob-code-inner js-file-line\">        file = os.path.join(directory, str(count).zfill(zfill) + &quot;.png&quot;)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L100\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"100\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC100\" class=\"blob-code blob-code-inner js-file-line\">        im = Image.fromarray(result.squeeze())<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L101\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"101\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC101\" class=\"blob-code blob-code-inner js-file-line\">        im.save(file, &quot;png&quot;)<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L102\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"102\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC102\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L103\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"103\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC103\" class=\"blob-code blob-code-inner js-file-line\">        count += 1<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L104\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"104\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC104\" class=\"blob-code blob-code-inner js-file-line\">        lo = t<\/td>\n<\/tr>\n<tr>\n<td id=\"file-bezier_neural_walk-py-L105\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"105\"><\/td>\n<td id=\"file-bezier_neural_walk-py-LC105\" class=\"blob-code blob-code-inner js-file-line\">        hi = 1.0<\/td>\n<\/tr>\n<\/table>\n<\/div><\/div>\n<\/p><\/div>\n<\/div><\/div>\n<div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/dstein64\/1d6e21d80dccbec15b5198d9e4bb7f0a\/raw\/3ff2ff02724ef86a1ee3b9603c12fe7ff82c3df7\/bezier_neural_walk.py\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a><br \/>\n        <a href=\"https:\/\/gist.github.com\/dstein64\/1d6e21d80dccbec15b5198d9e4bb7f0a#file-bezier_neural_walk-py\" class=\"Link--inTextBlock\"><br \/>\n          bezier_neural_walk.py<br \/>\n        <\/a><br \/>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The video above was generated using\u00a0neuralart.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[58,57,56],"class_list":["post-25483","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-bezier-curves","tag-generative-art","tag-neural-networks"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1sCC6-6D1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/comments?post=25483"}],"version-history":[{"count":16,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25483\/revisions"}],"predecessor-version":[{"id":25531,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25483\/revisions\/25531"}],"wp:attachment":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/media?parent=25483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/categories?post=25483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/tags?post=25483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}