使用TensorFlow进行算法涉及与训练的核心步骤:
1、准备数据:特征x,标签y,有标签样本{x, y} 用于训练,无标签样本:{x, ?} 用于预测。
2、构建模型:y',
3、训练模型:设置超参数(开始学习过程之前设置好值的参数,包括学习率即步长、迭代次数、神经网络隐含层数量等)、定义损失函数(常见损失函数是均方差mean square error (MSE) 和交叉熵cross-entropy)、梯度下降法(随机梯度下降SGD,小批量随机梯度下降,全梯度BGD等)。通过有标签样本来学习确定所有权重w和偏差b,找到一组平均损失较小的权重w和偏差b。
- L_1损失:基于模型预测的值与标签的实际值之差的绝对值
- L_2损失(平方损失)
4、进行预测
本例通过生成人工数据集,随机生成一个近似采样随机分布,使得w=2.0, b=1,并加入一个噪声,噪声最大振幅为0.4
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 13:10:55 2020
@author: DELL
"""
# %matplotlib inline # 在Jupyter中,使用matplotlib显示图像需要设置为inline模式,否则不显示图像
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
# 1、准备数据
np.random.seed(5) # 设置随机数种子
x_data = np.linspace(-1, 1, 100) # 用np生成100个点
y_data = 2 * x_data + 1.0 + np.random.rand(*x_data.shape) * 0.4 # y=2x+1+噪声,噪声维度与x_data一致
# numpy.random.randn()是标准正态分布N(0.1)
# x_data.shape = (100,)
# 实参前面加上*意味着拆包。即把元组拆成一个个单独的实参
plt.figure(num=1) # 作图
plt.scatter(x_data, y_data,label='Oroginal data')
plt.plot(x_data, 2 * x_data + 1.0, color = 'red', linewidth=3,label='Object line')
plt.legend(loc=4) # 用loc指定图例位置
# 2、构建模型
x = tf.placeholder('float', name = 'x') # 定义训练数据的占位符:特征x, 标签y
y = tf.placeholder('float', name = 'y')
def model(x, w, b): # 定义模型函数
return tf.multiply(x, w) + b
w = tf.Variable(1.0, name='w0') # 构建变量:w, b
b = tf.Variable(0.0, name='b0')
pred = model(x, w, b) # pred是预测值,前向计算
# 3、训练模型
# 设置训练参数(超参数)
train_epochs = 8 # 迭代次数(训练轮数)
learning_rate = 0.05 # 学习率 0.01-0.1
# L2损失函数(均方差损失函数)
loss_function = tf.reduce_mean(tf.square(y-pred))
# 梯度下降优化器
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# 创建会话,并初始化变量
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
# 训练 SGD随机梯度下降法
step = 0 # 记录训练步数
loss_list = [] # 保存loss值的列表
display_step = 20 # 控制训练过程数据显示的频率,不是超参数
for epoch in range(train_epochs):
for xs,ys in zip(x_data, y_data):
_, loss = sess.run([optimizer,loss_function], feed_dict={x: xs, y: ys})
loss_list.append(loss)
step = step +1
if step % display_step == 0:
print('Train Epoch: ', '%02d' % (epoch+1), 'Step: %03d' % (step), 'loss = ',\
"{:.9f}".format(loss))
b0temp = b.eval(session=sess)
w0temp = w.eval(session=sess)
plt.figure(num=2)
plt.plot(x_data, w0temp * x_data + b0temp,label='Fitted line')
plt.figure(num=3)
plt.plot(loss_list,color='blue') # 图形化显示损失值
plt.figure(num=4)
plt.plot(loss_list,'r+')
print('w: ',sess.run(w))
print('b: ',sess.run(b))
# 4、进行预测
x_test = 3.21
# 方法一
predict = sess.run(pred, feed_dict={x: x_test})
print('预测值:%f' %predict)
# 方法二
predict = sess.run(w) * x_test + sess.run(b)
print('预测值:%f' %predict)
target = 2 * x_test + 1.0
print('目标值:%f' %target)
sess.close()
输出结果:
w: 1.9885789
b: 1.1972067
预测值:7.580545
预测值:7.580545
目标值:7.420000
以上。参考Mooc课程是吴明晖老师的《深度学习应用开发-TensorFlow实践》。