# 使用线性回归预测肥胖
# 1、导入相应的包
import tensorflow as tf
# 2、定义权重和偏置
W = tf.Variable(tf.zeros([2,1]),name="weights")
b = tf.Variable(0.,name="bias")
# 3、定义拟合关系,这里为线性函数
def inference(X):
return tf.matmul(X,W) + b
# 4、定义损失函数
def loss(X,Y):
# 获取预测值,并将其转化为一个列向量
Y_predicted = tf.transpose(inference(X),name="get_Y_predicted")
# 对两个向量对应的值求均方误差并累计求和计算损失返回
return tf.reduce_sum(tf.squared_difference(Y,Y_predicted))
# 5、定义数据源
# Data from http://people.sc.fsu.edu/~jburkardt/datasets/regression/x09.txt
def inputs():
weight_age = [[84, 46], [73, 20], [65, 52], [70, 30], [76, 57], [69, 25], [63, 28], [72, 36], [79, 57], [75, 44],
[27, 24], [89, 31], [65, 52], [57, 23], [59, 60], [69, 48], [60, 34], [79, 51], [75, 50], [82, 34],
[59, 46], [67, 23], [85, 37], [55, 40], [63, 30]]
blood_fat_content = [354, 190, 405, 263, 451, 302, 288, 385, 402, 365, 209, 290, 346, 254, 395, 434, 220, 374, 308,
220, 311, 181, 274, 303, 244]
# 将数值转化为浮点类型并返回
return tf.to_float(weight_age),tf.to_float(blood_fat_content)
# 6、定义训练参数及训练方法
def train(total_loss):
# 定义学习率
learning_rate = 0.000005
return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)
# 7、评估验证
def evaluate(sess, X, Y):
print(sess.run(inference([[50., 20.]]))) # ~ 303
print(sess.run(inference([[50., 70.]]))) # ~ 256
print(sess.run(inference([[90., 20.]]))) # ~ 303
print(sess.run(inference([[90., 70.]]))) # ~ 256
# Launch the graph in a session, setup boilerplate
with tf.Session() as sess:
# 初始化所有变量
tf.global_variables_initializer().run()
# 获得输入特征与标签值向量
X, Y = inputs()
# 计算损失
total_loss = loss(X, Y)
# 执行训练
train_op = train(total_loss)
# 创建一个协调器,管理线程
coord = tf.train.Coordinator()
# 启动QueueRunners, 此时文件名队列已经进队。
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# 定义循环次数
training_steps = 100000
try:
for step in range(training_steps):
sess.run([train_op])
if step % 1000 == 0:
print("Epoch:", step, " loss: ", sess.run(total_loss))
print("Final model W=", sess.run(W), "b=", sess.run(b))
except Exception as e:
# 将异常抛给coordinator,通知线程停止
coord.request_stop(e)
finally:
# 模型评估
evaluate(sess, X, Y)
# 请求该线程停止
coord.request_stop()
# 等待被指定的线程终止
coord.join(threads)
sess.close()