【译】Effective TensorFlow Chapter4——TensorFlow中的Broadcast机制的优缺点

本文翻译自: 《Broadcasting the good and the ugly》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 TensorFlow 支持广播元素操作。 通常, 当你想做加法或乘法的运算时, 你需要确保操作数的形状(shape)是匹配的, 例如: 你不能将一个形状为[3, 2]的张量和一个形状为[3, 4]的张量相加。 但是, 这里有一个特殊情况, 那就是当你的其中一个操作数是一个具有单独维度(singular dimension)的张量的时候, TF 会隐式地在它的单独维度方向填满(tile), 以确保和另一个操作数的形状相匹配。 所以, 对一个[3, 2]的张量和一个[3, 1]的张量相加在 TF 中是合法的。 import tensorflow as tf a = tf.constant([ [1., 2.], [3., 4.] ]) b = tf.constant([ [1.], [2.] ])# c = a + tf.tile(b, [1, 2]) c = a + b 广播机制允许我们在隐式情况下进行填充(tile), 这种操作可以使得我们的代码更加简洁, 并且更有效率地利用内存, 因为我们不需要储存填充操作的结果。 一个可以表现这个优势的应用场景就是在结合具有不同长度的特征向量的时候。 为了拼接具有不同长度的特征向量, 我们一般都先填充输入向量, 拼接这个结果然后进行之后的一系列非线性操作等。 这是各种神经网络架构的常见模式: :...

【译】Effective TensorFlow Chapter1——TensorFlow 基础

本文翻译自: 《TensorFlow Basics》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 TensorFlow 和其他数值计算库(如 NumPy)之间最显著的区别在于 TensorFlow 中的操作是基于符号运算的。 这是一个强大的概念, 它允许 TensorFlow 执行命令式库(如 NumPy)所不能做的所有事情(例如, 自动区分)。 但这也要付出更大的代价。 在我我试图揭秘 TensorFlow, 并提供一些指导方针和最佳实践, 以便更有效地使用 TensorFlow。 让我们从一个简单的例子开始, 我们要乘以两个随机矩阵。 首先, 我们看一个在 NumPy 完成的实施: import numpy as np x = np.random.normal(size=[10, 10]) y = np.random.normal(size=[10, 10]) z = np.dot(x, y) print(z) 现在我们在 TensorFlow 中执行完全相同的计算: ...

plainify

【译】用于补丁生成自动推理代码转换

这篇是导师给的论文,因为有随手删文件的习惯,所以把这篇文章发布到掘金社区留作备份,原文地址为:Automatic Inference of Code Transforms for Patch Generation.,本人目前翻译功底较差,如果有小伙伴觉得翻译的有问题,希望在评论区指出,大家共同进步 😊 论文:Fan Long, Peter Amidon, and Martin Rinard. 2017. Automatic Inference of Code Transforms for Patch Generation. In Proceedings of 2017 11th Joint Meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering, Paderborn,Germany, September 4-8, 2017 (ESEC/FSE’17), 13 pages. https://doi.org/10.1145/3106237.3106253 摘要 我们提出了一个新的系统 Genesis,该系统能够处理人工的补丁来自动化推理代码转换,用于自动化补丁生成。我们呈现的结果描述了 Genesis 推理算法和完整的 Genesis 补丁生成系统在来自 372 个真实的 Java 项目的补丁和缺陷上工作的有效性。据我们所知,Genesis 是第一个用于自动推理补丁生成转换或从先前成功的补丁空间中搜索候选补丁的系统。...

plainify

【译】13 个你应该选择/考虑使用 Flutter 的理由

原文地址:13 Reasons Why you should choose/ consider to move to Flutter 13 个你应该转向 Dart 并且选择或者学习利用 Flutter 去开发你的下一个 app 的理由。 如今的企业需要在选择移动技术时做出关键选择。他们不断的测试和评估技术,以求不论用户使用什么移动设备或操作系统都能有强大的数字体验。企业如果不能提供易于使用的产品和服务,那么无论使用何种渠道或设备,都有可能落后于竞争对手。 目前面临的挑战便是跨平台应用的开发存在问题。在某些情况下,尽管开发人员尽了最大努力,其用户体验仍然落后于原生 app 。近年来,我们看到了各种移动框架的出现,如 React Native、Xamarin 和 AngularJS ,它们帮助我们更容易地产生较好地数字体验。最近我们看到一个新玩家加入了这场游戏——谷歌的 Flutter。 从内部来看,Flutter 看起来像是谷歌各种技术和概念的大杂烩,然而却产生一个不可思议的强大的移动框架。它是基于 Dart (谷歌的内部编程语言)开发的,它可以让 Flutter 访问 Skia 图形库,而这正是 Chrome 浏览器所使用的。除此之外,Flutter 与谷歌的 Material Design 规范紧密结合;其中最著名的便是 Android 用户已经熟知的“卡片图案”。 让我们看看 13 个选择 Flutter 作为你的开发环境甚至可以选择它开始你的职业生涯的理由, 1. Flutter 克服了传统跨平台的限制 长期以来,创建真正的跨平台方法一直是技术顾问的苦恼所在,他们厌倦了为同一产品制作多个版本。但是,实际上,跨平台应用的用户体验通常落后于原生 app,因为你经常需要即时编译 JavaScript 来构建 UI 体验。 使用 Flutter,你不仅可以拥有“一次编写”的优势,还可以创建高性能的“原生”体验,因为 Flutter 应用程序是提前编译出机器可执行的二进制文件。它克服了其他跨平台方法中的一些常见问题。...

plainify

找对象的过程中,我竟然理解了什么是机器学习!

最近开始了有关机器学习方面知识的学习,自己啃书本的时候一些概念枯燥无味,所以借着做笔记的机会来简单理解其中的一些概念,如有谬误,还望指出。😊 什么是人工智能? 我看过很多博客解释什么是人工智能,我觉得还不如一句话一张图解释的简洁明了。让机器实现原来只有人类才能完成的任务,这个操作就是人工智能。 下图所示就是让机器模拟人各种能力的人工智能领域示意图:(图片我是在逛知乎的时候发现的,地址贴在文末) 什么是机器学习? 在解释什么是机器学习之前,我们先来举一个让每个程序员都头疼的问题: 找对象 作为一个程序员,找对象自然是个非常紧迫的问题,那找对象总要有个要求吧 🤔 啥?活的?能动?骨骼轻奇的我怎么可能只有这两点要求啊 🙊 显然我是希望找一个好的女朋友啊(毕竟要带出去撑场面的啊),所以应该怎么找呢? 爱美之心,人皆有之。长得好看的妹子肯定比长得丑的妹子更优秀啊,所以这时我就有了一个简单的规则了:只挑选长得好看的女生的当女朋友。所以还等什么?快去朋友圈看看哪些漂亮的女生还是单身啊。是不是 So easy? 当!然!不!是! 生活总是充满了艰辛 张无忌的麻麻说过: 当你网恋奔现的时候你会发现,那些朋友圈里的都是照骗,你懵逼了。。。很显然,只看女生照片找对象这个方法是很片面的,找到一个好的女朋友的因素有很多而并不只是根据女生的颜值。 在经过了大量思考(并且参考了众多好友的女朋友)之后,你又得出了一个结论:身材好同时颜值高的女生更容易吸引你。同时身材一般但颜值高的好友中只有一半左右能让你感兴趣。 这时你再带着你得出的结论去找女生的时候,才知道原来妹子已经脱单好久,只是把你当朋友。。。但是心好的妹子为了安慰你便把她的闺蜜推给了你。然后你发现你之前的结论不适用了,所以只能重新开始约朋友圈的妹子。 假设过了好久好久之后,你成功的总结了一个找妹子的经验,找到了一个优秀的另你满意的妹子了,你很开心的和她在一起了。丑媳妇也要见公婆的,终于到了你把女朋友带回家给家长见面的时候了,你爸妈说,这女生太漂亮了,你管不住,坚决反对。 在你爸妈的反对下,你只能选择无奈的和妹子 say goodbye👋。最后的最后你和你爸妈摊牌,然后将你的择偶规则告诉你的家人,在他们的筛选下,你终于找到了符合**“所有”**预期标准属性的女朋友了。 是不是觉得很 dan 疼? 回想一下上述的场景,是不是觉得十分 dan 疼,虽然最终结果是你找到了一个满意的女朋友,但是在找对象的过程中,你需要不断的更换标准(属性),而且每当你需要用一个新的标准(属性)去衡量一个妹子的时候,你只能手动更改你自己的规则。并且你需要了解所有繁杂的影响女朋友质量的因素(比如颜值、身材、贴心程度、可爱程度等等)。如果这些因素足够复杂,你很难手动分类所有类型的女生而做出精确的规则。 并且,不断的和不同的女生谈恋爱、试错不仅浪费时间,名声也不好。说不定还会被扣上一定渣男的帽子。 来类比下? 其实上述就是一个非常不典型的机器学习的例子,我们来类比下: 机器学习(ML) 你可以从朋友圈随机挑选一些女生(假设你的异性缘足够的好)作为样本(training data),然后列出所有女生的属性,比如身高、颜值、身材、学历、工作,等等(features),以及是否贴心、黏人度、孝心,等等(output variables)。将这些抽象化的数据在机器学习算法里运行(classification/regression),则 ML 算法构建一个模型:女生的属性——女生的质量。 然后等到下次你又遇见了一个女生了,你就可以用眼睛扫一下检查女生的属性(身材、颜值等)了(test data),然后提供给 ML 算法,他就会根据之前生成的模型(model)预测这个妹子最终和你走到一起的可能有多大。 其实在机器学习构建模型过程中,内部使用的规则也许和上述例子中类似,但是也有可能是更复杂的规则,不过这些你并不需要关心。 你现在再去找对象就有很大信心了,而且更重要的时候,随着时间你的 ML 算法会自我提升(reinforcement learning),当预测错误的时候(恋爱谈不下去就分手)矫正自身,随着读取更多的 training data 预测也会越来越精准。但是,最流弊的一点在于,你可以利用相同的算法而训练出不同的模型(model),找女朋友可以用这个模型,那找秘书呢?(仿佛发现了什么不得了的事情 🤓,随便你想要训练出什么模型只要你高兴就好 ) 所以说对机器学习的最简单的理解,便是: 使用某种算法来对已有数据进行解析、学习,然后对真实世界中的数据/事件作出决策/预测。 那深度学习又是啥? 深度学习,是实现机器学习的技术。对机器学习来说,特征提取并不简单。特征工程往往需要大量的时间去优化,而此时,深度学习便可以自动学习特征和任务之间的关联,还能从简单特征中提取复杂的特征。 深度学习是机器学习的许多方法之一,其他方法包括决策树学习、归纳逻辑程序设计、聚类、强化学习和贝叶斯网络等。 那深度学习是如何寻找那些复杂特征的呢? 他是通过建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,如图象、声音、文本。其产生的灵感来自于大脑的结构和功能,即许多神经元的互联。 下图是我在知乎上看见的一个非常有趣的回答: 推荐大家去阅读下这个回答:👇...

plainify

从网易云日推浅谈个性化推荐系统--基于内容的协同过滤算法

上篇文章介绍了基于用户的协同过滤算法,该算法在一些网站(如 Facebook)中得到了应用,但该算法有一些缺点。首先,随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。因此,著名的电子商务公司亚马逊提出了另一个算法一基于内容的协同过滤算法。 什么是基于内容的协同过滤算法 在进入本文的正题之前,先打开网易云音乐看下今天的日推: 看了上述的标记,是不是瞬间理解了为啥用网易云听音乐的时候会有上瘾的感觉,因为他给你听的都是你爱听的啊。就跟小时候我妈给我做菜是一样的,今天知道我喜欢吃红烧肉,明天为了照顾我的喜好又为了保证不重样,第二天就给我做了糖醋排骨,久而久之产生了依赖性,体重也开始飙升了。 上述就是 基于内容的协同过滤算法(Item-based collaborative filtering,简称 ItemCF) 在生活中常见的案例,该算法给用户推荐那些和他们之前喜欢的内容相似的内容。比如,该算法会因为你购买过《数据挖掘导论》而给你推荐《机器学习》。不过,ItemCF 算法并不利用内容的内容属性计算内容之间的相似度,它主要通过分析用户的行为记录计算内容之间的相似度。该算法认为,内容 A 和内容 B 具有很大的相似度是因为喜欢内容 A 的用户大都也喜欢内容 B。 事实上,由于人和人之间的差异性远大于内容和内容之间的差异(不然怎么会说你女朋友翻脸比翻书还快呢 🙈),ItemCF 算法算是目前业界应用最多的算法。无论是淘宝首页猜你喜欢,还是网易云音乐、哔哩哔哩、YouTube,其推荐算法的基础都是该算法。 Tips:基于内容的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,比如上图中网易云日推的标签,会告诉你是根据你收藏的某某单曲推荐的。 基于内容的协同过滤算法 如果你理解了我的上一篇文章《从网易云日推浅谈个性化推荐系统(1)–基于用户的协同过滤算法》,那你也很容易就可以联想到想要实现一个基于内容的协同过滤需要有以下两步: 计算内容之间的相似度。 根据内容的相似度和用户的历史行为给用户生成推荐列表。 计算内容之间的相似度 1.确定计算相似度的公式 很显然,步骤(1)的关键就是计算两个内容之间的相似度,亚马逊显示相关内容推荐时的标题是 “Customers Who Bought This Item Also Bought” (购买了该商品的用户也经常购买的其他商品) ,相当于就下了一个定义,根据这个定义,我们可以用下面的公式定义内容的相似度: $$W_{ij}=\frac{\left | N(i)\cap N(j) \right |}{\left | N(i) \right |}$$ 这里,分母$\left | N(i) \right |$是喜欢物品$i$的用户数,而分子$\left | N(i)\cap N(j) \right |$是同时喜欢物品$i$和物品$j$的用户数。因此,上述公式可以理解为喜欢物品$i$的用户中有多少比例的用户也喜欢物品$j$。...

plainify

从网易云日推浅谈个性化推荐系统--基于用户的协同过滤算法

这是 2019 年的第一篇文章,因为最近导师给了一个新的任务,有关某 app 的个性化推荐的,正好自己也是第一次学习这方面的知识,便想着汇总整理下。前人栽树,后人乘凉,因为篇幅原因,这一部分准备分开来叙述,本篇主要和大家介绍基于用户的协同过滤算法,希望可以对大家有所帮助,如有谬误,还望指正! 什么是个性化推荐系统? 其实个性化推荐系统早已渗透进我们的生活了,网易云音乐的“每日推荐”,淘宝的”猜你喜欢“,这些都是生活中非常常见的个性化推荐的案例。如今,随着大数据的发展,个性化推荐早已涉及诸多领域,比如电子商务(京东淘宝)、电影和电视网站(youtube)、个性化音乐网络电台(网易云音乐)、社交网络(QQ)、个性化阅读(微信读书)、基于位置的个性化服务(美团)等。推荐算法的本质是通过一定的方式将用户和物品联系起来,而不同的推荐系统也会根据实际情况采取不同的推荐方式。 一般来说一个完整的推荐系统一般包括以下三个参与方: 被推荐对象 推荐物品的提供者 提供推荐系统的网站 以网易云音乐的日推为例: 首先,推荐系统需要满足用户的需求,给用户推荐那些令他们感兴趣的音乐。其次,推荐系统要尽量让各个歌手的歌都能够被推荐给对其感兴趣的用户,而不是只推荐几个大流量歌手的歌。最后, 好的推荐系统设计,能够让推荐系统本身收集到高质量的用户反馈,不断完善推荐的质量,增加用户和网站的交互,提高网站的收入。如下图所示: 什么是好的推荐系统? 想要评判一个东西好不好,一定要有个标准。那么推荐系统好坏的标准是什么呢?试想一下为什么大家都喜欢网易云音乐的每日推荐而不喜欢今日头条的每日推送呢?最直观的感受就是网易云的日推歌曲你爱听,而头条的推送你很讨厌。所以说预测准确度是推荐系统领域的重要指标(没有之一)。 好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西(比如网易云音乐经常给你推送那些非常好听但是比较冷门的歌曲)。同时,推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。 协同过滤(Collaborative Filtering) 为了让推荐结果符合用户口味,我们需要深入了解用户。如何才能了解一个人呢?《论语·公冶长》中说“听其言,观其行”,也就是说可以通过用户留下的文字和行为了解用户兴趣和需求。 实现个性化推荐的最理想情况是用户能主动告诉系统他喜欢什么,比如很久之前注册网易云音乐的时候会让用户选择喜欢什么类型的歌曲,但这种方法有 3 个缺点:首先,现在的自然语言理解技术很难理解用户用来描述兴趣的自然语言;其次,用户的兴趣是不断变化的,但用户不会不停地更新兴趣描述;最后,很多时候用户并不知道自己喜欢什么,或者很难用语言描述自己喜欢什么。 因此,我们需要通过算法自动发掘用户行为数据,从用户的行为中推测出用户的兴趣,从而给用户推荐满足他们兴趣的物品。 基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法(Collaborative Filtering Algorithm)。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。 既然是基于用户的行为分析,就必须要将用户的行为表示出来,下表给出了一种用户行为的表示方式(当然,在不同的系统中,每个用户所产生的行为也是不一样的),它将个用户行为表示为 6 部分,即产生行为的用户和行为的对象、行为的种类、产生行为的上下文、行为的内容和权重。 表示 备注 user id 产生行为的用户的唯一标识 item id 产生行为的对象的唯一标识 behavior type 行为的种类(比如说是点赞还是收藏) context 产生行为的上下文,包括时间和地点等信息 behavior weight 行为的权重(如果是听歌的行为,那么权重可以是听歌时常) behavior content 行为的内容(如果是评论行为,那么就是评论的文本) 随着学术界的大佬们对协同过滤算法的深入研究,他们提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph) 等。在这些方法中,最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法:...

plainify

【译】机器学习竞赛实际上是一场数据竞赛

本文翻译自: 《The Machine Learning Race Is Really a Data Race》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 那些想让 AI 成为差异化因素的企业需要从可选数据集中抽取——这些数据集可能是他们自己创建的. 如果你愿意这么说的话, 机器学习或人工智能已经成为一种商品。 那些急于定义和实现机器学习的企业惊讶的发现, 实现用于使机器智能的处理数据集或问题的算法是比较容易的部分。 从谷歌的开源机器学习框架 TensorFlow 到微软的 Azure 和亚马逊的 SageMaker, 有一大批强大的即插即用解决方案, 可以轻松地完成繁重的编程工作。 不过, 数据不但没有被商品化, 反而正在成为机器学习竞赛中的关键差异化因素。 这是因为好的数据并不常见。 ...

plainify

做小偷也要会动态规划——轻松解决"01背包问题"

前言 小偷不可怕,就怕小偷有文化,更怕小偷学过动态规划。 正文 白玉汤曾是江湖上赫赫有名的盗圣,奈何岁月不饶人,上了年纪后腿脚便不利索了,无奈一身的本领却没有个传承之人。这天,一位少年前来拜师学艺,希望白玉汤能在偷盗一事上指点一二。白玉汤见这少年骨骼清奇,内心有收其为徒的想法,便出了下面这道题考考少年: 话说地主金馆长家有个专门藏金银财宝的房间,潜入后发现可偷之物太多,奈何自身负重能力有限,你的包只能承重 20kg 的物品,而且每个物品的价值又都不一样,那么问题来了,将哪些物品装入背包才能不虚此行,使价值总和最大呢?物品重量和其价值的关系如下: 编号 重量(w) 价值(v) 1 2 3 2 3 4 3 4 5 4 5 8 5 9 10 少年一看,这不就是一道“01 背包问题吗”,说完便在地上做出了如下分析: 设我们的背包里面的物品价值为 b,给背包添加两个参数:k 和 c,即 b(k,c),那么 b(k,c)又表示什么什么意思呢? k 表示你面对的物品编号,即 1~5, c 表示你面对 k 号物品时,背包的剩余容量 b(k,c)表示面对 k 号物品,并作出拿或不拿的选择之后,背包里面的物品总价值 举个例子,b(2,20)表示的是,在你的背包容量为 20 的情况下,当你面对 2 号物品时并作出拿或者不拿的选择后,背包中物品的总价值。...

2018-08-14 211 words 1 min
plainify

2020年,我在编程时遇见的几个好物

年年都写年终总结,确实没什么新意,虽然今年也做了总结,但写完之后总觉得过于悲观,只是到了年底应该要有些什么表示,想着今年是该换个花样了,于是便有了这篇《2020 年,我在编程时遇到的几个好物》。 这篇文章介绍的,有框架,有工具,有软件,都是自己在编程时遇到的有用的,而且自己比较喜欢的,这里分享给大家。正所谓相遇即是缘,若是你有幸读到这篇文章并且觉得还不错,不妨点赞关注支持一波。 Hutool 第一个要介绍的便是 Hutool,Hutool 是一个 Java 工具包,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类。他的作用就是帮助我们简化代码,让程序员将更多的经历放在业务上而非一些无关紧要的工作上。 举个例子,近期我有一个很小的需求,一个大文件夹里有很多小文件夹,每个小文件夹里有一些我需要整理出来的 word 文档,如果通过界面点击的话,我可能需要点击 100 多个文件夹,所以很自然的就会想到用程序去实现这个需求,第一想法肯定是 shell 脚本或者 python 脚本,但其实借助 hutool 和 Java8 里的 lambda 表达式,同样可以很方便的实现这么一个小需求,如下所示: public class Main { public static void main(String[] args) { List<File> files = FileUtil.loopFiles("xxxPath", file -> FileUtil.extName(file).equalsIgnoreCase("docx") || FileUtil.extName(file).equalsIgnoreCase("doc") ); files.forEach(file -> FileUtil.copyFile(file.getAbsolutePath(), "xxxxxPath", StandardCopyOption.REPLACE_EXISTING)); } } 使用FileUtil.loopFiles就可以直接获取该路径下的所有文件,如要筛选,只需要在后面追加参数即可。 这样的工具类还有很多,例如发邮件,直接使用 MailUtil.send 即可。 MailUtil.send("yueyong1030@outlook.com", "新年快乐", "赶紧关注「01二进制」,现在关注以后就是老粉了", false); 安装方法也非常简单,Maven 安装 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5....