第1章:面向深度学习

本章内容包括:

  • 机器学习及其与传统编程的区别
  • 机器学习无法解决的问题
  • 机器学习与人工智能的关系
  • 机器学习系统的结构
  • 机器学习学科

只要存在计算机,程序员就对人工智能(AI)感兴趣:在计算机上实现类似人的行为。长期以来,游戏一直是AI研究人员的热门话题。在个人计算机时代,人工智能在跳棋,西洋双陆棋,国际象棋以及几乎所有经典棋盘游戏方面都已经超过了人类。但是,数十年来,古老的战略游戏围棋仍然无法被攻克。然后到了2016年,Google DeepMind的AlphaGo 向14届世界围棋冠军李世石挑战,并在五场比赛中赢得四场。AlphaGo的下一个修订版完全是人类玩家无法企及的:它赢得了60连胜,战胜了此过程中所有著名的围棋玩家。

AlphaGo的突破在于通过机器学习增强了经典的AI算法。更具体地说,AlphaGo使用了称为深度学习的现代技术,这些算法可以将原始数据组织到有用的抽象层中。这些技术不限于游戏,您还将在用于识别图像,理解语音,翻译自然语言和引导机器人的应用程序中找到深度学习。掌握深度学习的基础将使您了解所有这些应用程序的工作方式。

为什么要写一整本有关计算机围棋的书?您可能会怀疑作者是疯了。但是,与国际象棋或西洋双陆棋相反,学习围棋的真正原因是强大的围棋AI需要深度学习。诸如Stockfish之类的顶级国际象棋引擎充满了国际象棋特定的逻辑。您需要一定程度的游戏知识才能编写类似的内容。通过深度学习,即使您不了解他们在做什么,您也可以教他们一台计算机来模仿强大的围棋选手。这是一项强大的技术,可在游戏和现实世界中应用到各种应用程序。

国际象棋和跳棋的AI的设计旨在比人类更长远和更准确地搜索盘面。将此技术应用于围棋有两个问题。首先,您无法搜索得太远,因为围棋中有太多落子位置需要考虑。其次,即使您可以搜索完全,您也不知道如何评估结果是否良好。事实证明,深度学习是解决这两个问题的关键。

本书通过介绍AlphaGo的使用技术,为深度学习提供了实用的介绍。您无需深入研究围棋游戏就可以做到这一点。相反,您将学习到机器学习方式的一般原理。本章将介绍了机器学习以及它可以解决与不能解决的各种问题。同时您将通过示例来学习到机器学习的主要分支,并了解深度学习如何将机器学习带入新的领域。

1.1. 什么是机器学习?

考虑一个识别朋友照片的任务。对于大多数人来说,即使照片的光线很暗,或者您的朋友理发或穿着新衬衫,这也毫不费力。但是假设您要通过编程让计算机执行相同的操作,你会从哪里开始?这是一种机器学习可以解决的问题。

传统上,计算机编程是将清晰的规则应用于结构化的数据。开发人员对计算机进行编程是对数据执行一组指令,然后得出所需的结果,如图1.1所示。试想一种税收形式:每个方框都有明确的定义,详细的规则可以指示如何进行各种计算。但是由于这些规则取决于您居住的地方,因此可能会极度复杂。人们在这个地方很容易犯错,但这恰恰是计算机程序擅长的任务。

图1.1 大多数软件开发人员都熟悉的标准编程范例。开发人员确定算法并执行代码;用户提供数据。

与传统编程范例相反,机器学习是用于从示例数据中推断程序或算法,而不是直接实现它的一系列技术。因此,通过机器学习,您仍然可以输入计算机数据,但是您不必提供指令和期望输出,而只需要提供期望输出,就能让机器自己找到算法。

要构建可以识别照片中是谁的计算机程序,可以应用一种算法,该算法可以分析朋友的大量图像并生成与之匹配的函数。如果正确执行此操作,则生成的功能还将匹配以前从未见过的新照片。当然,该程序将不了解其目的;它所能做的就是识别与您输入的原始图像相似的事物。

在这种情况下,您将调用提供机器训练数据的图像以及图像标签上的人名。在针对目的训练了算法之后,可以使用它来预测新数据上的标签以对其进行测试。图1.2在机器学习范例的架构旁边显示了此示例。

            图1.2  机器学习范例:在开发过程中,您从数据集生成算法,然后将其合并到最终应用程序中。

当规则不明确时,机器学习就会使用。它可以解决“看到就能知道是谁”的问题。您无需提供直接指示功能的数据,只需提供指示功能应执行操作的数据,然后有条不紊地生成与数据相匹配的功能。

在实践中,通常将机器学习与传统编程结合起来来构建有用的应用程序。对于我们的面部检测应用程序,您必须先指导计算机如何查找,加载和转换示例图像,然后才能应用机器学习算法。除此之外,您还可以使用手动启发式方法将从日落等艺术照片中找到大头照;然后您就可以应用机器学习将姓名放在脸上。通常,传统编程技术和高级机器学习算法的结合将优于其中任何一个。

1.1.1。 机器学习与AI有何关系?

从广义上讲,人工智能是指使计算机模仿人类行为的任何技术。人工智能包括多种技术,其中包括:

  • 逻辑生产系统,其应用形式逻辑来评估语句
  • 专家系统,程序员尝试将人类知识直接编码为软件
  • 模糊逻辑,定义算法以帮助计算机处理不精确的语句

这类基于规则的技术有时称为经典AI或GOFAI(老式AI)。

机器学习只是AI众多领域之一,但今天可以说是最成功的领域。特别是,深度学习的子领域是AI领域最激动人心的突破的背后,其中包括数十年来研究人员无法完成的任务。在经典AI中,研究人员将研究人类行为并尝试对与人类行为相匹配的规则进行编码。机器学习和深度学习使问题迎刃而解:现在,您收集人类行为的示例,并应用数学和统计技术来提取规则。

深度学习无处不在,社区中的某些人可以交替使用AI和深度学习。为了清楚起见,我们将使用AI来指代计算机模仿人类行为的一般问题,而机器学习或深度学习则指从数据中提取算法的一种技术。

1.1.2。 机器学习可以做什么和不能做什么

机器学习是一种专门技术。您不会使用机器学习来更新数据库记录或呈现用户界面。在以下情况下,首选传统编程:

  • 传统算法可以直接解决了这个问题 如果您可以直接编写代码来解决问题,那么它将更易于理解,维护,测试和调试。
  • 您期望可以完美准确 所有复杂的软件均包含错误。但是在传统的软件工程中,您希望系统地识别和修复错误。而机器学习并不总是能够做到这一点。您可以改善机器学习系统,但是过多地关注特定的错误通常会使整个系统变得更糟。
  • 简单的启发式方法效果很好 如果仅用几行代码就可以实现一个足够好的规则,那么请这样做。一个简单的启发式方法,易于实施,将易于理解和维护。机器学习实现的功能是不透明的,需要单独的培训过程才能更新。(另一方面,如果您要维护一个复杂的启发式序列,那么用机器学习替代它是一个很好的选择。)

通常,即使使用机器学习,在传统编程可行的问题与实际上无法解决的问题之间通常也有很好的界线。检测图像中的面部与标记名称中的面部只是我们所看到的一个示例。确定此类文本使用哪种语言以及将其翻译成给定语言就是另一个这样的例子。

当机器学习有所帮助的领域问题复杂性极高时,我们经常求助于传统编程。当面对高度复杂,信息密集的场景时,人们倾向于适应经验法则和叙述:思考宏观经济学,股市预测或政治。流程经理和所谓的专家通常可以从机器学习中获得的见识来增强他们的直觉,从而从中受益匪浅。通常,真实世界的数据具有比预期更多的结构,并且我们才刚刚开始在许多这些领域中收获自动化和增强的好处。

1.2。机器学习的例子

机器学习的目标是构建难以直接实现的功能。您可以通过选择模型(一大类泛型函数)来实现。然后,您需要一个过程来从该系列中选择与您的目标相匹配的功能;这个过程称为训练拟合模型。这里您将通过一个简单的示例进行学习。

假设您收集了一些人的身高和体重,并将这些值绘制在图表上。图1.3显示了从专业足球队花名册中提取的一些数据点。

图1.3  一个简单的示例数据集。图表上的每个点代表足球运动员的身高和体重。您的目标是使模型适合这些点。

假设您要用数学函数描述这些点。首先,请注意,这些点或多或少地沿直线向上和向右移动。如果您回想起高中代数,您可能还记得用fx)= ax + b形式的函数来描述直线。您可能会怀疑您能够找到ab的值,从而使ax + b接近您的数据点。ab的值是参数权重,这是您需要弄清楚。这同时也是您的模型。您可以使用Python代码编写任何函数去实现:

class GenericLinearFunction: def __init__(self, a, b):self.a = a self.b = b def evaluate(self, x): return self.a * x + self.b

您将如何找出ab的正确值?您可以使用严格的算法来执行此操作,但是对于一种快速又粗略的解决方案,您可以使用标尺在图形中画一条线,然后尝试计算其公式。图1.4显示了一条遵循数据集总体趋势的线。

      图1.4 首先您得注意到数据集大致遵循线性趋势,然后找到适合数据的特定线的公式。

如果您对直线经过的两个点进行观察,则可以计算直线的公式;您将得到类似fx)= 4.2 x – 137的信息。现在您有了一个与数据匹配的特定函数。如果您测量一个新人的身高,则可以使用公式来估算该人的体重,这样并非完全正确,但基本还说的过去。您可以使用GenericLinearFunction这个函数完成特定的功能:

class GenericLinearFunction: def __init__(self, a, b):self.a = a self.b = b def evaluate(self, x): return self.a * x + self.b
height_to_weight = GenericLinearFunction(a=4.2, b=­137)
height_of_new_person = 73
estimated_weight = height_to_weight.evaluate(height_of_new_person)

只要需要计算的那个人也是职业足球运动员,这应该是一个不错的估计。如果您数据集中的所有人都是成年男性,年龄范围相当狭窄,并且他们每天都在为同一运动训练,那这种估计同样适用。但如果您尝试将功能应用到女足球运动员,奥运会举重运动员或婴儿身上,则会得到非常不准确的结果。

这就是机器学习的基本过程。在这里,您的模型是所有看起来像f(x)= ax + b的函数的家族。实际上,即使简单的东西也是统计学家一直使用的有用模型。解决更复杂的问题时,将使用更复杂的模型和更先进的培训技术。但是核心思想是相同的:首先描述一大类可能的功能,然后从该系列中确定最佳功能。

Python和机器学习

本书中的所有代码示例都是用Python编写的。为什么是Python?首先,Python是用于一般应用程序开发的富有表现力的高级语言。此外,Python是用于机器学习和数学编程的最受欢迎的语言之一。这种结合使Python成为集成了机器学习的应用程序的自然选择。

Python因其惊人的数值计算软件包集合而在机器学习中很受欢迎。我们在本书中使用的软件包包括以下内容:

  • NumPy —该库提供了表示数值向量和数组的有效数据结构,以及快速数学运算的扩展库。NumPy是Python数值计算生态系统的基础:每个著名的机器学习或统计资料库都与NumPy集成在一起。
  • TensorFlow和Theano -这是两个曲线图的计算的库。它们使您可以指定复杂的数学运算序列,然后生成高度优化的实现。
  • Keras -这是深度学习的高级别库。它为您提供了指定神经网络的便捷方法,并依靠TensorFlow或Theano来处理原始计算。

我们在编写本书时考虑了Keras 2.2和TensorFlow 1.8的代码示例。您应该能够在改动最小的情况下使用2. x系列中的任何Keras版本。

1.2.1。 在软件应用程序中使用机器学习

在上一节中,您研究了纯数学模型。您如何将机器学习应用于实际的软件应用程序?

假设您正在使用照片共享应用程序,其中用户上传了数百万张带有标签的图片。您想添加一项功能,为新照片添加标签建议。实现此功能的理想选择就是机器学习。

首先,您必须具体说明您要学习的功能。假设您具有以下功能:

def suggest_tags(image_data): """推荐一张图片的标签.输入: 位图格式的图片数据返回: 推荐标签的排列序列 """

然后,其余工作就相对地简单。但是如何实现像suggest_tags这样的功能却不是很清晰,这就是机器学习的用武之地。

如果这是一个普通的Python函数,则希望它以某种Image对象作为输入,并可能返回字符串列表作为输出。机器学习算法的输入和输出不是那么灵活。他们通常处理向量和矩阵。因此,第一步,您需要以数学方式表示您的输入和输出。

如果将输入照片的大小调整为固定大小(例如128×128像素),则可以将其编码为具有128行和128列的矩阵:每个像素一个浮点值。那输出呢?一种选择是限制将要标识的标签集;您可以在应用程序中选择1,000个最受欢迎的标签。然后,输出可以是大小为1,000的向量,其中向量的每个元素对应于一个特定标签。如果允许输出值在0到1之间变化,则可以生成建议标签的排名列表。图1.5说明了应用程序中的概念与数学结构之间的这种映射。

图1.5。 机器学习算法在一些数学结构上进行,例如向量和矩阵。您的照片标签存储在标准的计算机数据结构中:一系列字符串。这是用于将该列表编码为数学向量的一种可能方案。

您刚刚执行的数据预处理步骤是每个机器学习系统不可或缺的一部分。通常,您以原始格式加载数据,并执行预处理步骤来创建功能 ,并输入那些可以输入到机器学习算法中的数据。

1.2.2  监督学习

接下来,您需要一种用于训练模型的算法。在这种情况下,您已经拥有数百万个正确的示例--------用户已上传的所有照片,并在您的应用程序中进行了手动标记。您可以尝试适用一个函数尽可能地去匹配这些示例,并且希望它能很好地匹配新照片。这项技术被称为监督学习,之所以称为监督学习,是因为人类提供的例子给培训过程做了指导。

培训完成后,您可以在应用程序中使用最终的学习功能。每当用户上传新照片时,您都将其传递给训练好的模型函数中并返回矢量,这样您可以将向量中的每个值都去匹配它代表的标签;然后您可以选择具有最大价值的标签,并将其显示给用户。从原理上讲,您刚才概述的过程可以如图1.6所示。

                                                              图1.6  用于监督学习的机器学习管道

那您如何测试训练有素的模型?标准做法是为此保留一些原始的标签数据。在开始训练之前,您可以预留一部分数据(例如10%)作为验证集。验证集以任何方式包含在训练数据中。然后,您可以将训练有素的模型应用于验证集中的图像,并将计算得到的标签与已知的正确标签进行比较。这使您可以计算模型的准确性。如果要试验不同的模型,则可以使用一致的度量标准来衡量哪个更好。

在游戏AI中,您可以从人类游戏记录中提取带有标签的训练数据。在线游戏是机器学习的巨大福音:当人们在线玩游戏时,游戏服务器可以保存计算机一些可读记录。如何将监督学习应用于游戏的示例如下:

1.2.3 无监督学习

与监督学习相比,机器学习的子领域称为“非监督学习”,没有任何标签来指导学习过程。在无监督学习中,该算法必须学习自己去寻找输入数据中的模式。与图1.6的唯一区别是您一开始缺少标签,因此无法像以前那样评估您的预测,而所有其他组件保持不变。

一个示例是异常值检测 -识别与数据集的总体趋势不匹配的数据点。在足球运动员数据集中,异常值将指示与队友的典型体格不匹配的运动员。例如,您可以想出一种算法,该算法可测量高度-宽度对到您所注视线的距离。如果数据点到平均线的距离超过一定距离,则将其声明为离群值。

在棋盘游戏AI中,自然要问的问题是棋盘上的哪些部分属于一起或组成一个小组。在下一章中,您将更详细地了解这对围棋游戏意味着什么。查找具有关系的片段组有时称为聚类分块。图1.7显示了国际象棋的外观示例。

                 图1.7.  一种无监督的机器学习管道,用于查找棋子的簇或块

1.2.4 强化学习

监督学习功能强大,但是找到高质量的训练数据可能会成为主要障碍。假设您要构建一个房屋清洁机器人。该机器人具有各种传感器,可以检测何时接近障碍物,以及可以让机器人在周围障碍物周围搜寻的电机。地面并向左或向右转向。您需要一个控制系统:可以分析传感器输入并决定应如何移动的功能,而这种情况是不可能进行监督学习的,因为您没有任何可以用作训练数据的示例-------您的机器人甚至还不存在。

相反,您可以应用强化学习(一种反复试验的方法)。您可以从效率低下或不准确的控制系统开始,然后让机器人尝试执行其任务。在任务期间,您记录控制系统看到的所有输入及其做出的决定。完成后,您需要一种方法来评估其效果,可能是通过计算其吸尘的地板比例以及电池的耗电程度。整个体验为您提供了一小部分训练数据,您可以使用它来改进控制系统。通过一遍又一遍地重复整个过程,您可以逐步使用有效的控制功能。图1.8将此过程显示为流程图。

这本书是由句子组成的,句子由单词组成,单词是字母组成的,而字母又由直线和曲线组成;最终,这些线和曲线是由微小的墨水点构成的。教孩子阅读时,您将从最小的部分开始并逐步提高:首先是字母,然后是单词,然后是句子,最后是完整的书。(通常,孩子们学会了自己识别直线和曲线。)这种层次结构是人们学习复杂概念的自然方式。在每个级别中,您都忽略了一些细节,使概念变得更加抽象。

深度学习将相同的思想应用于机器学习。深度学习是机器学习的一个子领域,它使用特定的模型家族:链接在一起的简单功能序列。这些功能链之所以称为神经网络,是因为它们受到自然大脑结构的松散启发。深度学习的核心思想是这些功能序列可以将复杂的概念解析为简单的层次结构。深度模型的第一层可以获取原始数据并以基本方式进行组织(例如,将点分组为线)。每个连续的层将前一层组织为更高级和更抽象的概念。学习这些抽象概念的过程称为表示学习

图1.9。 深度学习和表示学习

所有这些能力都是有代价的。深度模型有大量的权重需要学习。回忆一下您用于身高和体重数据集的简单ax + b模型;该模型只有两个方面需要学习。适合您的图像标记应用的深度模型可能具有一百万的权重。因此,深度学习需要更大的数据集,更多的计算能力以及更实际的培训方法。两种技术都有自己的位置。在以下情况下,深度学习是一个不错的选择:

  • 您的数据采用非结构化形式 图像,音频和书面语言这些领域是深度学习的不错选择,你可以将简单的模型应用于此类数据,但是通常需要复杂的预处理。
  • 您有大量可用数据或有计划获取更多数据 通常,模型越复杂,训练它所需的数据就越多。
  • 您有足够的计算能力或大量时间 深度模型涉及更多的训练和评估计算。

在以下情况下,您应该首选参数较少的传统模型:

  • 您具有结构化数据 如果您的输入看起来更像数据库记录,则通常可以直接应用简单模型。
  • 您需要一个描述性模型 使用简单的模型,您可以查看最终学习到的功能,并检查单个输入如何影响输出。这可以让您了解正在研究的真实系统如何工作。在较深的模型中,输入的特定部分与最终输出之间的连接是长且曲折的,并且很难去解释模型。

因为深度学习是指您使用的模型的类型,所以您可以将深度学习应用于任何主要的机器学习分支。例如,您可以使用深度模型或简单模型进行监督学习,具体取决于您拥有的训练数据的类型。

1.4 您将在这本书中学到什么

本书提供了有关深度学习和强化学习的实用介绍。为了充分利用这本书,您应该习惯阅读和编写Python代码,并熟悉线性代数和微积分。在这本书中,我们教导以下内容:

  • 如何使用Keras深度学习库设计、训练和测试神经网络
  • 如何设置监督式深度学习问题
  • 如何设置强化学习问题
  • 如何将深度学习与有用的应用程序集成

在整本书中,我们使用一个具体而有趣的示例:构建一个下围棋的AI。我们的围棋AI将深度学习与标准计算机算法结合在一起。我们将使用简单的Python来执行游戏规则,跟踪游戏状态,并展望可能的游戏序列。深度学习将帮助机器人确定哪些动作值得研究,并评估谁在游戏中领先。在每个阶段,您都可以与您的机器人对战,并在您应用更复杂的技术时看到它的进步。

如果您对围棋特别感兴趣,则可以使用将在书中构建的AI作为尝试的起点,将相同的技术应用于其他游戏。您还可以将深度学习支持的功能添加到游戏以外的其他应用程序中。

1.5 总结

  • 机器学习是用于从数据中生成函数而不是直接编写函数的一系列技术。您可以使用机器学习来解决过于模糊而无法直接解决的问题。
  • 机器学习通常涉及从选择模型 到数学函数的通用系列。接下来,您将训练模型-应用算法来找到该系列中的最佳功能。机器学习主要在于选择正确的模型并转换您的特定数据集以使用它。
  • 机器学习的三个主要领域是监督学习,无监督学习和强化学习。
  • 监督学习涉及从您已经知道是正确的示例中学习功能。当您拥有人类行为或知识的示例时,可以在计算机上应用监督学习来模仿它们。
  • 无监督学习涉及从数据中提取结构而不预先知道结构是什么。常见的应用程序是将数据集分成逻辑组。
  • 强化学习涉及通过反复试验来学习功能。如果您可以编写代码来评估程序达到目标的程度,则可以应用强化学习来在许多试验中逐步改进程序。
  • 深度学习是具有特定类型模型的机器学习,该模型在非结构化输入(例如图像或文字)上表现良好。它是当今计算机科学中最令人兴奋的领域之一。它正在不断扩展我们关于计算机可以做什么的想法。

翻译Deep Learning and the Game of Go(2)第1章:面向深度学习相关推荐

  1. Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)

    Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查(IEEE TPAMI 2020) 摘要 1. 引言 2. 背景 2.1 数据集 ...

  2. [论文翻译] Deep Learning

    [论文翻译] Deep Learning 论文题目:Deep Learning 论文来源:Deep learning Nature 2015 翻译人:BDML@CQUT实验室 Deep learnin ...

  3. [论文翻译]Deep Learning 翻译及阅读笔记

    论文题目:Deep Learning 论文来源:Deep Learning_2015_Nature 翻译人:BDML@CQUT实验室 Deep Learning Yann LeCun∗ Yoshua ...

  4. [论文翻译]Deep learning

    [论文翻译]Deep learning 论文题目:Deep Learning 论文来源:Deep Learning_2015_Nature 翻译人:BDML@CQUT实验室 Deep learning ...

  5. 文献翻译 Deep Learning

    该篇文章为18年图灵奖得主,被誉为"深度学习之父"的Lecun.Bengio.Hinton三位业界巨擘共同发表在Nature上的关于深度学习的综述,DOI:10.1038/natu ...

  6. introduction to deep learning--week1简单线性回归、梯度下降、模型正则化、和深度学习中的优化方法

    进阶课程需要一些基础知识: 1.机器学习基础知识 2.概率论知识 3.线性代数和微积分 4.python编程 我们需要知道的机器学习基础知识: 1.线性回归:均方误差(MSE).解析解 2.逻辑回归: ...

  7. 翻译Deep Learning and the Game of Go(10)第八章:部署你的AI

    本章包括: 构建一个端到端的应用程序来训练和运行一个围棋机器人 在前端运行来对抗你的机器人 让你的机器人在本地与其他机器人对抗. 部署到在线围棋服务器 到目前为止,你已经知道如何为围棋落子预测去构建和 ...

  8. 翻译Deep Learning and the Game of Go(10)第七章:从数据中学习:一个深度学习AI

    本章包括 下载和处理实际的围棋游戏记录 了解存储围棋游戏的标准格式 训练一个使用这样的数据进行落子预测的深度学习模型 运行自己的实验并评估它们 在前一章中,您看到了构建深度学习应用程序的许多基本要素, ...

  9. 翻译Deep Learning and the Game of Go(3)第2章:围棋是一个机器学习难题(规则部分就不翻了)

    本章涵盖 为什么游戏是AI的好项目? 为什么围棋是深度学习的难题? 围棋的规则是什么? 您可以通过机器学习解决游戏的哪些方面? 2.1 为什么要用游戏? 游戏是AI研究中最喜欢的主题,而不仅仅是因为它 ...

最新文章

  1. 分享Kali Linux 2017年第18周镜像文件
  2. 金融安全资讯精选 2017年第十六期:逐条解读现金贷整顿对P2P影响,工信部宣布1亿以上用户信息泄露为特大网络安全事件,太平保险集团信息安全主管的企业安全方法论...
  3. 一文搞懂 Java 泛型,非常详细!
  4. js封装函数_JavaScript基础-如何封装函数来改变元素的位置
  5. Java性能调优调查结果(第二部分)
  6. 高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx
  7. 安卓签名生成工具_ios app如何进行内测?ios app和安卓app的内测有何区别?
  8. 使用CLion构建Qt项目
  9. (133)FPGA面试题-Xilinx FPGA Block RAM的三种写模式是什么?
  10. 28 POSIX Threads
  11. SpringCloud工作笔记080---了解一下CXF
  12. Newtonsoft.Json基本使用
  13. JS实现FlyBird
  14. 哈工大同义词词林扩展版-资源分享
  15. 多线程,线程通信,线程池和Lambda表达式
  16. {转载}Circos绘图(1)
  17. 全程数字化的企业电子招标采购管理系统源码
  18. ie11加载项启用不了 java,IE11或IE10中的管理加载项按钮是灰色的不能用怎么办
  19. 湖北一公职人员泄露公民信息5万余条,非法获利23万余元
  20. 信息文档管理与配置管理

热门文章

  1. 029 高阶导数之sinx(n)、cosx(n)及Leibniz公式
  2. 搭建ftp服务器注意事项
  3. 图形图像显示研究(二)
  4. 类皮肤全属性凝胶电子皮肤
  5. c++ 资源回收学习
  6. 前端引入iconfont矢量图标详细步骤(图文)
  7. 数据分析+分类模型预测乳腺癌患病概率
  8. C语言实现扫雷小游戏(排雷时可展开)
  9. 一步一步的写自己的相册
  10. js中html网页打开中文乱码