Tensorflow——线性回归模型实现

Tensorflow——线性回归模型实现

最近在看R-CNN代码的时候,对坐标回归模型突然变得好陌生,感觉自己从来就没有接触过这个东西(o(╥﹏╥)o),所以特地复习了下tensorflow实现线性回归模型,加深其中的理解~

代码实现

先贴出来全部的代码,然后分批进行解释~

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

if __name__ == '__main__':
    with tf.Graph().as_default():
        # 一、执行图的构建
        # a. 定义占位符
        input_x = tf.placeholder(dtype=tf.float32, shape=[None, 1], name='x')
        input_y = tf.placeholder(dtype=tf.float32, shape=[None, 1], name='y')

        # b. 定义模型参数
        w = tf.get_variable(name='w', shape=[1, 1], dtype=tf.float32,
                            initializer=tf.random_normal_initializer(mean=0.0, stddev=1.0))
        b = tf.get_variable(name='b', shape=[1], dtype=tf.float32,
                            initializer=tf.zeros_initializer())

        # c. 模型预测的构建(获取预测值)
        y_ = tf.matmul(input_x, w) + b

        # d. 损失函数构建(平方和损失函数)
        loss = tf.reduce_mean(tf.square(input_y - y_))

        # e. 定义优化器(优化器的意思:求解让损失函数最小的模型参数<变量>的方式)
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
        # f. 定义一个训练操作对象
        train_op = optimizer.minimize(loss=loss)

        # 二、执行图的训练运行
        with tf.Session() as sess:
            # a. 变量的初始化操作
            sess.run(tf.global_variables_initializer())

            # b. 训练数据的产生/获取(基于numpy随机产生<可以先考虑一个固定的数据集>)
            N = 100
            x = np.linspace(0, 6, N) + np.random.normal(0, 2.0, N)
            y = 14 * x + 7 + np.random.normal(0, 5.0, N)
            x.shape = -1, 1
            y.shape = -1, 1
            print((np.shape(x), np.shape(y)))

            # c. 模型训练
            for step in range(100):
                # 1. 触发模型训练操作
                _, loss_ = sess.run([train_op, loss], feed_dict={
                    input_x: x,
                    input_y: y
                })
                print("第{}次训练后模型的损失函数为:{}".format(step, loss_))

            # d. 构造一个测试数据或者使用训练数据,得到该数据对应的预测值,做一个可视化的操作
            predict = sess.run(y_, feed_dict={input_x: x})
            plt.plot(x, y, 'ro')
            plt.plot(x, predict, 'g-')
            plt.show()

分步骤进行解释,并着重其中需要注意的地方

一、执行图的构建
注意点:
1.为什么要写“with tf.Graph().as_default():”?
答:

import tensorflow as tf
def train():
    with tf.Graph().as_default():
        with tf.Session.as_default():
            trainstep()
def trainstep():
    tf.Session.run(loss)
'''#如果没有.as_default()操作就会报错,因为普通的会话只有在with语句里面上下文管理器里面有效,出去的而话默认有sess.close()操作。但是as_default()以后就可以在外面使用。
'''

再举一个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.tf.placeholder的用法及作用

tf.placeholde的作用:该函数的作用是创建新的tensorflow变量,常见的initializer有:常量初始化器tf.constant_initializer、正太分布初始化器tf.random_normal_initializer、截断正态分布初始化器tf.truncated_normal_initializer、均匀分布初始化器tf.random_uniform_initializer。
(说白了,就是创建w和b参数的占位符~)

 import tensorflow as tf;  
 import numpy as np;  
 
 #常量初始化器
 v1_cons = tf.get_variable('v1_cons', shape=[1,4], initializer=tf.constant_initializer())
 v2_cons = tf.get_variable('v2_cons', shape=[1,4], initializer=tf.constant_initializer(9))
 #正太分布初始化器
 v1_nor = tf.get_variable('v1_nor', shape=[1,4], initializer=tf.random_normal_initializer())
 v2_nor = tf.get_variable('v2_nor', shape=[1,4], initializer=tf.random_normal_initializer(mean=0, stddev=5, seed=0))#均值、方差、种子值
 #截断正态分布初始化器
 v1_trun = tf.get_variable('v1_trun', shape=[1,4], initializer=tf.truncated_normal_initializer())
 v2_trun = tf.get_variable('v2_trun', shape=[1,4], initializer=tf.truncated_normal_initializer(mean=0, stddev=5, seed=0))#均值、方差、种子值
 #均匀分布初始化器
 v1_uni = tf.get_variable('v1_uni', shape=[1,4], initializer=tf.random_uniform_initializer())
 v2_uni = tf.get_variable('v2_uni', shape=[1,4], initializer=tf.random_uniform_initializer(maxval=-1., minval=1., seed=0))#最大值、最小值、种子值
 
 
 with tf.Session() as sess:
     sess.run(tf.global_variables_initializer())
     print("常量初始化器v1_cons:",sess.run(v1_cons))
     print("常量初始化器v2_cons:",sess.run(v2_cons))
     print("正太分布初始化器v1_nor:",sess.run(v1_nor))
     print("正太分布初始化器v2_nor:",sess.run(v2_nor))
     print("截断正态分布初始化器v1_trun:",sess.run(v1_trun))
     print("截断正态分布初始化器v2_trun:",sess.run(v2_trun))
     print("均匀分布初始化器v1_uni:",sess.run(v1_uni))
     print("均匀分布初始化器v2_uni:",sess.run(v2_uni))
--------------------------------------------------------------
 常量初始化器v1_cons: [[0. 0. 0. 0.]]
 常量初始化器v2_cons: [[9. 9. 9. 9.]]
 正太分布初始化器v1_nor: [[-0.7286455  -0.03095582  1.6400269  -0.90134907]]
 正太分布初始化器v2_nor: [[-1.9957879 10.522196   0.8553612  2.7325907]]
 截断正态分布初始化器v1_trun: [[-0.52284956 -0.77045     1.9507815   0.96106136]]
 截断正态分布初始化器v2_trun: [[-1.9957879  0.8553612  2.7325907  2.1127698]]
 均匀分布初始化器v1_uni: [[0.5369104  0.05912018 0.1587832  0.2859378 ]]
 均匀分布初始化器v2_uni: [[ 0.79827476 -0.9403336  -0.69752836  0.9034374 ]]
参数:
 def get_variable(name,
                  shape=None,
                  dtype=None,
                  initializer=None,
                  regularizer=None,
                  trainable=True,
                  collections=None,
                  caching_device=None,
                  partitioner=None,
                  validate_shape=True,
                  use_resource=None,
                  custom_getter=None):

二、执行图的训练运行

步骤:
1.变量的初始化操作
2.训练数据的产生/获取(基于numpy随机产生<可以先考虑一个固定的数据集>)
3.模型训练
4.构造一个测试数据或者使用训练数据,得到该数据对应的预测值,做一个可视化的操作

引用:

https://www.jianshu.com/p/5a7a0f138a95
https://blog.csdn.net/weixin_44791964/article/details/96134474

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进我的收藏吃灰吧~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值