0%

Python数据科学_23_Tensorflow2(中阶API)

中阶API

激活函数

一般作用于单个神经元结构的输出,我们需要利用非线性激活函数向模型中引入非线性特征,用来拟合非线性数据

1
from tensorflow.keras import activations
1
2
3
# activations.sigmoid()
# activations.relu()
# activations.softmax()

模型层

构成模型的主要原件

1
from tensorflow.keras import layers
1
2
3
4
5
6
# layers.Dense()  # 全连接层
# layers.Conv2D() # 二维卷积层
# layers.MaxPool2D() # 最大池化层
# layers.Flatten() # 展平层
# layers.BatchNormalization() # 批标准化层
# layers.Dropout() # 暂退法,丢弃层,随机取某些神经元不参与模型的更新

损失函数

1
from tensorflow.keras import losses
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# # 分类
# losses.binary_crossentropy # 二进制交叉熵(处理二分类)

# softmax函数
# 生成一个单位向量,每个位置上的值表示相应类别的概率
# (0.1, 0.2, 0.7)
# 在归类时,选出概率最高的一类进行归类即可

# ont_hot 编码(独热编码)
# 当总类别数为3个时
# 类别为0时,(1, 0, 0)
# 类别为1时,(0, 1, 0)
# 类别为2时,(0, 0, 1)

# losses.categorical_crossentropy # 多分类交叉熵(当标签为独热编码时才使用)
# losses.sparse_categorical_crossentropy # 稀疏的多分类交叉熵(当标签为稀疏编码时才使用)
# # 回归任务
# losses.mse() # 均方误差
# losses.mean_squared_error() # 均方误差
# losses.mean_squared_logarithmic_error() # 对数均方误差
# losses.mean_absolute_error() # 绝对值误差

评估函数

1
from tensorflow.keras import metrics
1
2
3
4
5
6
7
8
9
# # 分类任务
# metrics.Accuracy() # 精度
# metrics.binary_accuracy() # 二分类精度
# metrics.categorical_accuracy() # 多分类精度
# metrics.sparse_categorical_accuracy() # 稀疏多分类精度
# metrics.Poisson() # 准确率
# metrics.Recall() # 召回率
# metrics.IoU()
# metrics.AUC()
1
2
3
4
5
# 回归任务
# losses.mse() # 均方误差
# losses.mean_squared_error() # 均方误差
# losses.mean_squared_logarithmic_error() # 对数均方误差
# losses.mean_absolute_error() # 绝对值误差

优化器

1
from tensorflow.keras import optimizers
1
2
3
# 每个优化器中都有一个learning_rate参数,可以用于修改优化器的学习率
# optimizers.SGD() # 随机梯度下降法
# optimizers.Adam() # 自适应梯度下降法

使用中阶API简化一元线性回归模型

1
2
3
# skiprows: 表示要丢弃的行数
# delimiter: 分隔符
data = np.loadtxt('line_fit_data.csv', skiprows=1, delimiter=',')
1
2
3
# 分离特征和标签
x_data = tf.constant(data[:, 0], dtype=tf.float32)
y_data = tf.constant(data[:, 1], dtype=tf.float32)
1
2
3
# 参数初始化
params = tf.Variable(tf.random.normal(shape=(2,)))
params
<tf.Variable 'Variable:0' shape=(2,) dtype=float32, numpy=array([-0.97801447, -0.74548423], dtype=float32)>
1
2
3
4
# yita:学习率
yita = 0.5
# 最大迭代次数
epochs = 100
1
2
3
# 定义模型函数
def line_model(x, w, b):
return x*w + b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for epoch in range(epochs):
for i in range(len(x_data)):
# 取出一条样本
x = x_data[i:i+1]
y = y_data[i:i+1]
# 使用自微分机制计算梯度
with tf.GradientTape() as grad:
y_pred = line_model(x, params[0], params[1])
error = losses.mse(y, y_pred)
d_params = grad.gradient(error, params)
# 利用梯度进行参数更新
# 定义优化器
sgd = optimizers.SGD(learning_rate=yita)
# 使用优化器进行优化
sgd.apply_gradients(grads_and_vars=[(d_params, params)])
# 早停机制
if error < 1e-20:
print('Early Stop!')
break
print('epoch:{}, w:{}, b:{}, error:{}'.format(epoch, params.numpy()[0], params.value()[1], error))
epoch:0, w:2.5038626194000244, b:3.9996683597564697, error:2.991348537761951e-07
epoch:1, w:2.5000088214874268, b:3.9999992847442627, error:9.094947017729282e-13
Early Stop!
-------------本文结束感谢您的阅读-------------