【Google 机器学习笔记】十、TensorFlow 2.1 实战(一)简单的线性回归预测

【Google 机器学习笔记】

十、TensorFlow 2.1 实战(一)简单的线性回归预测

  在进行 TensorFlow 实战之前,先对 TensorFlow 的一些基本概念做一些了解。


TensorFlow 基本概念
  • 张量 【Tensor】:TensorFlow 程序中的主要数据结构。张量是 N 维(其中 N 可能非常大)数据结构,最常见的是标量(当 N = 0 时)、向量(当 N = 1 时)或矩阵(当 N = 2 时)。张量的元素可以包含整数值、浮点值或字符串值。
  • 流【Flow】:一种计算模型:张量之间通过计算而转换的过程。

TensorFlow 学习环境安装
  1. 下载安装 Miniconda(官网下载速度慢,可以前往清华镜像下载)。
  2. 启动 Miniconda,换清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

# 设置搜索时显示通道地址
conda config --set show_channel_urls yes
  1. 新建一个 conda 环境,并安装 TensorFlow 2.1
conda create -n mlcc
conda activate mlcc

# 安装 TensorFlow,注意检查版本是否为 2.1
conda install tensorflow

# 安装 TensorFlow 所常用的一些包
conda install matplotlib
  1. 安装 jupyter notebook(如果有其它类似工具可以跳过),并运行
conda install jupyter notebook
jupyter notebook

简单的线性回归预测

  机器学习编程一般有以下几个步骤:
    1. 数据
      ① 获取数据
      ② 处理数据
      ③ 拆分数据
      ④ 检查数据
    2. 模型
      ① 构建模型
      ② 检查模型
      ③ 训练模型
      ④ 进行预测

  下面按照以上步骤进行讲解。

数据

  • 获取数据并处理数据
# 导入一个数据处理工具包和一个数据可视化工具
import matplotlib.pyplot as plt
import numpy as np
# 构建一个可以被线性方程拟合的数据集并处理数据
np.random.seed(2020)
x_data = np.linspace(-1, 1, 100)  # x_data为 -1 至 1 的等差数列
y_data = 2 * x_data + 1.0 + np.random.randn(*x_data.shape) * 0.3  # 将x_data通过指定方式映射至y_data
  • 拆分数据
      由于数据量过小,为防止影响训练效果先不进行拆分。(其实是我不会…)

  • 检查数据

plt.scatter(x_data, y_data)
# 检查数据是否在回归线附近
plt.plot(x_data, 2 * x_data + 1.0, color='red', linewidth=3)

【Google 机器学习笔记】十、TensorFlow 2.1 实战(一)简单的线性回归预测_第1张图片
模型

  • 构建模型
# 先导入 TensorFlow 有关的包
import tensorflow as tf
from tensorflow import keras  # TF 的一个高级 API
from tensorflow.keras import layers  # 神经层
model = keras.Sequential([
    # 这里设置了两层神经层(关于层的设置目前没有一个系统的方法,主要靠经验法则,一个个试验)
    # 第一层有20个神经元,接收形状为(1,)的数据,激活函数ReLU;
    # 第二层只有一个神经元,故只有一个输出
    layers.Dense(20, activation='relu', input_shape=(1,)),
    layers.Dense(1)
])
# 设置梯度下降优化器和学习速率
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
# 选择损失函数,编译模型
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['mae', 'mse'])
  • 检查模型
model.summary()
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              (None, 20)                40        
_________________________________________________________________
dense_8 (Dense)              (None, 1)                 21        
=================================================================
Total params: 61
Trainable params: 61
Non-trainable params: 0
_________________________________________________________________
  • 训练模型
# 训练此模型 100 次
model.fit(x_data, y_data, epochs=100)
Train on 100 samples
Epoch 1/100
100/100 [==============================] - 1s 5ms/sample - loss: 2.8671 - mae: 1.3909 - mse: 2.8671
Epoch 2/100
100/100 [==============================] - 0s 240us/sample - loss: 2.4969 - mae: 1.3072 - mse: 2.4969
Epoch 3/100
100/100 [==============================] - 0s 240us/sample - loss: 2.1785 - mae: 1.2223 - mse: 2.1785
Epoch 4/100
100/100 [==============================] - 0s 220us/sample - loss: 1.9672 - mae: 1.1646 - mse: 1.9672
Epoch 5/100
100/100 [==============================] - 0s 260us/sample - loss: 1.7808 - mae: 1.1090 - mse: 1.7808
Epoch 6/100
100/100 [==============================] - 0s 270us/sample - loss: 1.6284 - mae: 1.0632 - mse: 1.6284
Epoch 7/100
100/100 [==============================] - 0s 250us/sample - loss: 1.5117 - mae: 1.0251 - mse: 1.5117
Epoch 8/100
100/100 [==============================] - 0s 270us/sample - loss: 1.3864 - mae: 0.9824 - mse: 1.3864
Epoch 9/100
100/100 [==============================] - 0s 300us/sample - loss: 1.2847 - mae: 0.9431 - mse: 1.2847
Epoch 10/100
100/100 [==============================] - 0s 190us/sample - loss: 1.1653 - mae: 0.8977 - mse: 1.1653
(11-89省去)
Epoch 90/100
100/100 [==============================] - 0s 230us/sample - loss: 0.0887 - mae: 0.2327 - mse: 0.0887
Epoch 91/100
100/100 [==============================] - 0s 220us/sample - loss: 0.0890 - mae: 0.2337 - mse: 0.0890
Epoch 92/100
100/100 [==============================] - 0s 320us/sample - loss: 0.0885 - mae: 0.2333 - mse: 0.0885
Epoch 93/100
100/100 [==============================] - 0s 220us/sample - loss: 0.0888 - mae: 0.2340 - mse: 0.0888
Epoch 94/100
100/100 [==============================] - 0s 200us/sample - loss: 0.0886 - mae: 0.2340 - mse: 0.0886
Epoch 95/100
100/100 [==============================] - 0s 180us/sample - loss: 0.0884 - mae: 0.2330 - mse: 0.0884
Epoch 96/100
100/100 [==============================] - 0s 170us/sample - loss: 0.0883 - mae: 0.2321 - mse: 0.0883
Epoch 97/100
100/100 [==============================] - 0s 190us/sample - loss: 0.0887 - mae: 0.2344 - mse: 0.0887
Epoch 98/100
100/100 [==============================] - 0s 170us/sample - loss: 0.0888 - mae: 0.2351 - mse: 0.0888
Epoch 99/100
100/100 [==============================] - 0s 200us/sample - loss: 0.0883 - mae: 0.2345 - mse: 0.0883
Epoch 100/100
100/100 [==============================] - 0s 180us/sample - loss: 0.0880 - mae: 0.2325 - mse: 0.0880

  你可以看到,随着迭代次数不断增加,损失不断降低,到了第90次迭代之后,损失逐渐收敛,再迭代下去有过拟合的风险

  • 进行预测
plt.scatter(x_data, y_data)
# 使用 model.predict 即可进行预测
plt.scatter(x_data, model.predict(x_data), color="lightgreen")
plt.plot(x_data, 2 * x_data + 1.0, color="red",linewidth=3)

【Google 机器学习笔记】十、TensorFlow 2.1 实战(一)简单的线性回归预测_第2张图片
  结果基本拟合回归曲线


上一篇:【Google 机器学习笔记】九、神经网络
下一篇:【Google 机器学习笔记】十、TensorFlow 2.1 实战(二)基本图像分类(MNIST)

你可能感兴趣的:(Google,机器学习笔记,tensorflow,机器学习)