线性回归代码实现–Tensorflow部分–潘登同学的机器学习笔记
python版本–3.6 ; Tensorflow版本–1.15.0 ;编辑器–Pycharm
文章目录
简单线性回归
- 任务:
以iris数据集的Pedal Width作为X, 以Sepal length作为Y, 用X去拟合Y;
导入必要的库和数据集
import matplotlib.pyplot as plt # 画图库
import tensorflow as tf
import numpy as np #矩阵库
from sklearn import datasets #导入数据集
from tensorflow.python.framework import ops #Loss函数优化器
加载计算图, 定义数据X和Y
ops.get_default_graph()
表示加载一个计算图, 我们计算的时候都是在这个图中进行的, 可以理解为一张答卷, 题目、计算过程、答案都写在这个答卷里面;
sess = tf.Session()
表示创建一个会话, 这个时候就开始计算一会儿会写在图里面的公式, 其实可以在后面再通过with tf.Session() as sess:
(类似打开文件的形式)来进行, 两种不同的选择吧;
然后iris.data
数据集的第4列表示Pedal Width, 第一列表示Sepal length
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[3] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
声明学习率, 批量大小, 占位符和模型变量
tf.placeholder
表示占位符, 就理解为一个未知数;我们从数学领域进入计算机领域一个很大的变化就是未知数消失了, 我们在数学中, 列一个方程式
X
+
Y
=
3
X + Y = 3
X+Y=3
其中
X
、
Y
X、Y
X、Y都是未知数, 但是在计算机里面
X
、
Y
X、Y
X、Y都是向量;所以这个占位符把数学中的未知数引入回计算机中了, 但是这个未知数又不是完全未知, 要我们去求解的那种, 而是可以往里面传数据的, 所以可以理解为一个壳, 其本质还是变量(不是常量);
-
因为我们采用的是小批量梯度下降法, 所以我们一次传进行的数据是batch_size条, X的属性数是1, 所以shape=[None, 1] (Y也是同理)
-
我们要求解的参数 w 、 b w、b w、b的都是一个, 所以shape=[1,1]
learning_rate = 0.05
batch_size = 25
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[1, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
声明线性模型
写出我们的总体模型
tf.matmul
表示张量乘法
tf.add
表示张量加法
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
声明L2损失函数,初始化变量, 声明优化器
tf.square
表示向量的平方
tf.reduce_mean
表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
loss = tf.reduce_mean(tf.square(y_target - model_output)) #就是线性回归的MSE
init = tf.global_variables_initializer() # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate) # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss) # 最小化Loss损失
sess.run(init) # 运行初始化操作
绘制计算图
我们可以用Tensorboard来显示我们的计算图
writer = tf.summary.FileWriter(r"C:\Users\潘登\PycharmProjects\神经网络\Tensorflow深度学习与实战\graph",sess.graph) # 保存计算图
再在终端中, 输入tensorboard --logdir= xxx
(xxx就是刚才保存的位置的绝对路径),然后点击终端返回的网站
注意
如果显示这个的报错, 可以把上面的那个等号改成一个空格就行
D:\Python\测试专用文件夹\logs>tensorboard -logdir=logs
usage: tensorboard [-h] [--helpfull] [--logdir PATH] [--host ADDR]
[--port PORT] [--purge_orphaned_data BOOL]
[--reload_interval SECONDS] [--db URI] [--db_import]
[--db_import_use_op] [--inspect] [--version_tb] [--tag TAG]
[--event_file PATH] [--path_prefix PATH]
[--window_title TEXT] [--max_reload_threads COUNT]
[--reload_task TYPE]
[--samples_per_plugin SAMPLES_PER_PLUGIN]
[--debugger_data_server_grpc_port PORT]
[--debugger_port PORT] [--master_tpu_unsecure_channel ADDR]
tensorboard: error: unrecognized arguments: -logdir=logs
就能看到计算图了
训练模型
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = [] # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size)
rand_x = np.transpose([X[rand_index]])
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W)[0][0], 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
显示结果、绘制图像
# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线 另一个是迭代100次的L2正则损失
plt.figure(1)
plt.plot(X, Y, 'o', label='Data Points')
plt.plot(X, best_fit, 'r--', label='Best fit line', linewidth=2.25)
plt.legend(loc='upper left')
plt.title('Sepal Length vs Pedal Width')
plt.xlabel('Pedal Width')
plt.ylabel('Sepal length')
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('L2 loss per Generation')
plt.xlabel('Generation')
plt.ylabel('L2 loss')
plt.show()
-
结果如下
-
参数变化
-
Loss变化
-
参数变化
-
完整代码
import matplotlib.pyplot as plt # 画图库
import tensorflow as tf
import numpy as np #矩阵库
from sklearn import datasets #导入数据集
from tensorflow.python.framework import ops #Loss函数优化器
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[3] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
# 声明学习率, 批量大小, 占位符和模型变量
learning_rate = 0.05
batch_size = 25
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[1, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
# 声明L2损失函数, 其为批量损失的平均值, 初始化变量, 声明优化器
loss = tf.reduce_mean(tf.square(y_target - model_output)) #就是线性回归的MSE
# `tf.square` 表示向量的平方 `tf.reduce_mean` 表示计算张量在指定维度上的平均值, 如果没有指定就是普通的算平均值
init = tf.global_variables_initializer() # 表示初始化操作
my_opt = tf.train.GradientDescentOptimizer(learning_rate) # 表示选择梯度下降法作为优化器
train_step = my_opt.minimize(loss) # 最小化Loss损失
sess.run(init) # 运行初始化操作
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = [] # 储存loss随迭代次数的变化, 等一下用于画图
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size) # 随机挑选X, 用于小批量随机梯度下降
rand_x = np.transpose([X[rand_index]])
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W)[0][0], 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
# 抽取系数, 创建最佳拟合直线
slope = sess.run(W)[0][0]
y_intercept = sess.run(b)[0][0]
best_fit = []
for i in X:
best_fit.append(slope * i + y_intercept)
# 绘制两幅图 第一个是拟合直线 另一个是迭代100次的L2正则损失
plt.figure(1)
plt.plot(X, Y, 'o', label='Data Points')
plt.plot(X, best_fit, 'r--', label='Best fit line', linewidth=2.25)
plt.legend(loc='upper left')
plt.title('Sepal Length vs Pedal Width')
plt.xlabel('Pedal Width')
plt.ylabel('Sepal length')
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('L2 loss per Generation')
plt.xlabel('Generation')
plt.ylabel('L2 loss')
plt.show()
多元线性回归
- 任务:
以iris数据集的除Sepal length的数据作为X, 以Sepal length作为Y, 用X去拟合Y;
操作基本上一样了, 不多说了, 直接看代码
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
from sklearn import datasets
from tensorflow.python.framework import ops
ops.get_default_graph()
sess = tf.Session()
iris = datasets.load_iris()
X = np.array([x[1:4] for x in iris.data])
Y = np.array([y[0] for y in iris.data])
# 声明学习率, 批量大小, 占位符和模型变量
learning_rate = 0.01
batch_size = 25
x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
W = tf.Variable(tf.random_normal(shape=[3, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
# 增加线性模型
model_output = tf.add(tf.matmul(x_data, W), b)
# 声明L2损失函数, 其为批量损失的平均值, 初始化变量, 声明优化器
loss = tf.reduce_mean(tf.square(y_target - model_output))
init = tf.global_variables_initializer()
my_opt = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
train_step = my_opt.minimize(loss)
sess.run(init)
# 迭代遍历, 并在随机选择的数据上进行模型训练, 迭代100次 每25次迭代输出变量值和损失值, 将其用于之后的可视化
loss_vec = []
for i in range(100):
rand_index = np.random.choice(len(X), size=batch_size)
rand_x = X[rand_index]
rand_y = np.transpose([Y[rand_index]])
# 目标:最优化损失
sess.run(train_step, feed_dict={x_data:rand_x,
y_target:rand_y})
# 更新loss值
temp_loss = sess.run(loss, feed_dict={x_data:rand_x,
y_target:rand_y})
loss_vec.append(temp_loss)
# 每25次打印
if (i+1) % 25 == 0:
print('Step:', i+1, 'w为:', sess.run(W), 'b为:', sess.run(b)[0][0])
print('Loss为:', temp_loss)
# 抽取系数, 创建最佳拟合直线
# 绘制两幅图 第一个是拟合直线(高维空间的画图就不画了) 另一个是迭代100次的L2正则损失
plt.figure(2)
plt.plot(loss_vec, 'k--')
plt.title('L2 loss per Generation')
plt.xlabel('Generation')
plt.ylabel('L2 loss')
plt.show()
结果如下
- 参数变化
- Loss变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VR2NMeET-
线性回归代码实现–Tensorflow部分就是这样了, 继续下一章吧!pd的Machine Learning