基于tensorflow实现线性回归的模型训练预测

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

tensorflow部分函数参数的含义 

#with tf.Graph().as_default(): 构建一个新的图。在多个图进行编程时,注意操作的图要是同一个,不同#图中的节点不能使同一个。
# 不允许对不同图中的tensor对象进行联合操作(不能合并不同图中的tensor对象)
ValueError: Tensor("b:0", shape=(5, 3), dtype=float32) must be from the same graph as Tensor("a:0", shape=(3, 5), dtype=float32)

#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作
#降维或者计算tensor(图像)的平均值。
reduce_mean(input_tensor,
                axis=None,
                keep_dims=False,
                name=None,
                reduction_indices=None)

#tf.Variable()参数含义
def __init__(self,
               initial_value=None, 给定的初始化的value值,可以是Python基本数据类型或者Tensor对象
               trainable=True, 给定该变量是否参与模型训练,也就是在模型训练的时候是否会进行更新的操作
               collections=None,
               validate_shape=True, 在更新该变量的前后是否要求shape形状一致
               caching_device=None,
               name=None, 给定Tensor底层对应的名称
               variable_def=None,
               dtype=None, 给定数据类型
               expected_shape=None,
               import_scope=None,
               constraint=None):
w = tf.Variable(initial_value=[[-5],
                                       [3],
                                       [1.5]],
                        dtype=tf.float32, name='w')

#构建会话
def __init__(self, target='', graph=None, config=None)
    target: 一个字符串,先暂时不考虑
    graph: 指定这个会话可以运行那个图上的内容,如果不给定的时候,默认就是tf.get_default_graph()
    config: session相关配置信息,可以不给
sess = tf.Session()

# 获取运行结果/获取tensor对象的结果
def run(self, fetches, feed_dict=None, options=None, run_metadata=None)
   fetches:给定具体获取那些tensor的值,可以是一个tensor也可以是多个tensor,当给定多个tensor的时候,执行图执行一次。
   feed_dict:如果定义的执行图需要输入数据,那么通过该参数给定。

def placeholder(dtype, shape=None, name=None):
           功能:定义一个占位符。具体的值等到运行的时候给定
           参数说明:
             dtype: 给定数据类型
             shape: 给定数据的形状,如果中间为None其实等价于numpy中的-1
x = tf.placeholder(dtype=tf.float32, shape=[None, 3], name='x') #none其实就是不限制维度的意思

def constant(value, dtype=None, shape=None, name="Const", verify_shape=False):
    功能:定义一个值不允许修改的Tensor常量对象
    参数:
    value: 初始值,可以是任意的Python基本数据类型(数值型、布尔类型、字符串类型、数组、元祖)以及NumPy数组类型
    dtype: 明确给定常量对象的数据类型,如果不给定的话,从value中获取数据类型
    shape: 给定常量对象的形状,默认不给定的话,使用value对应的形状
   
​
#构建日志输出对象
with tf.Session(config=tf.ConfigProto(log_device_placement=True,
                                          allow_soft_placement=True)) as sess:
     # 变量初始化
     sess.run(tf.global_variables_initializer())

     # 合并所有的summary可视化输出操作
     summary = tf.summary.merge_all()

     # 构建一个日志输出对象
     writer = tf.summary.FileWriter(logdir='./models/09', graph=sess.graph)

     ...

     # 关闭输出对象
     writer.close()

tensorboard需要python3.6,可直接采用全路径
/Users/tangxb/anaconda/bin/tensorboard --logdir /Users/tangxb/PycharmProjects/untitled3/tf2/models/04

 

 

你可能感兴趣的:(tensorflow)