#-*-coding:utf-8-*-
import tensorflow as tf
#面向对象
class MyLinearRegression(object):
def __init__(self):
self.leaning_rate=0.1
def build_data(self):
"""
构建数据--y=0.7*x+0.8#100个样本,这些样本只有一个特征--
:return: 真实的数据集
"""
with tf.variable_scope("build_data"):
#x=[100,1]
#y=[100,1]
#创建一个随机的[100,1]的张量
#x就是一个随机初始化的[100,1]的张量
x=tf.random_normal(shape=[100,1],mean=0.0,stddev=1.0,dtype=tf.float32,name='x')
y=tf.matmul(x,[[0.7]])+0.8
#创建权重为0.7,偏量为0.8的100条数据
return x,y
def get_weight(self):
"""
获取权重
:return:w
"""
initial_value=tf.random_normal(shape=[1,1],mean=1.0,stddev=1.0)
weight=tf.Variable(initial_value=initial_value,name='w')#随便取
return weight
def get_bias(self):
"""
获取偏置
:return:
"""
initial_value = tf.random_normal(shape=[1, 1], mean=1.0, stddev=1.0)
bias = tf.Variable(initial_value=initial_value, name='b')#随便取
return bias
def linear_model(self,x):
"""
构建线性模型
:param x: 特征值
:return:预测值
"""
with tf.variable_scope("linear_model"):
#x*w+b==w,b-->随机初始化,后续需要不断的重新赋值,更改
#随机初始化权重与偏置
self.weight=self.get_weight()
self.bias=self.get_bias()
#构建线性关系
y_predict=tf.matmul(x,self.weight)+self.bias
return y_predict
def loss(self,y_true,y_predict):
"""
计算均方差损失
:param y_true: 真实值
:param y_predict: 预测值
:return: 均方误差损失
"""
with tf.variable_scope("loss"):
#tf.square(y_true-y_predict)计算所有样本的误差的平方
#tf.reduce_mean-求平均值
loss=tf.reduce_mean(tf.square(y_true-y_predict))
return loss
def sgd(self,loss):
"""
进行梯度下降优化
:param loss:损失
:param loss:损失
:return:优化op
"""
with tf.variable_scope("sgd"):
#GradientDescentOptimizer-->sgd梯度下降优化算法
#minimize(loss)--损失减少
train_op=tf.train.GradientDescentOptimizer(self.leaning_rate).minimize(loss)
return train_op
def train(self):
"""
训练
构建线性模型
:return:
"""
#1、获取数据
x,y_true=self.build_data()
#2、构建线性模型
y_predict=self.linear_model(x)
#3、进行均方误差损失计算
loss=self.loss(y_true,y_predict)
#4、sgb梯度下降优化
train_op=self.sgd(loss)
#开启会话运行train_op
with tf.Session() as ss:
#显示初始化变量op
ss.run(tf.global_variables_initializer())
tf.summary.FileWriter("./tmp/",graph=ss.graph)
for i in range(120):
#序列化events文件
ss.run(train_op)
print("第%d次的损失为:%f,权重为:%f,偏置为:%f"%(
i,
loss.eval(),
self.weight.eval(),
self.bias.eval()
))
#1、实例化对象
lr=MyLinearRegression()
#2、调用train方法
lr.train()