首页 文章 精选 留言 我的

精选列表

搜索[tensorflow.js],共53篇文章
优秀的个人博客,低调大师

在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

GenerativeAdversarialNetwork 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development in deep learning…The most important one, in my opinion, is adversarial training (also called GAN for Generative Adversarial Networks). This, and the variations that are now being proposed is the most interesting idea in the last 10 years in ML, in my opinion.”–Yann LeCun 那么我们就看看GAN究竟是怎么回事吧: 如上图所示,GAN包含两个互相对抗的网络:G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是: Generator是一个生成器的网络,它接收一个随机的噪声,通过这个噪声生成图片,记做G(z)。 Discriminator是一个鉴别器网络,判别一张图片或者一个输入是不是“真实的”。它的输入x是数据或者图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。 在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。 最后,我们就可以使用生成器和随机输入来生成不同的数据或者图片了。 上面的描述大家可能都能理解,但是把它变成数学语言,可能你就蒙B了。 如上图所示,x是输入,z是随机噪声。D(x)是鉴别器的判定数据为真的概率,D(G(z))是判定生成数据为真的概率。生成器希望这个D(G(z))越大越好,这个时候整个表达式的值应该变小。而鉴别器的目的是能够有效区分真实数据和假数据,所以D(x)应该趋向于变大,D(G(z))趋向于变小,整个表达式就变大。也就是说训练过程,生成器和辨别器互相对抗,一个使上述表达式变小,另一个使其变大,最后训练趋向于平衡,而生成器这时候应该生成真假难辨的数据,这就是我们的最终目的。 上图是GAN算法训练的具体过程,这里我们不做过多的解释,直接运行一个例子。 我们用MINST数据集来看看如何使用TensorflowJS来训练一个GAN,模拟生成手写数字。 代码见我的codepen function gen(xs) { const l1 = tf.leakyRelu(xs.matMul(G1w).add(G1b)); const l2 = tf.leakyRelu(l1.matMul(G2w).add(G2b)); const l3 = tf.tanh(l2.matMul(G3w).add(G3b)); return l3; } function disReal(xs) { const l1 = tf.leakyRelu(xs.matMul(D1w).add(D1b)); const l2 = tf.leakyRelu(l1.matMul(D2w).add(D2b)); const logits = l2.matMul(D3w).add(D3b); const output = tf.sigmoid(logits); return [logits, output]; } function disFake(xs) { return disReal(gen(xs)); } GAN的两个网络分别用gen和disReal创建。gen是生成器网络,disReal是辨别器的网络。disFake是把生成数据用辨别器来辨别。这里的网络使用leakyrelu。使得输出在-inf到+inf,利用sigmoid映射到【0,1】,这是辨别器模型输出一个0-1之间的概率。 通常我们会创建一个比生成器更复杂的鉴别器网络使得鉴别器有足够的分辨能力。但在这个例子里,两个网络的复杂程度类似。 计算损失的函数使用 tf.sigmoidCrossEntropyWithLogits,值得注意的是,在最新的0.13版本中,这个交叉熵被移除了,你需要自己实现该方法。 训练过程如下: async function trainBatch(realBatch, fakeBatch) { const dcost = dOptimizer.minimize( () => { const [logitsReal, outputReal] = disReal(realBatch); const [logitsFake, outputFake] = disFake(fakeBatch); const lossReal = sigmoidCrossEntropyWithLogits(ONES_PRIME, logitsReal); const lossFake = sigmoidCrossEntropyWithLogits(ZEROS, logitsFake); return lossReal.add(lossFake).mean(); }, true, [D1w, D1b, D2w, D2b, D3w, D3b] ); await tf.nextFrame(); const gcost = gOptimizer.minimize( () => { const [logitsFake, outputFake] = disFake(fakeBatch); const lossFake = sigmoidCrossEntropyWithLogits(ONES, logitsFake); return lossFake.mean(); }, true, [G1w, G1b, G2w, G2b, G3w, G3b] ); await tf.nextFrame(); return [dcost, gcost]; } 训练使用了两个optimizer, 第一步,计算实际数据的辨别结果和1的交叉熵,以及生成器生成数据的辨别结果和0的交叉熵。也就是说,我们希望辨别器尽可能的判断出生成数据都是假的而实际数据都是真的。使得这两个交叉熵的均值最小。 第二步开始对抗,要让生成数据尽可能被判别为真。 下图是某个训练过程的损失: 这个是经过1000个迭代后的生成图: 大家可以尝试调整学习率,增加网络复杂度,加大迭代次数来获得更好的生成模型。 GAN的学习其实还是比较复杂的,参数和损失选择都不容易,好在有一些现成的工具可以使用,另外推荐大家去https://poloclub.github.io/ganlab/,提供了很直观的GAN学习的过程。这个也是用TensorflowJS来实现的。 参考: https://www.msra.cn/zh-cn/news/features/gan-20170511 https://zhuanlan.zhihu.com/p/24767059 http://blog.aylien.com/introduction-generative-adversarial-networks-code-tensorflow/ https://github.com/carpedm20/DCGAN-tensorflow https://blog.openai.com/generative-models/ https://zhuanlan.zhihu.com/p/45200767 https://blog.csdn.net/heyc861221/article/details/80127148

优秀的个人博客,低调大师

【TensorFlow开发者峰会】重磅发布TensorFlow.js,完全在浏览器运行机器学习

Jeff Dean主旨演讲:用超强大的计算力,替代ML 北京时间3月31日举行的2018 TensorFlow 开发者峰会上,Google Brain负责人、谷歌高级研究员Jeff Dean、TensorFlow 总监 Rajat Monga等人进行了Keynote演讲。 Jeff Dean也是目前最受欢迎的深度学习框架TensorFlow的缔造者之一,他曾经就TensorFlow的高级使用,如何用TensorFlow实现大规模机器学习等问题做过多次演讲。今年初,Jeff Dean执笔撰写谷歌大脑成绩单,介绍了TensorFlow取得的一系列重要更新。 图:TensorFlow 用户的分布地图 TensorFlow 是 GitHub 上的第一个机器学习平台,也是 GitHub 上的五大软件库之一,被许多公司和组织所使用,包括 GitHub

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册