本文为 TensorFlow 学习笔记,讲解 TensorFLow 基础操作。欢迎在评论区与我交流👏
文章目录
运行环境
- Mac OS X
- TensorFlow 2.3.1
- Jupyter Notebook
使用下面的命令检查 Tensorflow 是否安装成功及版本:
import tensorflow as tf
print('Tensorflow Version: {}'.format(tf.__version__))
线性回归
关于线性回归的详细讲解见【线性回归模型】。
我们通常认为,受教育年限和收入是线性关系,这里用两者的关系进行线性回归拟合。
首先读取数据集并打印:
import pandas as pd
data = pd.read_csv('./dataset/Income1.csv')
data
输出结果:
然后绘制出数据集:
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(data.Education, data.Income) # 绘制散点图
绘制结果如下。横轴为受教育年限,竖轴为收入:
使用顺序模型进行搭建,顺序模型(Sequential)即一个输入和一个输出,使用 Dense 建立线性回归模型:
x = data.Education
y = data.Income
model = tf.keras.Sequential() # 声明模型
# 使用 Dense 建立线性回归模型,参数为 (输出维度, 输入维度),输入维度用元组表示
model.add(tf.keras.layers.Dense(1, input_shape=(1,)))
model.summary() # 打印模型结构
输出结果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 1) 2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________
其中 None 代表模型个数,建立模型时无需考虑。Param 为参数个数,这里为 2,将输入 x 变为 ax + b。
接下来编译模型:
model.compile(optimizer='adam', # 使用 adam 梯度下降方法,学习率默认为 0.01
loss='mse' # 均方差
)
然后使用 fit 方法训练模型:
# epochs 表示对所有数据的训练次数
history = model.fit(x, y, epochs=5000)
训练结果为:
Epoch 1/5000
1/1 [==============================] - 0s 1ms/step - loss: 834.3466
...
Epoch 5000/5000
1/1 [==============================] - 0s 747us/step - loss: 104.9437
使用 model 对数据集本身进行预测:
# 格式为 pd.Series
model.predict(x)
输出结果为:
则受教育年限为 20 时:
model.predict(pd.Series([20]))
输出结果:
array([[64.86565]], dtype=float32)
多层感知器
原理
线性回归模型是单个神经元。计算输入特征 x x x 的加权和,然后使用激活函数计算输出。
单个神经元(二分类):
多个神经元(多分类):
上面的神经元都是单层的,无法拟合 “异或” 运算。神经元要求数据必须是线性可分的,而异或问题无法找到一条直线分割两个类。这也是神经网络发展停滞了多年的原因。
多层感知器,可以拟合非线性问题:
激活函数
Relu 激活
sigmoid 激活:
tanh 激活:
Leak relu 激活,多用于生成网络:
实现
首先引入包:
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
读取数据集并打印结果:
data = pd.read_csv('dataset/Advertising.csv')
data.head()
打印结果:
作出 TV 与 销量的散点图:
plt.scatter(data.TV, data.sales)
得到图像如下,很明显为线性关系:
建立模型,使用列表形式直接将层定义在 Sequential 中,无需写 add:
# x 对应中间 3 列特征
# 取所有的行,并除去第一列和最后一列
x = data.iloc[:, 1: -1]
# y 取最后一列
y = data.iloc[:, -1]
# 建立多层感知器,中间需添加一层,然后再添加输出
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,), activation='relu'), # 隐藏层 10 个单元,并添加激活函数
tf.keras.layers.Dense(1)] # 输出维度为 1
)
model.summary() # 打印神经网络结构
输出结果如下,中间层有 10 个隐藏单元:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 10) 40
_________________________________________________________________
dense_1 (Dense) (