20210602 TensorFlow 实现多点线性回归问题

【20210602 TensorFlow 实现多点线性回归问题】从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述20210602 TensorFlow 实现多点线性回归问题相关的知识,希望能为你提供帮助。
0 导包

import warnings warnings.filterwarnings("ignore")import numpy as np# numpy 支持矩阵计算 import tensorflow as tf import matplotlib.pyplot as plt# matplotlib 是 python 的画图工具

1-1 构造数据
np.random.seed(999)# 设定随机种子,用于控制随机过程 def pre(x): return 2 * x+ 3# 这里 w 是 2, b 是 3 # 多点的线性回归,随机产生500个 0-5 的数据 x =5*np.random.random(500) y= [pre(i) for i in x]

1-1-2 画图
plt.plot(x, y,\'salmon\')# plt.plot 画折线图;salmon 指定颜色 plt.scatter(x, y)# scatter 画点 plt.grid() plt.show() # 线性回归的当前任务是,只给出点,让网络自动 将 w 和 b 的值求出来

20210602 TensorFlow 实现多点线性回归问题

文章图片

1-2-1 # 现在对 数据点 添加噪声;产生-0.5到0.5之间的随机数

-0.5 + np.random.random(1) x = [i-0.5 + np.random.random(1)[0] for i in x] y = [i-0.5 + np.random.random(1)[0] for i in y] plt.scatter(x, y) plt.grid() plt.show()

20210602 TensorFlow 实现多点线性回归问题

文章图片

1-3 数据处理
1、x,y值放在一起
2、数据集分为训练集和测试集
# x:[x1,x2,x3,x4,x5......] y:[y1,y2,y3,y4,y5......]
# [[x1,y1],[x2,y2],[x3,y3],[x4,y4].....]

x = np.array(x) y = np.array(y) print(x[:10]) print(y[:10]) print(x.shape)

# --> (500,)
# 将 x 值和 y 值对应一起,有 2 种 做法
1-3-1# 做法1升维操作

x = x.reshape(-1,1) y = y.reshape(-1,1) all_data = https://www.songbingjia.com/android/np.concatenate([x,y],axis=1) # 拼接操作,将对应的 x 和 y 拼接一起 print(all_data[:10])

1-3-2 # 做法2

x = x.reshape(-1,) y = y.reshape(-1,) all_data = https://www.songbingjia.com/android/np.array([x,y]) all_data = all_data.T# 转至操作 print(all_data[:10]) train_data = all_data[:-64] test_data = all_data[-64:]

# 将数据 分为 训练数据和测试数据;一般进行网络训练有三个数据集
# 训练集,验证集和测试集,一般验证集可能是从训练集中分出来的
# 训练完成后,使用测试集的数据验证查看 loss
1-4 数据分块
# 如果将数据一次性全部放到网络中,参数较多,运行速度较慢,或者内存直接溢出
# 所以训练时,将数据切成一块块的,放入网络进行训练
# 如何将数据分块呢?通过生成器实现
# 生成器

def gen_batch(data): for i in range(len(data) // 64): cursor = 64 * i batch_data = https://www.songbingjia.com/android/data[cursor : cursor + 64] x = batch_data[:, 0]# 取第一维度全要,第二维度中取第一个元素 y = batch_data[:, 1]# 取第一维度全要,第二维度中取第二个元素 yield x,y # 这里的 生成器 将 data 按大小分块,这里没有要余数 g_batch = gen_batch(train_data) print(g_batch)

-->

for x_,y_ in gen_batch(train_data): print(x_.shape) print(y_.shape) print(\'-------\')

# 一次完整的for循环可以将测试数据跑一遍,
# 假设我们想论循100次我们的训练数据集,那应该是

import tensorflow as tf for i in range(100): for x_,y_ in gen_batch(train_data): sess = tf.Session() sess.run()

# 实际上,在TensorFlow中,也内置了一些生成器,可以直接调用参数实现
# 不过,很多时候是自己写生成器,因为这样便于控制自己的业务数据

2 线性回归
2-1 超参数

learing_rate = 0.01# 学习率 num_train_epochs = 100# 循环训练数据的次数 display_per_step = 50# 每隔 50 次,查看训练情况

# 超参数就是训练时需要用到的参数,把它们提取出来,易于修改
2-2 计算图

graph = tf.Graph() with graph.as_default(): # x 和 y 是真实值,是需要传入到网络里的 # 所以需要定义 2 个 placeholder,用这 2 个 placeholder 接收真实值 x = tf.placeholder(shape=[None,], dtype=tf.float32, name=\'x\') y = tf.placeholder(shape=[None,], dtype=tf.float32, name=\'y\') # w 和 b 的初始值为 0.5 和 0.2 w =tf.Variable(0.5, dtype=tf.float32) b =tf.Variable(0.2, dtype=tf.float32) # 计算y_pred y_pred = w*x+b# 正向过程,查看y预测值 # 定义loss loss = tf.reduce_mean(tf.square(y_pred - y)) # 定义优化器 optimizer = tf.train.GradientDescentOptimizer(learing_rate) train_step = optimizer.minimize(loss)

2-3 运行计算图

with tf.Session(graph=graph) as sess: init = tf.global_variables_initializer() sess.run(init) step= 0 for epoch in range(num_train_epochs): # 注意x,y不要重名 for x_,y_ in gen_batch(train_data): # x_ y_ 代表从生成器中抓取出来的数据 step += 1 _,l = sess.run([train_step,loss],{x:x_,y:y_}) if step%display_per_step == 0: w_value,b_value = https://www.songbingjia.com/android/sess.run([w,b]) print("w_value is {:.4}, b_value is {:.4}, loss is {:.4}".format(w_value,b_value,l)) print(\'training over\') x_test,y_test = next(gen_batch(test_data)) # 查看测试数据,用生成器的next方法查看 loss_test = sess.run(loss,{x:x_test,y:y_test}) print(\'test loss is {:.4}\'.format(loss_test)) w_value,b_value = https://www.songbingjia.com/android/sess.run([w,b]) print(w_value,b_value)


部分代码解释:
1. numpy中random;array;shape的使用
https://blog.51cto.com/u_15149862/2841003
2. numpy中reshape的使用;数组的拼接操作
https://blog.51cto.com/u_15149862/2841083
3. 1-4 中的生成器
https://blog.51cto.com/u_15149862/2844458
4. 2-2 中的 format 用法
https://blog.51cto.com/u_15149862/2847102
https://blog.51cto.com/u_15149862/2760852

部分理论说明:
1. 关于验证集的一点介绍
20210602 TensorFlow 实现多点线性回归问题

文章图片


    推荐阅读