目录
API
一、准备数据(初始化随机数)
这里我们设置的函数模型:
y = weight*x + bias
weight = 0.8
bias = 0.7
初始化[100,1]的随机数:
# 初始化随机数(100行,1列)
x = tf.random_normal(shape=[100,1])
二、获取真实值
# 真实值
y_true = tf.matmul(x, [[0.8]]) + 0.7
三、获取预测值(根据随机生成的权重和偏置)
1、随机生成权重和偏置
# 3-1、随机生成权重和偏置
weight = tf.Variable(initial_value=tf.random_normal(shape=[1,1])) #权重
bias = tf.Variable(initial_value=tf.random_normal(shape=[1,1])) #偏置
2、 获取预测值
根据上面生成的权重和偏置做预测。
# 3-2、预测值(用随机权重参数做预测)
y_predict = tf.matmul(x, weight) + bias
四、构造损失函数
这里的损失,采用的均方误差计算:
# 4、构造损失函数
error = tf.reduce_mean(tf.square(y_predict-y_true))
# 平均 平方 (预测值-真实值)
五、梯度下降优化
以上面得到的误差作为损失,在梯度下降优化中训练。
API:
它的方法:minimize(loss)中的loss对象,“loss”是需要最小化的目标。
# 5、梯度下降优化(优化损失)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
# 学习率 最小化损失(目标)
注:学习率过大可能会出现梯度爆炸的现象(学傻了)
trainable参数可以设置是否可训练:
六、会话(执行)
做1次训练:
# 训练(基于梯度下降优化)
for i in range(1):
sess.run(optimizer)
可以发现有一些效果了,但是还不够明显。
做10次训练:
# 训练(基于梯度下降优化)
for i in range(10):
sess.run(optimizer)
做100次训练:
# 训练(基于梯度下降优化)
for i in range(100):
sess.run(optimizer)
可以发现效果已经很接近预期的weight=0.8和bias=0.7了。
做1000次训练:
# 训练(基于梯度下降优化)
for i in range(1000):
sess.run(optimizer)
优化完成,权重和偏置已经基本上达到了预期的weight=0.8,bias=0.7了。
七、可视化
1、创建事件文件
# 可视化(1)创建事件文件
file_writer = tf.summary.FileWriter("C:\\Users\\Administrator\\Desktop\\summary", graph=sess.graph)
2、收集变量
# 可视化(2)收集变量
tf.summary.scalar('error', error)
tf.summary.histogram('weight', weight)
tf.summary.histogram('bias', bias)
3、合并变量
# 可视化(3)合并变量
merge = tf.summary.merge_all()
4、在会话中运行变量
# 可视化(4)运行变量(合并后的变量)
summary = sess.run(merge)
5、每次迭代将变量写入文件
# 可视化(5)每次迭代的变量写入事件
file_writer.add_summary(summary, i)
执行完之后,可以看到结果:
八、模型保存与加载
1、创建saver对象
# 模型保存与加载(1)创建Saver模型
saver = tf.train.Saver()
2、保存模型
# 模型保存与加载(2)保存模型
if i%10==0:
saver.save(sess, 'C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt')
3、加载模型
# 模型保存与加载(3)加载模型
if os.path.exists('C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt'):
saver.restore(sess, 'C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt')
ok,能够看出,模型成功保存!
总代码
# 自实现线性回归
import tensorflow as tf
import os
# 1、准备数据
# 初始化随机数(100行,1列)
x = tf.random_normal(shape=[100, 1])
# 2、获取真实值
y_true = tf.matmul(x, [[0.8]]) + 0.7
# 3、随机生成权重和偏置,获取预测值
# 3-1、随机生成权重和偏置
weight = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 权重
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 偏置
# 3-2、预测值(用随机权重参数做预测)
y_predict = tf.matmul(x, weight) + bias
# 4、构造损失函数
error = tf.reduce_mean(tf.square(y_predict - y_true))
# 平均 平方 (预测值-真实值)
# 5、梯度下降优化(优化损失)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
# 学习率 最小化损失(目标)
# 可视化(2)收集变量
tf.summary.scalar('error', error)
tf.summary.histogram('weight', weight)
tf.summary.histogram('bias', bias)
# 可视化(3)合并变量
merge = tf.summary.merge_all()
# 模型保存与加载(1)创建Saver模型
saver = tf.train.Saver()
# 变量初始化
init = tf.global_variables_initializer()
# 会话(执行)
with tf.Session() as sess:
# 变量初始化
sess.run(init)
print('训练前模型参数:权重%f,偏置%f,损失%f' % (weight.eval(), bias.eval(), error.eval()))
# 可视化(1)创建事件文件
file_writer = tf.summary.FileWriter("C:\\Users\\Administrator\\Desktop\\summary", graph=sess.graph)
# 训练(基于梯度下降优化)
for i in range(100):
sess.run(optimizer)
# 可视化(4)运行变量(合并后的变量)
summary = sess.run(merge)
# 可视化(5)每次迭代将变量写入事件
file_writer.add_summary(summary, i)
# 模型保存与加载(2)保存模型
if i%10==0:
saver.save(sess, 'C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt')
# # 模型保存与加载(3)加载模型
# if os.path.exists('C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt'):
# saver.restore(sess, 'C:\\Users\\Administrator\\Desktop\\summary\\model.ckpt')
print('训练后模型参数:权重%f,偏置%f,损失%f' % (weight.eval(), bias.eval(), error.eval()))