深度学习零基础?没关系——面向艺术家的RNN教程-阿里云开发者社区

开发者社区> 【方向】> 正文

深度学习零基础?没关系——面向艺术家的RNN教程

简介: 本文适用于没有任何机器学习背景的读者,目标是向艺术家和设计师展示如何使用一个预训练的神经网络并使用简单的Javascript和p5.js库生成交互式的数字作品。教程简单详细,没有任何的公式与推导。
+关注继续查看

更多深度文章,请关注:https://yq.aliyun.com/cloud


作者介绍:hardmaru,一位钟情于RNN的深度学习研究者,相关地址

Twitter地址:https://twitter.com/hardmaru

Github地址:https://github.com/hardmaru

博客地址:http://blog.otoro.net/

3255170d60d5b67bb7e3295be9c001211f84e115

这篇文章适用于没有任何机器学习背景的读者目标是艺术家和设计师展示如何使用一个预训练的神经网络使用简单的Javascriptp5.js生成交互式数字作品。

72bd0bc283ba5588d4d29901befe2a420fbaf314

介绍

近年来,机器学习已经成为创意社区的流行工具。比如风格转变T-SNE、自动编码器、生成对抗性的网络以及无数其他的方法,艺术家们采用这些技术生成文本、音乐以及声音。

这篇文章使用了与distill.pub项目相同的手写模型

手写大脑建模

当写信时,大脑中有许多事情发生。比如写什么、选择词汇动笔写等过程创建一个JavaScript模型来模拟整个人类大脑写信是困难的,因此只专注于手写过程中的最后一部分——笔的位置,以及笔与纸张是否接触。

对模型做两个假设。第一个假设是模型接下来要写的内容只取决于它过去写的内容。内容的记忆可以通过构建回归神经网络(RNN)完成。

通过RNN,可以将模糊知识直接存储到RNN的神经元,并将此对象作为RNN的隐藏状态。这个隐藏状态记录每个神经元的活跃程度,隐藏状态对象会随着写入内容而不断更新。

第二个假设是该模型不完全确定它接下来应该写什么。这两个假设可以总结为下图,描述了使用具有隐藏状态的循环神经网络模型来生成随机序列的过程。

   2c787d9544dd3654e46fe2af76be7c1ac785fd5d

用于手写体的RNN

用已预训练好的RNN模型完成上一节描述的书写任务。本节将描述如何在JavaScript中使用该模型,下面是整个p5.j s的框架


首先需要定义几个变量表示笔的轨迹(x,y),此外还需要较小的坐标偏移(dx,dy,并用(x,y)累积(dx,dy)判断笔的走向,。

var x, y; // absolute coordinates of where the pen is
var dx, dy; // offsets of the pen strokes, in pixels

另外,笔不会总与纸张接触。定义变量pen,若pen为零,则当前时刻笔与纸张相互接触。另外需要跟踪以前时刻的pen,记为prev_pen

// keep track of whether pen is touching paper. 0 or 1.
var pen;
var prev_pen; // pen at the previous timestep

模型每一时刻生成的(dx, dy, pen)变量列表,那么使用这些数据可以绘制出模型在屏幕上生成的内容。开始时将这些变量(dx, dy, x, y, pen,prev_pen)初始化为零。定义一些将由RNN模型使用的变量对象:

var rnn_state; // store the hidden states the rnn

// store all the parameters of a mixture-density distribution
var pdf;

// controls the amount of uncertainty of the model
// the higher the temperature, the more uncertainty.
var temperature = 0.65; // a non-negative number.

 rnn_state 变量代表RNN的隐藏状态使用代码update更新rnn_state

rnn_state = Model.update([dx, dy, prev_pen], rnn_state);

 rnn_state将用产生模型将要写内容的概率分布。该概率分布表示作为主体,称作pdf。使用get_pdf就能rnn_state获得pdf

pdf = Model.get_pdf(rnn_state);

 额外变量temperature使我们能够控制该模型是否为想要的模型。结合pdf可以使用 sample函数去采样下一组(dx, dy, pen)在稍后使用以下函数:

[dx, dy, pen] = Model.sample(pdf, temperature);

现在唯一需要的其他变量是控制手写体的颜色,并且跟踪浏览器的屏幕尺寸:

// stores the browser's dimensions
var screen_width = window.innerWidth;
var screen_height = window.innerHeight;

// colour for the handwriting
var line_color;

现在准备初始化所有这些声明的变量创建函数restart初始化这些变量,通过重复调用以初始化很多次。


function restart() {
  // set x to be 50 pixels from the left of the canvas
  x = 50;
  // set y somewhere in middle of the canvas
  y = screen_height/2;

  // initialize pen's states to zero.
  dx = 0;
  dy = 0;
  prev_pen = 0;
  // note: we draw lines based off previous pen's state

  // randomise the rnn's initial hidden states
  rnn_state = Model.random_state();

  // randomise colour of line by choosing RGB values
  line_color = color(random(255), random(255), random(255))
}

创建restar函数后,定义p5.js setup函数初始化框架


function setup() {
  restart(); // initialize variables for this demo
  createCanvas(screen_width, screen_height);
  frameRate(60); // 60 frames per second
  // clear the background to be blank white colour
  background(255);
  fill(255);
}

p5.j s框架中的 draw函数能够产生一代手写字迹,该函数每秒调用60每次调用此函数时,RNN将在屏幕上绘制一些东西。


function draw() {

  // using the previous pen states, and hidden state
  // to get next hidden state 
  rnn_state = Model.update([dx, dy, prev_pen], rnn_state);

  // get the parameters of the probability distribution
  // from the hidden state
  pdf = Model.get_pdf(rnn_state);

  // sample the next pen's states
  // using our probability distribution and temperature
  [dx, dy, pen] = Model.sample(pdf, temperature);

  // only draw on the paper if pen is touching the paper
  if (prev_pen == 0) {
    // set colour of the line
    stroke(line_color);
    // set width of the line to 2 pixels
    strokeWeight(2.0);
    // draw line connecting prev point to current point.
    line(x, y, x+dx, y+dy);
  }

  // update the absolute coordinates from the offsets
  x += dx;
  y += dy;

  // update the previous pen's state
  // to the current one we just sampled
  prev_pen = pen;

  // if the rnn starts drawing close to the right side
  // of the screen, restart our demo
  if (x > screen_width - 50) {
    restart();
    // reset screen
    background(255);
    fill(255);
  }

}

在每一帧draw函数将更新基于它先前在屏幕上绘制的模型隐藏的状态。从这个隐藏状态,模型将生成接下来的概率分布。基于此概率分布,沿着temperature参数将随机抽样一组(dx, dy, pen) 变量新形式。基于这一新的变量集合,产生新的手写体

ba2ebaab03e8a46d921f9173e6bbe79d2d0c748c

变化温度的概率分布采样

变量 pdf在每时应该储存下一个笔划的概率分布,它实际上只是包含了复杂的概率分布的参数。

处理这个问题的直接方式是将概率分布建模为许多正态分布加在一起的总和更多的技术细节可以在之前得到

利用概率分布以及从分布中采样得到的一组 (dx, dy, pen) 值,确定接下来绘制什么,使用 temperature 参数来控制模型的不确定性的水平。

在下面的草图中,可以通过改变温度参数来可视化概率分布如何增加。

6490570257918dcc04d5add3d69d79d53a84061d

为了简单起见,上述演示模拟了二十个一维正态分布与温度参数的混合。在手写模型中,概率分布是二十个二维正态分布的混合。在下一个草图中,您可以在手写模型正在写入内容时修改其温度,以查看手写随温度变化的情况。

c9148aa9785b9dcbd9d0f672947cc2bc5548c6a0

当温度保持低时,手写模型变得非常确定,所以手写通常更整洁和更现实。

扩展手写体demo

将机器学习与设计相结合的一个更有趣的方面是探索人与机器之间的相互作用。典型的机器学习框架+ python栈使得难以部署真正的交互式web应用程序。

74fb16f0922dfe625091db7ee0084b48f6b7b837

一个可能的互动延伸从基本的手写演示中得到让用户在屏幕上交互的方式编写一些字迹另一个扩展可以建立类似distill.pub

978815fa1ee3132f4bb5dd4407c872e24f744899

使用此代码!

如果你是一个艺术家或有意机器学习设计师,你可以自己的喜好使用包含这些代码GitHub库。

这篇文章只表面分析了循环神经网络。还有其他的资源,比如TensorFlowkeras等。

更新:

该模型已经被移植bl.ocks

    数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

       本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。


      文章原标题《Recurrent Neural Network Tutorial for Artists》,作者:hardmaru ,译者:海棠

  文章为简译,更为详细的内容,请查看原文

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python零基础学习笔记(五)—— 标识符
简单的说就是一串字符串(但字符串未必是标识符) 规则: 只能由子母/数字/下划线组成 开头不能是数字 不能是关键字['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'conti...
1427 0
Python零基础学习笔记(六)—— 变量和常量
变量: 程序可操作的存储空间的名称 程序运行期间可改变的数据 每个变量都有特定的类型 作用:将不同类型的数据存储到内存 定义变量:变量名 = 初始值(为了确定变量的类型,python里面可以直接识别数据类型 例如:age = 10) 数据的存储:变量名 = 数据值 特别注意:变...
1373 0
Jenkins 教程(二)实现本地资源ssh上传
在教程一中我们只实现了在jenkins容器中的打包和结果通知,这节教程将用一个ssh工具将我们package完的项目上传到我们的服务器中。 1. 安装插件 Publish over SSH 完了点击直接安装 2. 插件的系统配置 配置完成后测试一下: 3. 插件的工程配置 最后一个框是在服务器运行什么脚本。
862 0
干货|如何让机器向“时尚达人”学习?阿里做了个“实用”的图像数据集
阿里资深算法专家雷音带领的团队,有个非常特别的名字,叫做“图像与美”。雷音希望,未来AI产品对衣服的理解不只限于照片和文字,还可以理解衣服本身,进而理解时尚穿搭之道、理解流行风向。
873 0
Directx11教程(45) alpha blend(2)
在myTutorialD3D11_40中,我们在场景中再添加一个box,并把box放在水里,实现半透明的效果。如下图所示:       我们要特别注意一点的就是场景中物体的渲染次序,先渲染山谷、第二个box,第三个水。
682 0
Directx11教程(47) alpha blend(4)-雾的实现
除了用来实现透明效果之外,我们还可以用alpha blend来实现雾(fog)的效果。通过逐渐清晰的雾气效果,可以增加场景的真实感。      雾的效果实现很简单,首先我们要一种颜色来表示雾,通常使用用灰色。
709 0
基于多任务学习和负反馈的深度召回模型
召回结果的好坏对整个推荐结果有着至关重要的影响,最近的一系列实践和研究表明,基于行为序列的深度学习推荐模型搭配高性能的近似检索算法可以实现既准又快的召回性能;与此同时,用户在天猫精灵上还可以进行实时指令操控(歌名点播:“播放七里香”、风格流派推荐点播:“来点摇滚”、主动切歌:“下一首”等),如何利用这些丰富的反馈信息改进召回模型的性能,他们是怎么做的呢?
1092 0
Apache Flink 零基础入门教程(六):状态管理及容错机制
本文主要分享内容如下: - 状态管理的基本概念; - 状态的类型与使用示例; - 容错机制与故障恢复;
976 0
Python零基础学习笔记(十七)—— for 语句
''' for 语句,是一种循环语句 格式: for 变量名 in 集合: 语句 逻辑:按顺序取“集合”中的每个元素赋值给“变量”,再去执行语句 如此循环往复,直到取玩“集合”中的元素为止 ''' for i in [1,2,3,4,5]: print(i) '...
1159 0
+关注
【方向】
欢迎各位对内容方向及质量提需求,我们尽量满足,将国外优质的内容呈现给大家!
696
文章
5
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载