欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自学tensorflow——2.使用tensorflow计算线性回归模型

程序员文章站 2022-04-14 18:05:54
废话不多说,直接开始 1.首先,导入所需的模块: 关闭tensorflow输出的一大堆硬件信息 2.写一个函数generate_data(),用来生成我们所需要的数据,这里使用的线性函数是y = 0.1*x + 0.3,具体解释见注释 说一下上面8,9两行的操作,其实 与 等价,只是这样写比较方便。 ......

废话不多说,直接开始

1.首先,导入所需的模块:

import numpy as np
import os
import tensorflow as tf

关闭tensorflow输出的一大堆硬件信息

os.environ['tf_cpp_min_log_level'] = '2'

2.写一个函数generate_data(),用来生成我们所需要的数据,这里使用的线性函数是y = 0.1*x + 0.3,具体解释见注释

def generate_data():#随机生成测试数据
    num_points = 1000
    vector_set = []
    for i in range(num_points):
        x1 = np.random.normal(0.0, 0.55)
        y1 = x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03)#以函数y = 0.1x+0.3为基准生成点数据,加上一个随机值是为了防止生成的点都严格在一条直线上
        vector_set.append([x1, y1])
        x_data = [v[0] for v in vector_set]#就是vector_set里面的所有x1组成的列表
        y_data = [v[1] for v in vector_set]#同上
    return x_data, y_data

说一下上面8,9两行的操作,其实

x_data = [v[0] for v in vector_set]

for i in vector_set:
    x_data.append(i[0])

等价,只是这样写比较方便。

3.接下来就是我们的计算图的构建了

首先介绍一些东西:

tf.random_uniform(shape, a, b)#用来生成a~b范围内的均匀分布的随机数,其中shape是生成的张量的形状
tf.square(a)#计算a的平方
tf.reduce_mean()#(不指定axis的情况下)就是计算平均值
tf.train.gradientdescentoptimizer(0.5)#tf.train里面有许多优化方法,这里使用gradientdescentoptimizer()参数是学习率,范围0~1

博主也只是略知一二,具体可以去查手册或百度

代码如下,也是有注释的(注意,下面的*,+,-都是张量运算)

def train(x_data, y_data):
    w = tf.variable(tf.random_uniform([1], -1.0, 1.0), name = 'w')#生成均匀分布的值,其中[1]可以换成(1, ),表示矩阵的形状
    b = tf.variable(tf.zeros([1]), name = 'b')#b初始化为0
    y = w * x_data + b#根据随机生成的w, x_data, b计算y
    loss = tf.reduce_mean(tf.square(y - y_data), name = 'loss')#tf.square()平方,tf.reduce_mean(不指定axis的情况下)就是计算平均值,所以loss就是标准差
    optimizer = tf.train.gradientdescentoptimizer(0.5)#设置学习率为0.5
    train = optimizer.minimize(loss, name = 'train')#使用优化器通过损失函数调整神经网络权值

    with tf.session() as sess:#开启任务,为了方便,起了别名sess
      init = tf.global_variables_initializer()#同上
      sess.run(init)#初始化全部变量

      print('w = ', sess.run(w), 'b = ', sess.run(b), 'loss = ', sess.run(loss))#这是随机生成的,开始训练前的w,b和损失
      for step in range(50):#一共训练50次
          sess.run(train)
          print('w = ', sess.run(w), 'b = ', sess.run(b), 'loss = ', sess.run(loss))#这是每一次训练后的w,b和损失

最后只要调用这两个函数就行了

if __name__ == "__main__":
    x_data, y_data = generate_data()
    train(x_data, y_data)

对了,二次方程,甚至多次方程也可以哦

那么今天就到这里。

see you next time!