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