tensorflow线性回归2.0线性回归求X值

tensorflow线性回归也是很多程序员耳熟能詳的机器学习框架了于2014年开源并且有着活跃的社区,前几天tensorflow线性回归开发者大会也宣布了tensorflow线性回归 for JS和Swift借着这个机会来写一写tensorflow线性回归嘚入门教程和机器学习入门需要用到的一些知识吧。这次从最基本的线性回归开始这篇文章将会对一个数据集进行线性回归并且计算出來表达式。

现行回归的思路并不难线性回归的核心思路就是将一堆数据使用线性的解析式来表达,也就是一次函数一次函数是每个人初中就学到的,y = k*x + b其中k是斜率,b是纵截距通过这个表达式,给一个x值都会有一个y值与之对应。在现实生活中的很多现象也可以使用这個模型表现在这里举一个例子,房屋的大小和价格假设我们拿到了一组房屋大小和价格的表,并且将它绘制出来

这时可以发现,价格和房屋大小是存在一个线性的关系通过拟合一条直线就可以推断任何房屋大小的价格。

根据给出点的坐标来拟合出一个直线,得到這个直线的解析式就是线性回归需要做的在这里为了方便理解,我将 y = k*x + b 重新写成 y = w * x + bw代表权重(weight),b代表偏差(bias)。那么输入一系列点,程序算出来weight囷bias就是这次的目的

首先是数据集的读取,我预先在excel上生成了一些点第一列代表横坐标,第二列代表纵坐标从绘制的散点图来看,这┅系列点完全程线性分布那我我将会对这些点进行线性回归。

首先使用numpy读取这个CSV文件并且将第一列和第二列存到两个数组里

运行程序xdata囷ydata被打印了出来

 

模型规定之后,开始训练之后tensorflow线性回归会不断地生成weight和bias但是weight和bias千千万,怎样能找到与数据集中的点最为匹配的呢在下媔一组图中,有三条曲线每一条曲线都有斜率和截距,从图中看第一条曲线是最匹配这些点的。不过怎么用数学方法来表示呢?这僦要引入平方损失了损失是一个数值,代表着对糟糕预测的惩罚

平方损失的公式就是 (y - y’)^ 2

更多的时候,会使用均方误差(MSE)来计算損失就是算出来所有样本点的平方误差再取平均数

 

那么既然算出来了损失,那么总得想办法降低损失吧在每次迭代的时候,通过传入嘚损失来对新预测的weight和bias进行调整这个过程听起来抽象,不过大家都玩过猜价格的游戏吧你猜一个东西的价格,我回答“高了”或者“低了”来对你进行反馈,你通过我的反馈来对新猜出的价格进行调整从而猜出正确的价格,这就是梯度下降法的核心思路

来画一个損失和权重的关系图,在所有权重范围(正无穷到负无穷)中损失和权重的关系程碗型,在最低点的时候损失最小在损失最小时候的對应权重即为合适的权重。下图从最左边的黄点来计算损失不停地向右推进,每次推进的大小称之为步长(Step)或者学习速率直到推进箌损失最小的点上。至于是向左推进还是向右推进这是通过计算函数的偏导数来判断的,感兴趣的同学可以去学习下大学的高等数学

 

運行后可以发现结果是收敛的,weight最终结果大概为0.4bias最终结果为2.999

其实这就是我一开始在Excel规定的表达式啦,证明线性回归起作用了tensorflow线性回归計算出了正确的W和B的值。

}

本文是笔者学习 tensorflow线性回归2.0(下文嘟写作 TF2.0) 的一篇笔记使用的教材是《动手深度学习》(TF2.0版)。

之所以可以使用 tensorflow线性回归 来实现线性回归是因为我们可以把线性回归看荿是只有一层、一个神经元的全连接网络:

上面这个图就是线性回归

要实现线性回归,我们需要

这些也是机器学习理论中的要点我们可鉯借本文来回顾一下。

要实现一个算法我们首先需要用矢量表达式来表示它,即:使用向量、矩阵来描述一个模型这样做的好处是:矢量批量计算要比循环一条条的计算每个样本来得快得多,线性回归的矢量表达式为:

n 表示 n 条样本 w 是模型的参数,它是一个 b 是偏差值咜是一个标量; y^? 是 n 条样本的预测值,它也是

该模型用 TF2.0 实现如下:

n×1 的向量n 表示对 n 个样本的 Loss 求平均,避免样本数量给 Loss 带来的影响因为 Loss 昰一个标量,所以上式还需要调整如下:

深度学习大多采用小批量随机梯度下降优化算法(minibatch Stochastic Gradient Descent)来迭代模型的参数该算法能节省内存空间,增加模型的迭代次数和加快模型的收敛速度

SGD 算法每次会随机的从样本中选取一部分数据,例如每次取 100 条然后计算这 100 条数据的 Loss,根据 Loss 求梯度再用梯度来更新当前的参数,所以这里包含 3 个步骤:

  1. 随机选择样本每次选 n 条
  2. 计算这 n 条样本的 Loss,并计算梯度使用梯度更新参数

先来看下随机选择样本的代码

接着,我们再来看下更新模型参数的代码:

计算梯度并更新模型参数

以上,关键代码就写完了下面我们紦它们们串起来:

 

上述代码是根据线性回归的原理一步步的实现的,步骤十分清晰但比较繁琐,实际上TF 提供了丰富的算法库供你调用,大大的提升了你的工作效率下面我们就用 TF 库中提供的方法来替换上述代码。

我们先用 keras 来定义一个只有 1 层的全连接网络结构这里参数嘟不需要你指定了:

设置优化策略为 SGD:

小批量随机获取数据集的代码如下:

可见,构建一个模型就是设置一些配置项不需要写任何逻辑,把上面代码合起来如下:

上面代码直接拷贝便可通过运行(依赖库还需要你自行安装下),初学的同学可以动手试试

本文通过 TF2.0 来实現了一个简单的线性回归模型,具体包括

  1. 按照定义模型、定义损失函数以及定义迭代算法这几个基本的步骤来实现一个广义的神经网络,麻雀虽小但五脏俱全
  2. 使用丰富的 TF2.0 组件来实现一个更精简的版本,旨在了解 TF2.0 的使用
}

tensorflow线性回归(TF)进行多个特征的线性回归和逻辑回归

之前文章的前提是:给定特征——任何房屋面积(sqm),我们需要预测结果也就是对应房价($)。为了做到这一点峩们:

  1. 我们找到一条「最拟合」所有数据点的直线(线性回归)。「最拟合」是当线性回归线确保实际数据点(灰色点)和预测值(内插茬直线上的灰色点)之间的差异最小即最小化多个蓝线之和。

  2. 使用这条直线我们可以预测任何房屋的价格。

使用单一特征线性回归进荇预测

实际上任何预测都依赖于多个特征,于是我们从单特征的线性回归进阶到 带有两个特征的线性回归;之所以选择两个特征是为叻让可视化和理解简明些,但这个思想可以推广到带有任何数量特征的线性回归

我们引进一个新的特征——房间数量。当收集数据点时现在我们需要在现有特征「房屋面积」之上收集新特征「房间数」的值,以及相应的结果「房屋价格」

我们的图表变成了 3 维的。

结果「房屋价格」以及 2 个特征(「房间数」「房屋面积」)的数据点空间

然后,我们的目标变成:给定「房间数」和「房屋面积」预测「房屋价格」(见下图)。

由于缺少数据点有时无法对给定的 2 个特征进行预测

在单一特征的情形中,当没有数据点时我们需要使用线性囙归来创建一条直线,以帮助我们预测结果房屋价格在 2 个特征的情形中,我们也可以使用线性回归但是需要创建一个平面(而不是直線),以帮助我们预测(见下图)

使用线性回归在 2 个特征空间中的创建一个平面来做预测

回忆单一特征的线性回归(见下图左边),线性回归模型结果为 y权重为 W,房屋大面积为 x偏差为 b。

对于 2 个特征的回归(参见下图右侧)我们引入另一个权重 W2,另一个自变量 x2 来代表房间数的特征值

单特征 vs. 2 个特征的线性回归方程

如之前讨论的那样,当我们执行线性回归时梯度下降算法能帮助学习系数 W、W2 和 b 的值。

单特征线性回归的 TF 代码由 3 部分组成(见下图):

  • 基于模型构建成本函数(红色部分)

  • 使用梯度下降(绿色部分)最小化成本函数

TF 代码中 2 个特征的线性回归方程(如上所述)的变化(相比单特征)用红色显示

注意,增加新特征的这种方式效率低;随着特征数量的增长所需的變量系数和自变量的数量会增加。实际的模型有更多的特征这恶化了这个问题。那么如何能有效地表示特征呢?

首先让我们将表征兩个特征的模型推广到表征 n 个特征的模型:

复杂的 n 特征公式可以用矩阵简化,矩阵被内置于 TF 中这是因为:

  • 数据可以用多维表示,这契合峩们表征具有 n 个特征的数据点(左下方也称为特征矩阵)以及具有 n 个权重模型(右下,也称为权重矩阵)的方式

单个数据点的 n 个特征与模型的矩阵形式的 n 个权重

在 TF 中它们将被写为:

注意:对于 W,我们使用 tf.zeros它将所有 W1,W2...,Wn 初始化为零

  • 在数学上,矩阵乘法是向量乘法的加总;因此自然地特征(中间的一个)和权重(右边的)矩阵之间的矩阵乘法给出(左边的)结果,即等于 n 个特征的线性回归公式的第┅部分(如上所述)没有截距项。

特征和权重矩阵之间的矩阵乘法给出结果(未添加截距项)

在 TF 中这种乘法将表示为:

  • 多行特征矩阵(每行表示数据点的 n 个特征)之间的矩阵乘法返回多行结果,每行代表每个数据点的结果/预测(没有加入截距项);因此一个矩阵乘法就鈳以将线性回归公式应用于多个数据点并对应地产生多个预测(每个数据点对应一个结果)(见下文)

注意:特征矩阵中的 x 表示变的更複杂,即我们使用 x1.1、x1.2而不是 x1、x2 等,因为特征矩阵(中间矩阵)从表示 n 个特征(1 行 xn 列)的单个数据点扩展到表示具有 n 个特征(m 行 x,n 列)嘚 m 个数据点因此,我们扩展 x <n>(如 x1)到 x <m >.<n>(如 x1.1)其中,n 是特征数m

具有模型权重的多行矩阵乘法产生矩阵的多个行结果

在 TF 中,它们将被写為:

  • 最后向结果矩阵添加常数,也就是将常数添加到矩阵中的每一行

在 TF 中用矩阵表示 x 和 W,无论模型的特征数量或要处理的数据点数量矩阵都可以简化为:

我们做一个从单一特征到多特征的线性回归的变化的并行比较:

tensorflow线性回归 中的单特征与 n 个特征的线性回归模型

在本攵中,我们介绍了多特征线性回归的概念并展示了我们如何将模型和 TF 代码从单特征的线性回归模型扩展到 2 个特征的线性回归模型,并可鉯推广到 n 特征线性回归模型最后我们为多特征的 TF 线性回归模型提供了一张备忘单。

我们已经学会了如何使用 tensorflow线性回归(TF)去实现线性回歸以预测标量值得结果例如给定一组特征,如住房大小预测房价。

然而有时我们需要对事物分类(classify)而不是去预测一个具体的数值,例如给定一张含有数字(0-9 十个数字中的一个)的图片我们需要将其分类为 0,12,34,56,78,9 十类或者,我们需要将一首歌曲进行歸类如归类为流行,摇滚说唱等。集合 [0,1,2...,9]、[流行摇滚,说唱等等] 中的每一个元素都可以表示一个类。在计算机中我们通常用數字对抽象名词进行表示,比如pop = 0, rock = 1, 等等。为了实现分类我们使用 TF 来实现逻辑回归。

在本文中我们将使用逻辑回归将数字图片归类为 0,12,34,56,78,9 这十类

线性回归中的许多概念仍然用于逻辑回归之中。我们可以再次使用公式 y = W.x + b但是有一些不同的地方。让我们看看線性回归和逻辑回归的公式:

线性回归与逻辑回归的区别与相似
  • 结果(y):对于线性回归结果是一个标量值(可以是任意一个符合实际嘚数值),例如 5000023.98 等;对于逻辑回归,结果是一个整数(表示不同类的整数是离散的),例如 0,1,2... 9。

  • 特征(x):对于线性回归特征都表礻为一个列向量;对于涉及二维图像的逻辑回归,特征是一个二维矩阵矩阵的每个元素表示图像的像素值,每个像素值是属于 0 到 255 之间的整数其中 0 表示黑色,255 表示白色其他值表示具有某些灰度阴影。

  • 成本函数(成本):对于线性回归成本函数是表示每个预测值与其预期结果之间的聚合差异的某些函数;对于逻辑回归,是计算每次预测的正确或错误的某些函数

  • 训练:线性回归和逻辑回归的训练目标都昰去学习权重(W)和偏置(b)值。

  • 结果:线性回归与逻辑回归的目标都是利用学习到的权重和偏置值去预测/分类结果

协调逻辑回归与线性回归

为了使逻辑回归利用 y = W.b + x,我们需要做出一些改变以协调上述差异

我们可以将二维的图片特征(假设二维特征有 X 行,Y 列)转换成一维嘚行向量:将第一行以外的其它行数值依顺序放在第一行后面

转换图像特征以适用于逻辑回归公式

对于逻辑回归,y 不能作为标量因为預测可能最终为 2.3 或 11,这不在可能的类 [0,1...,9] 中

为了解决这个问题,y 应该被转换成列向量该向量的每个元素代表逻辑回归模型认为属于某個特定类的得分。在下面的示例中预测结果为类'1',因为它具有最高得分

每个类的分数和具有最高分数的类成为被预测的类

对于给定的圖片,为求这个分数向量每个像素都会贡献一组分数(针对每一类),分数表示系统认为这张图片属于某类的可能性每个像素分数之囷成为预测向量。

每个像素提供一个分数向量;每个类别有一个分数最后变成预测向量。所有预测向量的总和变成最终预测

涉及到预測结果和实际结果之间数值距离的任何函数都不能作为成本函数。对于数字图片「1」这样的成本函数将使预测值「7」(7-1=6)更严重地惩罚預测值「2」(2-1=1),尽管两个预测结果都是错误的

我们即将使用的成本函数,交叉熵(H)用以下几个步骤实现:

1. 将实际图片的类向量(y')转化成 one-hot 向量,这是一个概率分布

2. 将预测类 (y) 转化成概率分布。

3. 使用交叉熵函数去计算成本函数这表示的是两个概率分布函数之间的差異。

由于我们已经将预测 (y) 转换成分数向量因此,我们也应该将实际图片类(y』)转换成相同维数的向量;one-hot 向量是将对应于实际类的的元素为设为 1其它元素为 0。下面我们展示表示 0-9 十个类中一个类的 one-hot 向量。

图片类和它们的 one-hot 向量表示
真实图片 one—hot 向量(顶)预测类别概率

第二步:用 softmax 实现概率分布

为了在数学上比较这两个「图」的相似性交叉熵是一个好方法。(这里是一个很棒但比较长的解释如果你对细节感兴趣的话。)

然而为了利用交叉熵,我们需要将实际结果向量(y')和预测结果向量(y)转换为「概率分布」「概率分布」意味着:

  • 烸个类的概率/分数值在 0-1 之间;

  • 所以类的概率/分数和必须是 1;

实际结果向量(y')如果是 one-hot 向量,满足了上述限制

为预测结果向量(y), 使用 softmax 将其转换为概率分布:

这个过程只需要简单的两步,预测向量(y)中的每个分量是 exp(y_i) 除以所有分量的 exp() 的和

注意:softmax(y)图形在形状上与 prediction (y) 相似,泹是仅仅有较大的最大值和较小的最小值

现在我们将预测向量分数概率分布(y')和实际向量分数概率分布 (y) 运用交叉熵。

交叉熵作为我们想最小化的成本函数

为了快速理解这个复杂的公式我们将其分为 3 部分(见下文)。注意本文中的符号,我们使用 y_i 表示 y 的第 i 个分量

交叉熵(H)公式可视为三个部分:红,蓝绿
  • 蓝:实际图像类(y')对应的 one-hot 图,参看 one-hot 向量部分:

  • 绿:每一图片类别 i其中,i = 0, 1, 2, …, 9, 红蓝部分相乘的結果

以下图例会进一步简化理解

蓝色制图只是真实图片类别(y')one-hot 向量。

每个预测向量元素y,转换成 -log(softmax(y)就得到红图:

预测类别向量(y)┅系列转换后,得到红图

交叉熵(H)这个绿色的部分是每个类别的蓝色值和红色值的乘积和,然后将它们做如下相加:

交叉熵是每个图潒类的蓝色值和红色值的乘积之和

由于这张蓝色图片对应一个 one-hot 向量,one-hot 向量仅仅有一个元素是 1它对应一个正确的图片类,交叉熵的其它所有元素乘积为 0交叉熵简化为:

有了三个转换后,现在我们就可以将用于线性回归的技术用于逻辑回归。下面的代码片段展示的是本系列文章第三部分线性回归代码和代码适用逻辑回归所需要的变化之间的对比

逻辑回归的目标是最小化交叉熵(H),这意味着我们只需偠最小化 -log(softmax(y_i)项;因为该项与 softmax(y_i)成反比所以我们实际上是最大化该项。

使用反向传播去最小化交叉熵 (H ) 将改变逻辑回归的权重 W 和偏置 b因此,每张图片的像素值将会给出对应图片类最高分数/概率!(最高分数/概率对应于正确的图片类)

将线性回归方法用于逻辑回归之中「total_class」是欲分类问题的总类数量,例如在上文手写数字体识别例子中,total_class=10

1. 将特征变换成一维特征;

2. 将预测结果向量、实际结果向量变化成 one-hot 姠量;

3. 将成本函数从平方误差函数变化到交叉熵。

线性回归对基于给定特征的预测(数值)是有帮助的逻辑回归根据输入特征实现分类昰有帮助的。

我们展示了如何调整线性回归 y = W.x + b 实现逻辑回归:(1)转换特征向量;2)转换预测/结果向量;(3)转换成本函数

当你掌握了 one-hot 向量,softmax交叉熵的知识,你就可以处理谷歌上针对「初学者」的图片分类问题

  • 针对初学者的图像识别的谷歌代码:

选自Medium()() 机器之心編译

}

我要回帖

更多关于 tensorflow线性回归 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信