美文网首页
使用tensorflow实现线性回归

使用tensorflow实现线性回归

作者: __method__ | 来源:发表于2020-07-05 19:25 被阅读0次

tensorflow实现线性回归

import tensorflow as tf
# 实现线性回归训练
class MyLinearRegression(object):
    """
    实现线性回归训练
    """
    def __init__(self):
        self.leaning_rate = 10

    def inputs(self):
        """
        获取需要训练的数据
        :return:
        """
        # x: [100, 1]  y_true = x * 0.7 + 0.8
        x_data = tf.random_normal(shape=[100, 1], mean=0.0, stddev=1.0, name='x_data')

        # [100, 1] * [1, 1] = [100, 1]
        y_true = tf.matmul(x_data, [[0.7]]) + 0.8

        return x_data, y_true

    def inference(self, feature):
        """
        根据数据特征值,建立线性回归模型
        :param feature: 数据特征值 [100, 1]
        :return: y_predict
        """
        # 定义一个命名空间
        with tf.variable_scope("linear_model"):
            # w, b
            # x [100, 1] * w [1, 1] + b = y_predict
            # 随机初始化权重和偏置
            # 权重和偏置必须使用tf.Variable去定义,应为只有Variable才能被梯度下降所训练
            self.weight = tf.Variable(tf.random_normal(shape=[1, 1],
                                                       mean=0.0,
                                                       stddev=1.0),
                                      name="weight")

            self.bias = tf.Variable(tf.random_normal(shape=[1],
                                                       mean=0.0,
                                                       stddev=1.0), name="bias")
            # 建立模型预测
            y_predict = tf.matmul(feature, self.weight) + self.bias

        return y_predict

    def loss(self, y_true, y_predict):
        """
        根据预测值和真实值求出均方误差损失
        :param y_true: 真实值
        :param y_predict: 预测值
        :return: loss
        """
        # 定义一个命名空间
        #  sum((y_true - y_predict)^2) mean()
        with tf.variable_scope("losses"):

            # 求出损失
            # tf.reduce_mean 对列表中的数据求和之后求出平均值
            loss = tf.reduce_mean(tf.square(y_true - y_predict))

        return loss

    def sgd_op(self, loss):
        """
        利用梯度下降优化器去优化损失(优化模型参数)
        :param loss: 损失大小
        :return: 梯度下降OP
        """
        # 定义一个命名空间
        with tf.variable_scope("train_op"):

            train_op = tf.train.GradientDescentOptimizer(self.leaning_rate).minimize(loss)

        return train_op


    def train(self):
        """
        用于训练的函数
        :return: None
        """
        # 获取默认的图
        g = tf.get_default_graph()

        # 在默认图当中去做操作
        with g.as_default():

            # 进行训练
            # 1、获取数据
            x_data, y_true = self.inputs()

            # 2、利用模型得出预测结果
            y_predict = self.inference(x_data)

            # 3、损失计算
            loss = self.loss(y_true, y_predict)

            # 4、优化损失
            train_op = self.sgd_op(loss)

            # 开启回话去训练
            with tf.Session() as sess:

                # 初始化变量
                sess.run(tf.global_variables_initializer())

                # 创建events文件

                # 打印模型没有训练的初始化的参数
                print("模型初始化的参数权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))
                # 打印模型没有训练的初始化的参数
                print("第一次加载保存的模型参数变为权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))
                print("以模型当中的参数继续去进行训练")

                # 接下来?
                for i in range(500):
                    sess.run(train_op)
                    print("第 %d 步,总损失变化:%f , 模型优化参数权重:%f ,  偏置为:%f " % (
                        i,
                        loss.eval(),
                        self.weight.eval(),
                        self.bias.eval()
                    ))
if __name__ == '__main__':
    lr = MyLinearRegression()
    lr.train()

增加保存模型代码



import tensorflow as tf

# 实现线性回归训练
class MyLinearRegression(object):
    """
    实现线性回归训练
    """
    def __init__(self):
        self.leaning_rate = 0.01

    def inputs(self):
        """
        获取需要训练的数据
        :return:
        """
        # x: [100, 1]  y_true = x * 0.7 + 0.8
        x_data = tf.random_normal(shape=[100, 1], mean=0.0, stddev=1.0, name='x_data')

        # [100, 1] * [1, 1] = [100, 1]
        y_true = tf.matmul(x_data, [[0.7]]) + 0.8

        return x_data, y_true

    def inference(self, feature):
        """
        根据数据特征值,建立线性回归模型
        :param feature: 数据特征值 [100, 1]
        :return: y_predict
        """
        # 定义一个命名空间
        with tf.variable_scope("linear_model"):
            # w, b
            # x [100, 1] * w [1, 1] + b = y_predict
            # 随机初始化权重和偏置
            # 权重和偏置必须使用tf.Variable去定义,应为只有Variable才能被梯度下降所训练
            self.weight = tf.Variable(tf.random_normal(shape=[1, 1],
                                                       mean=0.0,
                                                       stddev=1.0),
                                      # trainable=False,
                                      name="weight")

            self.bias = tf.Variable(tf.random_normal(shape=[1],
                                                       mean=0.0,
                                                       stddev=1.0), name="bias")
            # 建立模型预测
            y_predict = tf.matmul(feature, self.weight) + self.bias

        return y_predict

    def loss(self, y_true, y_predict):
        """
        根据预测值和真实值求出均方误差损失
        :param y_true: 真实值
        :param y_predict: 预测值
        :return: loss
        """
        # 定义一个命名空间
        #  sum((y_true - y_predict)^2) mean()
        with tf.variable_scope("losses"):

            # 求出损失
            # tf.reduce_mean 对列表中的数据求和之后求出平均值
            loss = tf.reduce_mean(tf.square(y_true - y_predict))

        return loss

    def sgd_op(self, loss):
        """
        利用梯度下降优化器去优化损失(优化模型参数)
        :param loss: 损失大小
        :return: 梯度下降OP
        """
        # 定义一个命名空间
        with tf.variable_scope("train_op"):

            train_op = tf.train.GradientDescentOptimizer(self.leaning_rate).minimize(loss)

        return train_op
    def train(self):
        """
        用于训练的函数
        :return: None
        """
        # 获取默认的图
        g = tf.get_default_graph()

        # 在默认图当中去做操作
        with g.as_default():

            # 进行训练
            # 1、获取数据
            x_data, y_true = self.inputs()

            # 2、利用模型得出预测结果
            y_predict = self.inference(x_data)

            # 3、损失计算
            loss = self.loss(y_true, y_predict)

            # 4、优化损失
            train_op = self.sgd_op(loss)

            # 定义一个保存文件的saverOP
            saver = tf.train.Saver()

            # 开启回话去训练
            with tf.Session() as sess:

                # 初始化变量
                sess.run(tf.global_variables_initializer())

                # 打印模型没有训练的初始化的参数
                print("模型初始化的参数权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))

                # 加载模型,从模型当中找出与当前训练的模型代码当中(名字一样的OP操作),覆盖原来的值
                ckpt = tf.train.latest_checkpoint("./tmp/model/")

                # 判断模型是否存在
                if ckpt:
                    saver.restore(sess, ckpt)

                # 打印模型没有训练的初始化的参数
                print("第一次加载保存的模型参数变为权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))
                print("以模型当中的参数继续去进行训练")

                # 接下来?
                for i in range(500):

                    sess.run(train_op)

                    print("第 %d 步,总损失变化:%f , 模型优化参数权重:%f ,  偏置为:%f " % (
                        i,
                        loss.eval(),
                        self.weight.eval(),
                        self.bias.eval()
                    ))

                    # 每隔100步保存一次模型
                    if i % 100 == 0:

                        # 要指定路径+名字
                        saver.save(sess,"./tmp/model/" )


if __name__ == '__main__':
    lr = MyLinearRegression()
    lr.train()

命令行参数使用



import tensorflow as tf
tf.app.flags.DEFINE_integer("tran_step", 0, "训练模型的步数")

tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路径")

FLAGS = tf.app.flags.FLAGS

# 实现线性回归训练
class MyLinearRegression(object):
    """
    实现线性回归训练
    """
    def __init__(self):
        self.leaning_rate = 0.01

    def inputs(self):
        """
        获取需要训练的数据
        :return:
        """
        # x: [100, 1]  y_true = x * 0.7 + 0.8
        x_data = tf.random_normal(shape=[100, 1], mean=0.0, stddev=1.0, name='x_data')

        # [100, 1] * [1, 1] = [100, 1]
        y_true = tf.matmul(x_data, [[0.7]]) + 0.8

        return x_data, y_true

    def inference(self, feature):
        """
        根据数据特征值,建立线性回归模型
        :param feature: 数据特征值 [100, 1]
        :return: y_predict
        """
        # 定义一个命名空间
        with tf.variable_scope("linear_model"):
            # w, b
            # x [100, 1] * w [1, 1] + b = y_predict
            # 随机初始化权重和偏置
            # 权重和偏置必须使用tf.Variable去定义,应为只有Variable才能被梯度下降所训练
            self.weight = tf.Variable(tf.random_normal(shape=[1, 1],
                                                       mean=0.0,
                                                       stddev=1.0),
                                      # trainable=False,
                                      name="weight")

            self.bias = tf.Variable(tf.random_normal(shape=[1],
                                                       mean=0.0,
                                                       stddev=1.0), name="bias")
            # 建立模型预测
            y_predict = tf.matmul(feature, self.weight) + self.bias

        return y_predict

    def loss(self, y_true, y_predict):
        """
        根据预测值和真实值求出均方误差损失
        :param y_true: 真实值
        :param y_predict: 预测值
        :return: loss
        """
        # 定义一个命名空间
        #  sum((y_true - y_predict)^2) mean()
        with tf.variable_scope("losses"):

            # 求出损失
            # tf.reduce_mean 对列表中的数据求和之后求出平均值
            loss = tf.reduce_mean(tf.square(y_true - y_predict))

        return loss

    def sgd_op(self, loss):
        """
        利用梯度下降优化器去优化损失(优化模型参数)
        :param loss: 损失大小
        :return: 梯度下降OP
        """
        # 定义一个命名空间
        with tf.variable_scope("train_op"):

            train_op = tf.train.GradientDescentOptimizer(self.leaning_rate).minimize(loss)

        return train_op
    def train(self):
        """
        用于训练的函数
        :return: None
        """
        # 获取默认的图
        g = tf.get_default_graph()

        # 在默认图当中去做操作
        with g.as_default():

            # 进行训练
            # 1、获取数据
            x_data, y_true = self.inputs()

            # 2、利用模型得出预测结果
            y_predict = self.inference(x_data)

            # 3、损失计算
            loss = self.loss(y_true, y_predict)

            # 4、优化损失
            train_op = self.sgd_op(loss)

            # 定义一个保存文件的saverOP
            saver = tf.train.Saver()

            # 开启回话去训练
            with tf.Session() as sess:

                # 初始化变量
                sess.run(tf.global_variables_initializer())

                # 打印模型没有训练的初始化的参数
                print("模型初始化的参数权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))

                # 加载模型,从模型当中找出与当前训练的模型代码当中(名字一样的OP操作),覆盖原来的值
                ckpt = tf.train.latest_checkpoint("./tmp/model/")

                # 判断模型是否存在
                if ckpt:
                    saver.restore(sess, ckpt)

                # 打印模型没有训练的初始化的参数
                print("第一次加载保存的模型参数变为权重:%f ,  偏置为:%f " % (
                    self.weight.eval(),
                    self.bias.eval()
                ))
                print("以模型当中的参数继续去进行训练")

                # 接下来?
                for i in range(FLAGS.tran_step):

                    sess.run(train_op)

                    print("第 %d 步,总损失变化:%f , 模型优化参数权重:%f ,  偏置为:%f " % (
                        i,
                        loss.eval(),
                        self.weight.eval(),
                        self.bias.eval()
                    ))

                    # 每隔100步保存一次模型
                    if i % 100 == 0:

                        # 要指定路径+名字
                        saver.save(sess,FLAGS.model_dir)


if __name__ == '__main__':
    lr = MyLinearRegression()
    lr.train()

python day_14.py --tran_step=100 --model_dir='tmp/model'

相关文章

网友评论

      本文标题:使用tensorflow实现线性回归

      本文链接:https://www.haomeiwen.com/subject/khpcqktx.html