- import tensorflow as tf
- import os
- # 定义命令行参数,"max_step", 100, "模型训练的步数", 三个参数都是必须的, max_step 在程序中引用的变量名, 100 是给第一个参数设置的默认值, 第三个参数是第一个参数的参数说明
- tf.App.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
- # 定义获取命令行参数的名字, 在程序中调用 aaa.max_step
- aaa = tf.App.flags.FLAGS
- def myregression():
- """实现一个线性回归"""
- with tf.variable_scope('data'):
- # 定义变量作用域, 使代码结构更清晰, 而且在 TensorBoard 可视化中显示更清晰
- # 1. 构造数据, x 特征值 [100, 1] y 目标值 [100]
- x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name='x_data')
- # 矩阵相乘必须是二维的
- y_true = tf.matmul(x, [[0.7]]) + 0.8
- with tf.variable_scope('model'):
- # 2. 建立线性回归模型: 1 个权重, 一个偏置
- # 随机初始化一个权重和偏置的值, 计算损失, 然后通过梯度下降不断寻找最小损失
- # 权重和偏置必须使用变量定义, 因为它们的值是需要不断改变的, trainable 参数指定是否随梯度下降进行优化, 默认 true
- weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0, name='w'), trainable=True)
- bias = tf.Variable(0.0, name='b')
- y_predict = tf.matmul(x, weight) + bias
- with tf.variable_scope('loss'):
- # 3. 建立损失函数, square 求平方, reduce_mean 求平均值
- loss = tf.reduce_mean(tf.square(y_true-y_predict))
- with tf.variable_scope('optimizer'):
- # 4. 梯度下降优化损失, 0.1 是学习率, minimize 最小化损失
- train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
- # 收集 tensor,losser 是在 TensorBoard 后台显示的名字
- tf.summary.scalar("losser", loss)
- tf.summary.histogram("w", weight)
- # 定义合并 tensor 的 op, 在 sess 中方便将其添加进事件中
- merge = tf.summary.merge_all()
- # 定义对变量进行初始化的 op
- init_op = tf.global_variables_initializer()
- # 定义一个保存模型的实例 op
- saver = tf.train.Saver()
- # 通过会话运行程序
- with tf.Session() as sess:
- # 初始化变量
- sess.run(init_op)
- # 打印最先随机初始化的权重和偏置
- print("随机初始化的参数权重:{}, 偏置:{}".format(weight.eval(), bias.eval()))
- # 建立事件文件
- filewriter = tf.summary.FileWriter("./tmp/summary/test", graph=sess.graph)
- # 加载模型, 覆盖模型当中的一开始随机初始化的参数, 让模型接着从上次被打断的地方的参数继续进行
- if os.path.exists("./tmp/ckpt/model/checkpoint"):
- saver.restore(sess, "./tmp/ckpt/model")
- # 循环运行优化
- for i in range(aaa.max_step):
- sess.run(train_op)
- # 运行合并的 merge op
- summ = sess.run(merge)
- # 将 summ 添加入事件中
- filewriter.add_summary(summ, i)
- print("第 {} 次优化的参数权重:{}, 偏置:{}".format(i, weight.eval(), bias.eval()))
- # 保存模型, model 保存模型的名字, 一定要有
- saver.save(sess, "./tmp/ckpt/model")
- if __name__ == "__main__":
- myregression()
来源: http://www.bubuko.com/infodetail-3484034.html