Press "Enter" to skip to content

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 的值求出来

 

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()

 

 

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 = 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 = 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) 
        cursor = 64 * i
        batch_data = 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)

 

–>

 

<generator object gen_batch at 0x00000273D6BEAFC0>

 

打印结果是一个生成器对象,那幺生成器应该怎样用?

 

1-4-1

 

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 计算图

 

 = 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 = 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 = 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

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注