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