目录

第1章 什么是深度学习

1.1 人工智能、机器学习与深度学习

1.1.1 人工智能

1.1.2 机器学习

1.1.3 从数据中学习表示

1.1.4 深度学习之“深度”

1.1.5 用三张图理解深度学习的工作原理

1.1.6 深度学习已经取得的进展

1.1.7 不要相信短期炒作

1.1.8 人工智能的未来

1.2 深度学习之前:机器学习简史

1.2.1 概率建模

1.2.2 早期神经网络

1.2.3 核方法

1.2.4 决策树、随机森林与梯度提升机

1.2.5 回到神经网络

1.2.6 深度学习有何不同

1.2.7 机器学习现状

1.3 为什么是深度学习,为什么是现在

1.3.1 硬件

1.3.2 数据

1.3.3 算法

1.3.4 新的投资热潮

1.3.5 深度学习的大众化

1.3.6 这种趋势会持续吗


第1章 什么是深度学习

1.1 人工智能、机器学习与深度学习

1.1.1 人工智能

人工智能的简洁定义如下:努力将通常由人类完成的智力任务自动化。因此,人工智能是一个综合性的领域,不仅包括机器学习与深度学习,还包括更多不涉及学习的方法。在相当长的时间内,许多专家相信,只要程序员精心编写足够多的明确规则来处理知识,就可以实现与人类水平相当的人工智能。这一方法被称为符号主义人工智能,从20世纪50年代到80年代末是人工智能的主流范式,在20世纪80年代的专家系统热潮中,这一方法的热度达到了顶峰。

虽然符号主义人工智能适合用来解决定义明确的逻辑问题,比如下国际象棋,但它难以给出明确的规则来解决更加复杂、模糊的问题,比如图像分类、语音识别和语言翻译。于是出现了一种新的方法来替代符号主义人工智能,这就是机器学习。

1.1.2 机器学习

图灵思考了这样一个问题:通用计算机是否能够学习与创新?他得出的结论是“能”。

机器学习的概念就来自于图灵的这个问题:对于计算机而言,除了“我们命令它做的任何事情”之外,它能否自我学习执行特定任务的方法?计算机能否让我们大吃一惊?如果没有程序员精心编写的数据处理规则,计算机能否通过观察数据自动学会这些规则?

图灵的这个问题引出了一种新的编程范式。在经典的程序设计(即符号主义人工智能的范式)中,人们输入的是规则(即程序)和需要根据这些规则进行处理的数据,系统输出的是答案。利用机器学习,人们输入的是数据和从这些数据中预期得到的答案,系统输出的是规则。这些规则随后可应用于新的数据,并使计算机自主生成答案。

机器学习系统是训练出来的,而不是明确地用程序编写出来的。将与某个任务相关的许多示例输入机器学习系统,它会在这些示例中找到统计结构,从而最终找到规则将任务自动化。

虽然机器学习在20世纪90年代才开始蓬勃发展,但它迅速成为人工智能最受欢迎且最成功的的分支领域。机器学习(尤其是深度学习)呈现出相对较少的数学理论(可能太少了),并且是以工程为导向的。这是一门需要上手实践的学科,想法更多地是靠实践来证明,而不是靠理论推导。

1.1.3 从数据中学习表示

前面说过,给定包含预期结果的示例,机器学习将会发现执行一项数据处理任务的规则,因此,我们需要一下三个要素来进行机器学习。

1.输入数据点。例如,你的任务是语音识别,那么这些数据点可能是记录人们说话的声音文件。如果你的任务是为图像添加标签,那么这些数据点可能是图像。

2.预期输出的示例。对于语音识别任务来说,这些示例可能是人们根据声音文件整理生成的文本。对于图像标记任务来说,预期输出可能是“狗”“猫”之类的标签。

3.衡量算法效果好坏的方法。这一衡量方法是为了计算算法的当前输出与预期输出的差距。衡量结果是一种反馈信号,用于调节算法的工作方式。这个调节步骤就是我们所说的学习。

机器学习模型将输入数据变换为有意义的输出,这是一个从已知的输入和输出示例中进行“学习”的过程。因此,机器学习和深度学习的核心问题在于有意义地变换数据,换句话说,在于学习输入数据的有用表示——这种表示可以让数据更接近预期输出。机器学习模型都是为输入数据寻找合适的表示——对数据进行变换,使其更适合手头的任务(比如分类任务)。

在这个例子中:

1.输入是点的坐标;

2.预期输出的是点的颜色;

3.衡量算法好坏的一种方法是,正确分类的点所占的百分比。

在这个例子中,我们人为定义了坐标变换。但是,如果我们尝试系统性地搜索各种可能的坐标变换,并用正确分类的点所占百分比作为反馈信号,那么我们做的就是机器学习。机器学习中的学习指的是,寻找更好数据表示的自动搜索过程。

所有机器学习算法都包括自动寻找这样一种变化:这种变换可以根据任务将数据转化为更加有用的表示。机器学习算法在寻找这些变换时通常没有什么创造性,而仅仅是遍历一组预先定义好的操作,这组操作叫做假设空间。

这就是机器学习的技术定义:在预先定义好的可能性空间中,利用反馈信号的指引来寻找输入数据的有用表示。

1.1.4 深度学习之“深度”

深度学习是机器学习的一个分支领域:它是从数据中学习表示的一种新方法,强调从连续的层中进行学习,这些层对应于越来越有意义的表示。“深度学习”中的“深度”指的并不是利用这种方法所获取的更深层次的理解,而是指一系列连续的表示层。数据模型中包含多少层,这被称为模型的深度。这一领域的其他名称包括分层表示学习和层级表示学习。现代深度学习通常包含数十个甚至上百个连续的表示层,这些表示层全都是从训练数据中自动学习的。与此相反,其他机器学习方法的重点往往是仅仅学习一两层的数据表示,因此有时也被称为浅层学习。

在深度学习中,这些分层表示几乎总是通过叫做神经网络的模型来学习得到的。神经网络的结构是逐层堆叠。神经网络这一术语来自于神经生物学,然而,虽然深度学习的一些核心概念是从人们对大脑的理解中汲取部分灵感而形成的,但深度学习模型不是大脑模型。你无需那种“就像我们的头脑一样”的神秘包装,最好也忘掉度过的深度学习与生物学之间的假象联系,就我们的目的而言,深度学习是从数据中学习表示的一种数学框架。

上图这个网络将数字图像转换成与原始图像差别越来越大的表示,而其中关于最终结果的信息却越来越丰富。你可以将深度网络看作多级信息蒸馏操作:信息穿过连续的过滤器,其纯度越来越高(即对任务的帮助越来越大) 。

这就是深度学习的技术定义:学习数据表示的多级方法。

1.1.5 用三张图理解深度学习的工作原理

机器学习是将输入(比如图像)映射到目标(比如标签“猫”) ,这一过程是通过观察许多输入和目标的示例来完成的。深度神经网络通过一系列简单的数据变换(层)来实现这种输入到目标的映射,而这些数据变换都是通过观察示例学习到的。

神经网络中每层对输入数据所做的具体操作保存在该层的权重中,其本质是一串数字。用术语来说,每层实现的变换由其权重来参数化,权重有时也被称为该层的参数。在这种语境下,学习的意思是为神经网络的所有层找到一组权重值,使得该网络能够将每个示例输入与其目标正确地一一对应。

想要控制一件事物,首先需要能够观察它,想要控制神经网络的输出,就需要能够衡量该输出与预期值之间的距离。这就是神经网络损失函数的任务,该函数也叫目标函数。损失函数的输入是网络预测值与真实目标值,然后计算一个距离值,衡量该网络在这个示例上的效果好坏。

深度学习的基本技巧是利用这个距离值作为反馈信号来对权重进行微调,以降低当前示例对应的损失值。这种调节由优化器来完成,它实现了所谓的反向传播算法,这是深度学习的核心算法。

一开始对神经网络的权重随机赋值,因此网络只是实现了一系列随机变换,其输出结果自然也和理想值相去甚远,相应地,损失值也很高。但随着网络处理的示例越来越多,权重值也在向正确的方向逐步微调,损失值也逐渐降低。这就是训练循环,将这种循环重复足够多的次数,得到的权重值可以使损失函数最小。具有最小损失的网络,其输出值与目标值尽可能地接近,这就是训练好的网络。

1.1.6 深度学习已经取得的进展

深度学习已经取得了一下的突破,它们都是机器学习历史上非常困难的领域:

1.接近人类水平的图像分类;

2.接近人类水平的语音识别;

3.接近人类水平的手写文字转录;

4.更好的机器翻译;

5.更好的文本到语音转换;

6.数字助理,比如谷歌即时(Google Now)和亚马逊(Alexa);

7.接近人类水平的自动驾驶;

8.更好的广告定向投放,Google、百度、必应都在使用;

9.更好的网络搜索结果;

10.能够回到用自然语言提出的问题;

11.在围棋上战胜人类。

1.1.7 不要相信短期炒作

我们可能正在见证人工智能炒作与让人失望的第三次循环,而且我们仍处于极度乐观的阶段。最好的做法是降低我们的短期期望,确保对这一技术领域不太了解的人能够清楚地知道深度学习能做什么、不能做什么。

1.1.8 人工智能的未来

眼下,我们似乎很难相信人工智能会对世界产生巨大影响,因为它还没有被广泛地部署应用——正如1995年,我们也难以相信互联网在未来会产生的影响。当时,大多数人都没有认识到互联网与他们的关系,以及互联网将如何改变他们的生活。今天的深度学习和人工智能也是如此,但不要怀疑:人工智能即将到来。

在不远的未来,人工智能将成为你的助手,甚至成为你的朋友。它会回答你的问题,帮助你教育孩子,并关注你的健康。它还会将生活用品送到你家门口,并开车将你从A地送到B地。它还会是你与日益复杂的、信息密集的世界的接口。更为重要的是,人工智能将会帮助科学家在所有科学领域(从基因学到数学)取得突破性进展,从而帮助人类整体向前发展。

在这个过程中,我们可能会经历一些挫折,也可能会遇到新的人工智能冬天,正如互联网行业那样,在1998-1999年被过度炒作,进而在21世纪初遭遇破产,并导致投资停止。但我们最终会实现上述目标,人工智能最终将应用到我们社会和日常生活的几乎所有方面,正如今天的互联网一样。

不要相信短期的炒作,但一定要相信长期的愿景。人工智能可能需要一段时间才能充分发挥其潜力,这一潜力的范围大到难以想象,但人工智能终将到来,它将以一种奇妙的方式改变我们的世界。

1.2 深度学习之前:机器学习简史

深度学习不一定总是解决问题的正确工具:有时没有足够的数据,深度学习不适用;有时用其他算法可以更好地解决问题。如果你第一次接触的机器学习就是深度学习,那你可能会发现手中握着一把深度学习“锤子”,而所有机器学习问题看起来都像是“钉子”。为了避免陷入这个误区,唯一的方法就是熟悉其他机器学习方法并在适当的时候进行实践。

1.2.1 概率建模

概率建模是统计学原理在数据分析中的应用。它是最早的机器学习形式之一,至今仍在广泛使用。其中最有名的算法之一就是朴素贝叶斯算法。

朴素贝叶斯是一类基于应用贝叶斯原理的机器学习分类器,它假设输入数据的特征都是独立的。这是一个很强的假设,或者说“朴素的”假设,其名称正是来源于此。

另一个密切相关的模型是logistic回归(简称logreg),它有时被认为是现代机器学习的“hello world”。logreg是一种分类算法,而不是回归算法。

1.2.2 早期神经网络

20世纪80年代中期很多人都独立地重新发现了反向传播算法——一种利用梯度下降优化来训练一系列参数化运算链的方法,并开始将其应用于神经网络。

贝尔实验室与1989年第一次成功实现了神经网络的实践应用,当时Yann LeCun将卷积神经网络的早期思想与反向传播算法相结合,并将其应用于手写数字分类问题,由此得到名为LeNet的网络,在20世纪90年代被美国邮政署采用,用于自动读取信封上的邮政编码。

1.2.3 核方法

20世纪90年代一种新的机器学习方法声名鹊起,很快就使人们将神经网络抛诸脑后,这种方法就是核方法。核方法是一组分类算法,其中最有名的就是支持向量机(SVM)。

SVM的目标是通过在属于两个不同类别的两组数据之间找到良好决策边界来解决分类问题。决策边界可以看作一条直线或一个平面,将训练数据划分为两块空间,分别对应于两个类别。对于新数据点的分类,你只需判断它位于决策边界的哪一侧。

SVM通过两步来寻找决策边界。

1.将数据映射到一个新的高维表示,这时决策边界可以用一个超平面来表示(如果数据是二维的,那么超平面就是一条直线);

2.尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好决策边界(分割超平面),这一步叫做间隔最大化,这样决策边界可以很好地推广到训练数据集之外的新样本。

核技巧可以向数据映射到高维表示从而使分类问题简化,其基本思想是:要想在新的表示空间中找到良好的决策超平面,你不需要在新空间中直接计算点的坐标,只需要在新空间中计算点对之间的距离,而利用核函数可以高效地完成这种计算。核函数是一个在计算上能够实现的操作,将原始空间中的任意两点映射为这两点在目标表示空间中的距离,完全避免了对新表示进行直接计算。核函数通常是人为选择的,而不是从数据中学到的——对于SVM来说,只有分割超平面是通过学习得到的。

1.2.4 决策树、随机森林与梯度提升机

决策树是类似于流程图的结构,可以对输入数据点进行分类或根据给定输入来预测输出值。

随机森林算法引入了一种健壮且实用的决策树学习方法,即首先构建许多决策树,然后将它们的输出集成在一起。

与随机森林类似,梯度提升机也是将弱预测模型(通常是决策树)集成的机器学习技术。它使用了梯度提升方法,通过迭代地训练新模型来专门解决之前模型的弱点,从而改进任何机器学习模型的效果。将梯度提升技术应用于决策树时,得到的模型与随机森林具有相似的性质,但在绝大多数情况下效果都比随机森林要好。

1.2.5 回到神经网络

自2012年以来,深度卷积神经网络已成为所有计算机视觉任务的首选算法。更一般地说,它在所有感知任务上都有效。在2015年和2016年的主要计算机视觉会议上,几乎所有演讲都与convnet有关。与此同时,深度学习也在许多其他类型的问题上得到应用,比如自然语言处理。它已经在大量应用中完全取代了SVM和决策树。

1.2.6 深度学习有何不同

深度学习发展得如此迅速,主要原因在于它在很多问题上都表现出更好的性能,但这并不是唯一的原因。深度学习还让解决问题变得更加简单,因为它将特征工程完全自动化,而这曾是机器学习工作流程中最关键的一步。

先前的机器学习技术(浅层学习)仅包含将输入数据变换到一两个连续的表示空间,通常使用简单的变换,比如高维非线性投影(SVM)或决策树,但这些技术通常无法得到复杂问题所需要的精确表示。因此,人们必须竭尽全力让初始输入数据更适合用这些方法处理,也必须手动为数据设计好的表示层,这叫做特征工程。与此相反,深度学习完全将这个步骤自动化:利用深度学习,你可以一次性学习所有特征,而无须自己手动设计。这极大地简化了机器学习工作流程,通常将复杂的多阶段流程替换为一个简单的、端到端的深度学习模型。

在实践中,如果连续应用浅层学习方法,其收益会随着层数增加迅速降低,因为三层模型中最优的第一表示层并不是单层或双层模型中最优的第一表示层。深度学习的变革性在于,模型可以在同一时间共同学习所有表示层,而不是依次连续学习(这被称为贪婪学习)。通过共同的特征学习,一旦模型修改某个内部特征,所有依赖于该特征的其他特征都会相应地自动调节适应,无须人为干预,一切都由单一反馈信号来监督:模型中的每一处变化都是为了最终目标服务。这种方法比贪婪地叠加浅层模型更加强大,因为它可以通过将复杂、抽象的表示拆解为很多个中间空间(层)来学习这些表示,每个中间空间仅仅是前一个空间的简单变换。

深度学习从数据中进行学习时有两个基本特征:第一,通过渐进的、逐层的方式形成越来越复杂的表示;第二,对中间这些渐进的表示共同进行学习,每一层的变化都需要同时考虑上下两层的需要。总之,这两个特征使得深度学习比先前的机器学习方法更加成功。

1.2.7 机器学习现状

在2016年和2017年,Kaggle上主要有两大方法:梯度提升机和深度学习。具体而言,梯度提升机用于处理结构化数据的问题,而深度学习则用于图像分类等感知问题。使用前一种方法的人几乎都使用优秀的XGBoost库,它同时支持数据科学最流行的两种语言:Python和R。使用深度学习的Kaggle参赛者则大多使用Keras库,因为它易于使用,非常灵活,并且支持Python.

要想在如今的应用机器学习中取得成功,你应该熟悉这两种技术:梯度提升机,用于浅层学习问题;深度学习,用于感知问题。用术语来说,你需要熟悉XGBoost和Keras,它们是目前主宰Kaggle竞赛的两个库。

1.3 为什么是深度学习,为什么是现在

三种技术力量在推动着机器学习的进步:

1.硬件;

2.数据集和基准;

3.算法上的改进。

由于这一领域是靠实验结果而不是理论指导的,所以只有当适合的数据和硬件可用于尝试新想法时(或者将旧想法的规模扩大,事实往往也是如此),才可能出现算法上的改进。机器学习不是数学或物理学,靠一支笔和一张纸就能实现重大进展,它是一门工程科学。

1.3.1 硬件

从1990年到2010年,非定制CPU的速度提高了约5000倍,因此,现在可以在笔记本电脑上运行小型深度学习模型,但在25年前是无法实现的。

在21世纪前十年里,NVIDIA和AMD等公司投资数十亿美元来开发快速的大规模并行芯片(图形处理器,GPU),以便为越来越逼真的视频游戏提供图形显示支持。这样,游戏市场资助了用于下一代人工智能应用的超级计算。有时候,大事件都是从游戏开始的。

此外,深度学习行业已经开始超越GPU,开始投资于日益专业化的高效芯片来进行深度学习。

1.3.2 数据

人工智能有时被称为新的工业革命。如果深度学习是这场革命的蒸汽机,那么数据就是煤炭,即驱动智能机器的原材料,没有煤炭一切皆不可能。就数据而言,除了过去20年里存储硬件的指数级增长(遵循摩尔定律),最大的变革来自于互联网的兴起,它使得收集与分发用于机器学习的是超大型数据集变得可行。如今,大公司使用的图像数据集、视频数据集和自然语言数据集,如果没有互联网的话根本无法收集。例如,Flickr网站上用户生成的图像标签一直是计算机视觉的数据宝库,YouTube视频也是一座宝库,维基百科则是自然语言处理的关键数据集。

1.3.3 算法

在2014年、2015年和2016年,人们发现了更先进的有助于梯度传播的方法,比如批标准化、残差连接和深度可分离卷积。今天,我们可以从头开始训练上千层的模型。

1.3.4 新的投资热潮

机器学习,特别是深度学习,已成为科技巨头产品战略的核心。由于这波投资热潮,短短五年间从事深度学习的人数从几千人涨到数万人,研究进展也达到了惊人的速度,目前没有迹象表明这种趋势会在短期内放缓。

1.3.5 深度学习的大众化

Theano和TensorFlow是两个符号式的张量运算的Python框架,都支持自动求微分,这极大地简化了新模型的实现过程。Keras等用户友好型库则使深度学习变得像操纵乐高积木一样简单。

1.3.6 这种趋势会持续吗

深度学习有几个重要的性质,证明了它确实是人工智能的革命,并且能长盛不衰。20年后我们可能不再使用神经网络,但我们那时所使用的工具都是直接来自于现代深度学习及其核心概念。这些重要的性质可大致分为以下三类。

1.简单。深度学习不需要特征工程,它将复杂的、不稳定的、工程量很大的流程替换为简单的、端到端的可训练模型,这些模型通常只用到五六种不同的张量运算。

2.可扩展。深度学习非常适合在GPU或TPU上并行计算,因此可以充分利用摩尔定律。此外,深度学习模型通过对小批量数据进行迭代来进行,因此可以在任意大小的数据集上进行训练。(唯一的瓶颈是可用的并行计算能力,而由于摩尔定律,这一限制会越来越小)

3.多功能与可复用。与之前的许多机器学习方法不同,深度学习模型无须从头开始就可以在附加数据上进行训练,因此可用于连续在线学习,这对于大型生产模型而言是非常重要的特性。此外,训练好的深度学习模型可用于其他用途,因此是可以重复使用的。举个例子,可以将一个对图像分类进行训练的深度学习模型应用于视频处理流程。这样我们可以将以前的工作重新投入到日益复杂和强大的模型中,这也使得深度学习可以适用于较小的数据集。

《Python深度学习》读书笔记:第1章 什么是深度学习相关推荐

  1. python第三章上机实践_《机器学习Python实践》读书笔记-第三章

    <机器学习Python实践>,第三章,第一个机器学习项目 以往目录:橘猫吃不胖:<机器学习Python实践>读书笔记-第一章​zhuanlan.zhihu.com 书中介绍了一 ...

  2. Python Crash Course读书笔记 - 第19章:USER ACCOUNTS

    允许用户输入数据 目前用户数据Topic和Entry都是通过管理站点输入的,我们希望用户可以新增和编辑数据. 允许用户输入和提交数据的Web页面称为form,在Django中可使用ModelForm. ...

  3. Android深度探索读书笔记 第七章

    第七章主要介绍led驱动.1测试led驱动:测试之前需要用USB数据线连接s3c开发板,然后打开S3C开发板的电源开关,成功启动后,执行build..sh脚本文件编译和安装led驱动.2 创建led驱 ...

  4. Python Crash Course读书笔记 - 第18章:GETTING STARTED WITH DJANGO

    Django是一个web框架.可用来构建交互式网站. 设置项目 首先需要写项目说明书(spec). 然后需要创建虚拟环境(virtual environment). 虚拟环境是一个隔离的环境,可以单独 ...

  5. Python Crash Course读书笔记 - 第2章:Variables and Simple Data Types

    变量 文件hello_world.py中, .py是python文件的后缀,因此会用Python interpreter解析. $ cat hello_world.py print("Hel ...

  6. python基础教程读书笔记——第三章 字符串

    第三章 字符串 摘要: %s , $x , find()  , join() , split() , lower() , title() , strip() 1.字符串格式化 format = &qu ...

  7. Python Crash Course读书笔记 - 第16章:DOWNLOADING DATA

    本章首先探索在线公开数据源.然后介绍CSV和JSON格式数据的处理,并分别用Matplotlib和Plotly做可视化. CSV文件格式 CSV(comma-separated values)格式,正 ...

  8. Python Crash Course读书笔记 - 第15章:GENERATING DATA

    数据可视化是指通过可视化的手段探索数据,和数据分析紧密关联.通过代码来探索数据集的模式. 和显示酷炫的图片无关,而是让用户之前并不知道的数据含义和模式. Python被广泛应用于遗传学,气候研究,政治 ...

  9. Android深度探索读书笔记 第六章

    Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都存在/dev目录中.编写linux驱动程序的步骤:1建立linux驱动骨架:linux内核在使用驱动时首先需要装载驱动.在 ...

  10. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

最新文章

  1. dll文件是什么语言编写的_Win7系统当中libeay32.dll文件丢失的解决方法是什么?...
  2. php 动态网格,php-动态更改引导网格方向(从ltr到rtl或reverese)
  3. Behavior Trees
  4. 【图像】直方图均衡化
  5. wxWidgets:wxTreeListCtrl类用法
  6. 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
  7. Android开发之git提交代码到GitHub仓库教程
  8. 【OS】经典调度算法
  9. Visual Studio 2017新版发布,极大提高开发效率丨附下载 1
  10. java流程控制if_java程序流程控制(分支结构之 if-else)
  11. WEB测试—兼容测试
  12. 利用扭力仪来检测特小公斤数电批输出扭矩
  13. matlab命令窗口是什么,MATLAB命令窗口
  14. ActiveMQ的MQTT:WARN | Stealing link for clientId XXX From Connection Transport
  15. 百问网7天物联网智能家居(第七天)
  16. [转]多普达818、828+升级中文WM6.1及必装软件全过程讲解
  17. 编程与手绘的对比——静态篇
  18. pacman yaourt使用
  19. 每天半小时,一周带你手速大幅提升——几大打字练习网站测评
  20. 短信验证码常见漏洞总结

热门文章

  1. Java面试总结,Java实习面试经验汇总
  2. PHP之微信头像加水印
  3. 北京大学计算机学院,官宣首任院长
  4. mysql_slow_详解MySQL中SlowLog的实际配置
  5. 软件工程《构建之法》—概论
  6. Access转出到Mysql,咱自己动手丰衣足食.. -- 纯JS代码
  7. python array太慢_python - gdal ReadAsarray对于vrt非常慢 - 堆栈内存溢出
  8. Head FIrst OOAD 读书笔记
  9. 2019年IT行业就业形势
  10. 设计模式随笔系列:鸭子-策略模式(Strategy)[原]