《深度学习入门》—— 学习笔记(一)_1-4章

第一章 Python入门

第二章 感知机(Perception)

2.1 感知机是什么

感知机接收多个输入信号,输出一个信号。x1, x2 是输入信号;w1, w2 是权重;y是输出信号。

感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。权重相当于电流里所说的电阻。电阻是决定电流流动难度的参数,电阻越低,通过的电流就越大。而感知机的权重则是值越大,通过的信号就越大。不管是电阻还是权重,在控制信号流动难度(或者流动容易度)这一点上的作用都是一样的。

2.2 简单逻辑电路

与门(AND gate)| 与非门(NAND gate)| 或门(OR Gate)
只要把实现与门的参数值的符号取反,就可以实现与非门。

使用感知机可以表示与门、与非门、或门的逻辑电路。与门、与非门、或门的感知机构造是一样的。 相同构造的感知机,只需通过适当地调整参数的值,就可以像“变色龙演员”表演不同的角色一样,变身为与门、与非门、或门。

2.3 感知机的实现

2.3.1 简单的实现

2.3.2 导入权重和偏置

在(2.1)中,θ = -b得到(2.2),b称为偏置,w1和w2称为权重。

偏置b和权重w1、w2的作用是不一样的:w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。比如,若b为−0.1,则只要输入信号的加权总和超过0.1,神经元就会被激活。但是如果b
为−20.0,则输入信号的加权总和必须超过20.0,神经元才会被激活。像这样,偏置的值决定了神经元被激活的容易程度。另外,这里我们将w1和w2称为权重,将b称为偏置,但是根据上下文,有时也会将b、w1、w2这些参数统称为权重。

2.3.3 使用权重和偏置的实现

与门

与非门

或门

2.4 感知机的局限性

对于异或门,感知机无法用一条直线把输出为0和1的点分开。

曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。感知机的局限性就在于它只能表示由一条直线分割的空间。

2.4节讲到的感知机的局限性,严格地讲,应该是“单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间”。接下来,我们将看到通过组合感知机(叠加层)就可以实现异或门。

2.5 多层感知机

实现异或门

与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。

(1) 第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
(2) 第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y。
通过叠加层(加深层),感知机能进行更加灵活的表示。

2.6 从与非门到计算机

使用感知机也可以表示计算机:如果通过组合与非门可以实现计算机的话,那么通过组合感知机也可以表示计算机(感知机的组合可以通过叠加了多层的单层感知机来表示)。

2.7 小结

第三章 神经网络

感知机可以表示复杂函数,但设定合适、符合预期的输入输出权重需要人工进行。神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。

3.1 从感知机到神经网络

神经网络:输入层 - 中间层(隐藏层)- 输出层

b是被称为偏置的参数,用于控制神经元被激活的容易程度;而w1和w2是表示各个信号的权重的参数,用于控制各个信号的重要性。

函数改写:



h(x) 称为i而激活函数,激活函数的作用在于决定如何来激活输入信号的总和。

详细写(3.2):


其中,表示神经元的○中明确显示了激活函数的计算过程,即信号的加权总和为节点a,然后节点a被激活函数h()转换成节点y。

3.2 激活函数

感知机使用阶跃函数作为激活函数。

3.2.1 sigmoid函数


实现+绘图:



阶跃函数和sigmoid函数比较:
不同点1 - 平滑性不同,sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义。
不同点2 - 相对于阶跃函数只能返回0或1,sigmoid函数可以返回实数(平滑性),即感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。
共同点1 - 输入小时,输出接近0(为0);随着输入增大,输出向1靠近(变成1),即当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。
共同点2 - 不管输入信号有多小,或者有多大,输出信号的值都在0到1之间。
共同点3 - 阶跃函数和sigmoid函数还有其他共同点,就是两者均为非线性函数。

神经网络的激活函数必须使用非线性函数:
线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。考虑把线性函数 h(x) = cx 作为激活函数,把y(x) = h(h(h(x)))的运算对应3层神经网络。这个运算会进行y(x) = c × c × c × x的乘法运算,但是同样的处理可以由y(x) = ax(a = c 3)这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥叠加层所带来的优势,激活函数必须使用非线性函数。

3.2.2 ReLU(Rectified Linear Unit)函数



3.3 多维数组的运算

数组的维数可以通过np.dim()函数获得。数组的形状可以通过实例变量shape获得。第一个维度对应第0维,第二个维度对应第1维(Python的索引从0开始)。二维数组也称为矩阵(matrix).数组的横向排列称为行(row),纵向排列称为列(column)。
np.dot()接收两个NumPy数组作为参数,并返回数组的乘积。矩阵的乘积运算中,操作数(A,B)的顺序不同,结果也会不同。A的列数=B的行数。

3.4 3层神经网络的实现

3.4.1 权重的符号

3.4.2 各层间信号传递的实现



NumPy多维数组实现:






其中,定义identity_function()函数(也称为“恒等函数”),并将其作为输出层的激活函数。这里这样实现只是为了和之前的流程保持统一。

输出层的激活函数用σ()表示,不同于隐藏层的激活函数h()(σ读作sigma)。

输出层所用的激活函数,要根据求解问题的性质决定。一般地,回归问题可以使用恒等函数,二元分类问题可以使用 sigmoid函数,多元分类问题可以使用 softmax函数。

这里定义了init_network()和forward()函数。init_network()函数会进行权重和偏置的初始化,并将它们保存在字典变量network中。这个字典变量network中保存了每一层所需的参数(权重和偏置)。forward()函数中则封装了将输入信号转换为输出信号的处理过程。forward(前向)一词,它表示的是从输入到输出方向的传递处理。

3.5 输出层的设计

神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般,回归问题 - 恒等函数,分类问题 - softmax函数。

机器学习的问题大致可以分为分类问题和回归问题。分类问题是数据属于哪一个类别的问题。比如,区分图像中的人是男性还是女性的问题就是分类问题。而回归问题是根据某个输入预测一个(连续的)数值的问题。比如,根据一个人的图像预测这个人的体重的问题就是回归问题(类似“57.4kg”这样的预测)。

3.5.1 恒等函数和softmax函数

(1)回归问题 - 恒等函数:恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动地直接输出。

(2)分类问题 - softmax函数

其中,(3.10)表示假设输出层共有n个神经元,计算第k个神经元的输出yk。softmax函数的分子是输入信号ak的指数函数,分母是所有输入信号的指数函数的和。

3.5.2 实现 softmax函数时的注意事项

softmax函数的计算可能出现溢出问题。可以进行改进:

说明在进行softmax的指数函数的运算时,加或减某个常数并不会改变运算结果。为防止溢出,一般使用输入信号中的最大值。

3.5.3 softmax函数的特征

(1)softmax函数的输出是0.0到1.0之间的实数。
(2)softmax函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。

注意:即便使用了softmax函数,各个元素之间的大小关系也不会改变。因为指数函数是单调递增函数。a的各元素的大小关系和y的各元素的大小关系并没有改变。比如,a的最大值是第2个元素,y的最大值也仍是第2个元素。

一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。并且,即便使用softmax函数,输出值最大的神经元的位置也不会变。因此,神经网络在进行分类时,输出层的softmax函数可以省略。在实际的问题中,由于指数函数的运算需要一定的计算机运算量,因此输出层的softmax函数一般会被省略。

3.5.4 输出层的神经元数量

输出层的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。

3.6 手写数字识别

先实现神经网络的“推理处理”。这个推理处理也称为神经网络的前向传播(forward propagation)。

3.6.1 MNIST数据集

MNIST数据集是由0到9的数字图像构成的(图3-24)。训练图像有6万张,测试图像有1万张,这些图像可以用于学习和推理。MNIST数据集的一般使用方法是,先用训练图像进行学习,再用学习到的模型度量能在多大程度上对测试图像进行正确的分类。

MNIST的图像数据是28像素 × 28像素的灰度图像(1通道),各个像素的取值在0到255之间。每个图像数据都相应地标有“7”“2”“1”等标签。

<神经网络的推理处理>
把数据限定到某个范围内的处理称为正规化(normalization)。对神经网络的输入数据进行某种既定的转换称为预处理(pre-processing)。除此之外,还有将数据整体的分布形状均匀化的方法,即数据白化(whitening)等。

<批处理>
打包式的输入数据称为批(batch)。批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时间。

3.7 小结

本章介绍了神经网络的前向传播。本章介绍的神经网络和上一章的感知机在信号的按层传递这一点上是相同的,但是,向下一个神经元发送信号时,改变信号的激活函数有很大差异。神经网络中使用的是平滑变化的sigmoid函数,而感知机中使用的是信号急剧变化的阶跃函数。

第四章 神经网络的学习

神经网络的学习 - 从训练数据中自动获取最优权重参数的过程。学习的目的就是以损失函数为基准,找出能使它的值达到最小的权重参数。

4.1 从数据中学习

神经网络的特征就是可以从数据中学习,即可以由数据自动决定权重参数的值。

4.1.1 数据驱动


深度学习有时也称为端到端机器学习(end-to-end machine learning)。这里所说的端到端是指从一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。神经网络的优点是对所有的问题都可以用同样的流程来解决。与待处理的问题无关,神经网络可以将数据直接作为原始数据,进行“端对端”的学习。

4.1.2 训练数据和测试数据

机器学习中,为了追求模型的泛化能力,一般将数据分为训练数据测试数据两部分来进行学习和实验等。首先,使用训练数据进行学习,寻找最优的参数;然后,使用测试数据评价训练得到的模型的实际能力。为了正确评价模型的泛化能力,就必须划分训练数据和测试数据。另外,训练数据也可以称为监督数据。泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力。获得泛化能力是机器学习的最终目标。

只对某个数据集过度拟合的状态称为过拟合(over fitting)。避免过拟合也是机器学习的一个重要课题。

4.2 损失函数

神经网络以某个指标为线索寻找最优权重参数,所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。

损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。以“性能的恶劣程度”为指标可能会使人感到不太自然,但是如果给损失函数乘上一个负值,就可以解释为“在多大程度上不坏”,即“性能有多好”。并且,“使性能的恶劣程度达到最小”和“使性能的优良程度达到最大”是等价的,不管是用“恶劣程度”还是“优良程度”,做的事情本质上都是一样的。

4.2.1 均方误差(mean squared error)

yk是表示神经网络的输出,tk表示监督数据,k表示数据的维数。

t是监督数据,将正确解标签设为1,其他均设为0。将正确解标签表示为1,其他标签表示为0的表示方法称为one-hot表示。损失函数的值更小,则输出结果与监督数据之间的误差更小,说明输出结果和监督数据更加吻合。

4.2.2 交叉熵误差

log表示以e为底数的自然对数(log e)。yk是神经网络的输出,tk是正确解标签。并且,tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。交叉熵误差的值是由正确解标签所对应的输出结果决定的。


x等于1时,y为0;随着x向0靠近,y逐渐变小。因此,正确解标签对应的输出越大,式(4.2)的值越接近0;当输出为1时,交叉熵误差为0。此外,如果正确解标签对应的输出较小,则式(4.2)的值较大。

函数内部在计算np.log时,加上了一个微小值delta,可以防止负无限大的发生。

4.2.3 mini-batch学习

机器学习使用训练数据进行学习。使用训练数据进行学习,严格来说,就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。因此,计算损失函数时必须将所有的训练数据作为对象。

如果要求所有训练数据的损失函数的总和,以交叉熵误差为例,可以写成下面的式(4.3)。

假设数据有N个,tnk表示第n个数据的第k个元素的值(ynk是神经网络的输出,tnk是监督数据)。通过除以N,可以求单个数据的“平均损失函数”。通过这样的平均化,可以获得和训练数据的数量无关的统一指标。

如果遇到大数据,数据量会有几百万、几千万之多,这种情况下以全部数据为对象计算损失函数是不现实的。因此,我们从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小
批量),然后对每个mini-batch进行学习。用随机选择的小批量数据(mini-batch)作为全体训练数据的近似值。[NumPy的np.random.choice()]

4.2.4 mini-batch版交叉熵误差的实现


4.2.5 为何要设定损失函数

在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是梯度),然后以这个导数为指引,逐步更新参数的值。

在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0。识别精度对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续地、突然地变化。作为激活函数的阶跃函数也有同样的情况。出于相同的原因,如果使用阶跃函数作为激活函数,神经网络的学习将无法进行。

4.3 数值微分

4.3.1 导数

式(4.4)表示的是函数的导数。左边的符号表示关于x的导数,即f(x)相对于x的变化程度。式(4.4)表示的导数的含义是,x的“微小变化”将导致函数f(x)的值在多大程度上发生变化。其中,表示微小变化的h无限趋近0。


利用微小的差分求导数的过程称为数值微分(numerical differentiation)。而基于数学式的推导求导数的过程,则用“解析性”(analytic)一词,称为“解析性求解”或者“解析性求导”。解析性求导得到的导数是不含误差的“真的导数”。

4.3.2 偏导数

有多个变量的函数的导数称为偏导数。偏导数和单变量的导数一样,都是求某个地方的斜率。不过,偏导数需要将多个变量中的某一个变量定为目标变量,并将其他变量固定为某个值。为了将目标变量以外的变量固定到某些特定的值上,可以先定义新函数。然后,对新定义的函数应用了之前的求数值微分的函数,得到偏导数。

4.4 梯度

由全部变量的偏导数汇总而成的向量称为梯度(gradient)。梯度指示的方向是各点处的函数值减小最多的方向。

【补充】
方向导数:在函数定义域的内点对某一方向求导得到的导数。包括沿直线方向和沿曲线方向。所有的下降方向中,梯度方向下降最多。

4.1.1 梯度法

机器学习的主要任务是在学习时寻找最优参数。同样,神经网络也必须在学习时找到最优参数(权重和偏置)。这里的最优参数是指损失函数取最小时的参数。但是,一般而言,损失函数很复杂,参数空间庞大,我们不知道它在何处能取得最小值。而通过巧妙地使用梯度来寻找函数最小值(或者尽可能小的值)的方法就是梯度法。

梯度表示的是各点处的函数值减小最多的方向。因此,无法保证梯度所指的方向就是函数的最小值或者真正应该前进的方向。实际上,在复杂的函数中,梯度指示的方向基本上都不是函数值最小处。

函数的极小值、最小值以及被称为鞍点(saddle point)的地方,梯度为 0。极小值是局部最小值,也就是限定在某个范围内的最小值。鞍点是从某个方向上看是极大值,从另一个方向上看则是极小值的点。虽然梯度法是要寻找梯度为 0的地方,但是那个地方不一定就是最小值(也有可能是极小值或者鞍点)。此外,当函数很复杂且呈扁平状时,学习可能会进入一个(几乎)平坦的地区,陷入被称为“学习高原”的无法前进的停滞期。

虽然梯度的方向并不一定指向最小值,但沿着它的方向能够最大限度地减小函数的值。因此,在寻找函数的最小值(或者尽可能小的值)的位置的任务中,要以梯度的信息为线索,决定前进的方向。

【梯度法】
在梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后在新的地方重新求梯度,再沿着新梯度方向前进,
如此反复,不断地沿梯度方向前进。像这样,通过不断地沿梯度方向前进,逐渐减小函数值的过程就是梯度法(gradient method)。梯度法是解决机器学习中最优化问题的常用方法,特别是在神经网络的学习中经常被使用。根据目的是寻找最小值还是最大值,梯度法的叫法有所不同。严格地讲,寻找最小值的梯度法称为梯度下降法(gradient descent method),
寻找最大值的梯度法称为梯度上升法(gradient ascent method)。但是通过反转损失函数的符号,求最小值的问题和求最大值的问题会变成相同的问题,因此“下降”还是“上升”的差异本质上并不重要。一般来说,神经网络(深度学习)中,梯度法主要是指梯度下降法。

【梯度法的数学式表示】
η表示更新量,在神经网络的学习中,称为学习率(learning rate)。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。式(4.7)是表示更新一次的式子,这个步骤会反复执行。也就是说,每一步都按式(4.7)更新变量的值,通过反复执行此步骤,逐渐减小函数值。

Python实现:

参数f是要进行最优化的函数,init_x是初始值,lr是学习率learning rate,step_num是梯度法的重复次数。numerical_gradient(f,x)会求函数的梯度,用该梯度乘以学习率得到的值进行更新操作,由step_num指定重复的
次数。

学习率过大或者过小都无法得到好的结果。学习率过大->发散成一个很大的值;学习率过小->没怎么更新就结束了。

像学习率这样的参数称为超参数。这是一种和神经网络的参数(权重和偏置)性质不同的参数。相对于神经网络的权重参数是通过训练数据和学习算法自动获得的,学习率这样的超参数则是人工设定的。一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。

4.4.2 神经网络的梯度

神经网络的学习也要求梯度。这里所说的梯度是指损失函数关于权重参数的梯度。权重W的神经网络,损失函数为L。表示当w稍微变化时,损失函数L会发生多大变化。

4.5 学习算法的实现

神经网络的学习步骤:
前提 - 神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习分成下面4个步骤。
步骤1(mini-batch) - 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤2(计算梯度) - 为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤3(更新参数) - 将权重参数沿梯度方向进行微小更新。
步骤4(重复) - 重复步骤1、步骤2、步骤3。

因为这里使用的数据是随机选择的mini batch数据,所以又称为随机梯度下降法(stochastic gradient descent)。“随机”指的是“随机选择的”的意思,因此,随机梯度下降法是“对随机选择的数据进行的梯度下降法”。深度学习的很多框架中,随机梯度下降法一般由一个名为SGD的函数来实现。SGD来源于随机梯度下降法的英文名称的首字母。

【基于测试数据的评价】
神经网络的学习中,必须确认是否能够正确识别训练数据以外的其他数据,即确认是否会发生过拟合。过拟合是指,虽然训练数据中的数字图像能被正确辨别,但是不在训练数据中的数字图像却无法被识别的现象。神经网络学习的最初目标是掌握泛化能力,因此,要评价神经网络的泛化能力,就必须使用不包含在训练数据中的数据。

epoch是一个单位。一个 epoch表示学习中所有训练数据均被使用过一次时的更新次数。1000笔训练数据,用大小为100笔数据的mini-batch进行学习,重复随机梯度下降法100次,epoch = 100.

使用训练数据和测试数据评价的识别精度基本没有差异 -> 可以说明本次学习没有过拟合

4.6 小结

【《深度学习入门》—— 学习笔记(一)】相关推荐

  1. 【web编程技术学习笔记】因特网与万维网简介

    目录 Client客户端 Server服务器端 TCP/IP五层协议 IP 查看IP地址的的两种方法 TCP URL 样式一 样式二 DNS URL&DNS HTTP 与因特网有关的组织 IE ...

  2. 程序员编程技术学习笔记

    程序员编程技术学习笔记     看july的博客也有好久了,一直没能好好整理一下自己的学习笔记,开了博客之后更加愿意好好整理一番了.其中不免有些内容在july那里可以找到原文,但是更多的加入了我个人的 ...

  3. JAVA 网络编程技术学习笔记

    目录 一.网络编程基本概念(了解) 1.1 计算机网络 1.2 网络通信协议 1.2.1什么是网络通信协议 1.2.2 OSI七层协议模型 1.2.3网络协议的分层 1.3数据的封装和解封 1.4 I ...

  4. 《ASP.NET MVC4 WEB编程》学习笔记------Web API 续

    目录 ASP.NET WEB API的出现缘由 ASP.NET WEB API的强大功能 ASP.NET WEB API的出现缘由 随着UI AJAX 请求适量的增加,ASP.NET MVC基于Jso ...

  5. java网络编程技术学习笔记(b站【狂神说Java】网络编程实战讲解)

    b站视频链接:[狂神说Java]网络编程实战讲解 文章目录 网络编程 1.1.概述 1.2.网络通信的要素 1.3.IP 1.4.端口 1.5.通信协议 1.6.TCP 文件发送 1.7.UDP 1. ...

  6. SpringBoot整合第三方技术学习笔记(自用)

    SpringBoot整合第三方技术学习笔记 搬运黑马视频配套笔记 KF-4.数据层解决方案 KF-4-1.SQL 回忆一下之前做SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与My ...

  7. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  8. ssm 转发请求_千呼万唤!阿里内部终于把这份SSM框架技术学习笔记分享出来了...

    SSM SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项 ...

  9. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

  10. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

最新文章

  1. 数学中的span以及线性流形是什么意思
  2. opengles2.0 帧缓存对象(FBO)
  3. 用户和用户组的简单总结
  4. version `ZLIB_1.2.3.4' not found 解决方法
  5. 科技行业风投日趋谨慎:VR、机器学习和汽车值得关注
  6. android百分比扩展枯,Android 增强版百分比布局库 为了适配而扩展
  7. ds1302典型应用原理图_不同类型的光纤激光器,在工业中有哪些典型应用
  8. 在openGauss上做开发?这个大赛拿出30万寻找开源的你
  9. 我的联想C467鲁大师检查配置
  10. 用turtle库画五角星
  11. MySQL的Binlog与Redolog
  12. hdu 3065 病毒侵袭持续中
  13. 如何分析个股基本面_个股分析报告要分析哪些方面?股票基本面分析实例
  14. 面向能源互联网的多端口DC/DC能源路由器控制策略研究
  15. python直方图规定化_数字图像处理-空间域处理-直方图规定化
  16. 利用netstat查看http为短连接还是长连接?
  17. cocos2d-x游戏开发 《坠入蔚蓝》
  18. Allegro PCB操作技巧
  19. String Shifting
  20. 《Python数据可视化之Matplotlib与Pyecharts》之K线图

热门文章

  1. 嵌入式开发日记(9)——多线程与socket通信
  2. Java实现回文数四种方法
  3. 阿里Java岗P5-P7成长笔记【3283页PDF文档免费领】
  4. 关于求矩阵主对角线元素之和及副对角线元素之和的问题
  5. d-ary heaps 多叉树堆排序C++实现
  6. ECMAScript 2015 ES6
  7. jupyter notebook 代码自动补全、代码高亮
  8. 一些学习经验总结(个人随笔)
  9. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)
  10. 使用html+css实现一个静态页面(含源码)