线性回归代码实现--Tensorflow部分

线性回归代码实现–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 XY都是未知数, 但是在计算机里面 X 、 Y X、Y XY都是向量;所以这个占位符把数学中的未知数引入回计算机中了, 但是这个未知数又不是完全未知, 要我们去求解的那种, 而是可以往里面传数据的, 所以可以理解为一个壳, 其本质还是变量(不是常量);

  • 因为我们采用的是小批量梯度下降法, 所以我们一次传进行的数据是batch_size条, X的属性数是1, 所以shape=[None, 1] (Y也是同理)

  • 我们要求解的参数 w 、 b w、b wb的都是一个, 所以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变化
      简单线性回归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-多元线性回归Loss函数图

线性回归代码实现–Tensorflow部分就是这样了, 继续下一章吧!pd的Machine Learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PD我是你的真爱粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值