TensorFlow 二之建立模型

(张老师PPT学习笔记)

一、在TensorFlow 中建立模型

1.TensorFlow 中的线性模型

  • 占位符(Placeholder):表示执行梯度下降时将实际数据值输入到模型中的一个入口点。例如房子面积  (x) 和房价 (y_)。

  • 变量(Variable):表示我们试图寻找的能够使成本函数降到最小值的变量,例如 W 和 b。

  • 在TF中表示线性模型 (y = W.x + b) :

2.TensorFlow 中的成本函数

  • 与将数据点的实际房价 (y_) 输入模型类似,首先创建一个占位符。

  • 成本函数:

3.数据:房价(y_) 和房子面积 (x) 的实际数据点

4.梯度下降

有了线性模型、成本函数和数据,我们就可以开始执行梯度下降从而最小化代价函数,以获得 W、b 的「good」值。

0.00001 是我们每次进行训练时在最陡的梯度方向上所采取的步长;它也被称作学习率(learning rate)。

二、训练模型

  • 1.变量初始化

  • 2.TensorFlow 会话

训练包含以预先确定好的次数执行梯度下降,或者是直到成本函数低于某个预先确定的临界值为止

所有变量都需要在训练开始时进行初始化,否则它们可能会带有之前执行过程中的残余值。

TensorFlow 是在一个会话中进行;创建一个会话 (sess) 然后使用 sess.run() 去执行。

  • 在一个循环中调用 withinsess.run() 来执行上面的 train_step。

你需要将由 x, y_ 所组成的实际数据输入再提供给输入,因为 TensorFlow 将 train_step 分解为它的从属项:

结果

简单小结

  • 实例:从一个单一特征预测结果。
  • 我们选择了一个线性模型来拟合数据点,定义一个成本函数来表示最佳拟合,并使用梯度下降法反复调整参数W 和b 来训练我们的模型,使成本函数降到最小。

我们有一些房屋面积和房价的数据(灰色点)

我们使用线性回归对这些数据进行了建模(红色虚线)

我们通过训练该线性回归模型的 W(权重)和 b(偏置)找到了最小化「成本」(竖直蓝色实线的长度总和,这些蓝线代表了预测和实际输出之间的差异)的「最好」模型

给定任意房屋面积,我们可以使用该线性模型预测房价(带箭头的蓝色虚线)

三、模型的训练过程 training

我们的线性模型和成本函数[A]可以表示成下面的 TensorFlow 图:

接下来,我们选择一个数据点 (x, y_) [C],然后将其送入[D] TensorFlow 图,从而得到预测 y 和相应的成本。

之后,为了得到更好的 W 和 b,我们使用TensorFlow 的 tf.train.GradientDescentOptimizer [B]执行梯度下降以降低成本。用非技术的术语来说:给定当前成本,并基于成本岁其它变量(即 W 和 b)的变化方式,优化器(optimizer)将对 W 和 b 执行一些小调整(递增或递减)以使我们的预测更好地契合那个单个数据点。

这就是一个循环周期,称为epoch。

在下一训练 epoch 中,重复这些步骤,但使用一个不同的数据点!

四、Epoch与随机、mini-batch、batch梯度下降

  • 在每个 epoch 送入单个数据点,这被称为随机梯度下降(stochastic gradient descent)
  • 也可以在每个 epoch 送入一堆数据点,这被称为 mini-batch 梯度下降
  • 或者甚至在一个 epoch 一次性送入所有的数据点,这被称为 batch 梯度下降

四、学习率 learning rate

  • 学习率(learn rate)是指梯度下降调整 W 和 b 递增或递减的速度。
    • 学习率较小时,处理过程会更慢,但肯定能得到更小成本;
    • 而当学习率更大时,可以更快地得到最小成本,但也有“冲过头” 的风险,导致没法找到最小成本。
    • 克服这一问题,可以开始时使用较大的学习率(假设开始时的成本离最小成本还很远),然后随每个 epoch 而逐渐降低学习率。

五、继续回到房价预测问题——多特征的房价预测问题

引进一个新的特征——房间数量

  • 目标变成:给定房间数和房屋面积,预测房屋价格。

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

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

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

解决方法:矩阵 matrix

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

  • 复杂的 n 特征公式可以用矩阵简化成:
  • 单个数据点的 n 个特征与模型的矩阵形式的 n 个权重

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

比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,那么我们需要先导入必要的库,包括TensorFlow和NumPy等: ```python import tensorflow as tf import numpy as np import pandas as pd import matplotlib.pyplot as plt ``` 接下来,我们需要读入数据集。假设数据集文件的路径为`./boston_house_prices.csv`,那么可以使用如下代码读入数据: ```python data = pd.read_csv('./boston_house_prices.csv') ``` 接下来,我们需要对数据集进行预处理,包括数据清洗、特征选择、特征缩放等。在此处,我们选择使用所有的特征,并对每个特征进行最小-最大缩放。具体实现如下: ```python # 选择所有特征作为输入 x_data = data.iloc[:, :-1].values # 对每个特征进行最小-最大缩放 x_min = np.min(x_data, axis=0) x_max = np.max(x_data, axis=0) x_data = (x_data - x_min) / (x_max - x_min) # 选择房价作为输出 y_data = data.iloc[:, -1].values.reshape(-1, 1) # 对房价进行最小-最大缩放 y_min = np.min(y_data, axis=0) y_max = np.max(y_data, axis=0) y_data = (y_data - y_min) / (y_max - y_min) ``` 接下来,我们需要将数据集分为训练集和测试集。在此处,我们选择将数据集的前80%作为训练集,剩余的20%作为测试集。 ```python # 将数据集分为训练集和测试集 train_size = int(len(x_data) * 0.8) train_x, train_y = x_data[:train_size], y_data[:train_size] test_x, test_y = x_data[train_size:], y_data[train_size:] ``` 接下来,我们需要定义模型。在此处,我们选择使用多元线性回归模型。具体实现如下: ```python # 定义模型 class LinearRegression: def __init__(self): self.W = tf.Variable(tf.zeros([13, 1])) self.b = tf.Variable(tf.zeros([1])) def __call__(self, x): return tf.matmul(x, self.W) + self.b model = LinearRegression() ``` 接下来,我们需要定义损失函数和优化器。在此处,我们选择使用均方误差作为损失函数,使用梯度下降法作为优化器。具体实现如下: ```python # 定义损失函数和优化器 def mse_loss(y_pred, y_true): return tf.reduce_mean(tf.square(y_pred - y_true)) optimizer = tf.optimizers.SGD(learning_rate=0.01) ``` 接下来,我们需要定义训练函数。具体实现如下: ```python # 定义训练函数 def train(model, x, y, optimizer): with tf.GradientTape() as tape: y_pred = model(x) loss = mse_loss(y_pred, y) gradients = tape.gradient(loss, [model.W, model.b]) optimizer.apply_gradients(zip(gradients, [model.W, model.b])) return loss ``` 接下来,我们开始训练模型。具体实现如下: ```python # 训练模型 num_epochs = 1000 train_losses = [] for epoch in range(num_epochs): train_loss = train(model, train_x, train_y, optimizer) train_losses.append(train_loss) if epoch % 100 == 0: print(f"Epoch [{epoch}/{num_epochs}], Loss: {train_loss:.4f}") ``` 训练完成后,我们可以得到模型的参数。具体实现如下: ```python # 得到模型的参数 W = model.W.numpy().reshape(-1) b = model.b.numpy()[0] # 对参数进行反缩放 W = W * (y_max - y_min) / (x_max - x_min) b = b * (y_max - y_min) + y_min ``` 接下来,我们可以使用测试集来评估模型的表现。具体实现如下: ```python # 使用测试集来评估模型表现 test_pred = model(test_x).numpy() test_pred = test_pred * (y_max - y_min) + y_min test_loss = mse_loss(test_pred, test_y).numpy() print(f"Test Loss: {test_loss:.4f}") ``` 最后,我们可以绘制出拟合结果图示。具体实现如下: ```python # 绘制拟合结果图示 plt.figure() plt.plot(train_losses) plt.xlabel("Epoch") plt.ylabel("Loss") plt.title("Training Loss") plt.show() plt.figure() plt.plot(test_y, label="Ground Truth") plt.plot(test_pred, label="Prediction") plt.xlabel("Sample") plt.ylabel("Price") plt.title("Prediction vs Ground Truth") plt.legend() plt.show() plt.figure() plt.bar(range(len(W)), W) plt.xticks(range(len(W)), data.columns[:-1], rotation=45) plt.title("Feature Importance") plt.show() ``` 这样,我们就可以得到模型的拟合结果和特征重要性了。完整的代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值