Tensorflow框架学习记录–day01–API以及案例:实现线性回归
基础API
tf.app
这个模块相当于为tensorflow进行的脚本提供一个main函数入口。
tf.image
tensorflow的图像处理操作。主要是一些颜色变化、变形和图像的编码和解码。
tf.gfile
这个模块提供了一组文件操作函数。
tf.summary
用来生成tensorboard可用的统计日志,目前Summary主要提供了4种类型:audio、image、histogram、scalar
tf.python_io
用来读写TFRecords文件
tf.train
这个模块提供了一些训练器,与tf.nn组合起来,实现一些网络的优化计算。
tf.nn
这个模块提供了一些构建神经网络的底层函数。tensorflow构建网络的核心模块。其中包含了添加各种层的函数,比如添加卷积层、池化层等。
高级API
tf.keras
keras本来是一个独立的深度学习库,tensorflow将其学习过来,增加这部分模块在于快速构建模型。
tf.layers
高级API,以更高级的概念层来定义一个模型。类似tf.keras。
tf.contrib
tf.contrib.layers提供够将计算图中的 网络层、正则化、摘要操作、是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变。
tf.estimator
一个Estimator相当于Model+Training+Evaluate的合体。在模块种,已经实现了几种简单的分类器和回归器,包括:Baseline,Learing,DNN。这里的DNN网络,只是全连接网络,没有提供卷积之类的。
案例:实现线性回归
线性回归原理
根据数据建立回归模型,w1x1+w2x2+…+b=y,通过真实值与预测值之间建立误差,使用梯度下降优化得到损失最小对应的权重和偏置。最终确定模型的权重和偏置参数。最后可以用这些参数进行预测。
- 构建模型
y = w1x1+w2x2+…+b - 构造损失函数
均方误差(MSE) - 优化损失
梯度下降
准备真实的数据 100个样本 x 特征值 形状(100,1)(指的是一百行一列–形状) y_true 目标值(100,1) y_true = 0.8x + 0.7 假定x和y之间的关系满足:y = kx + b(k ≈ 0.8, b ≈ 0.7) 流程分析:
(100, 1) * (1, 1) = (100, 1)【其中*指的是矩阵乘法–matimul】 y_predict = x * weights(1, 1) + bias(1, 1) y_predict = tf.matmul(x, weights) + bias
API
运算: 矩阵运算:tf.matumul(x,w) 平方:tf.square(error) 均值:tf.reduce_mean(error) 梯度下降优化: tf.train.GradientDescentOptimizer(learning_rate)【tf.compat.v1.train.GradientDescentOptimizer】 梯度下降优化 learning_rate :学习率,一般为0-1之间比较小的值 method: minimize(lose) return:梯度下降op
- 构建模型
y_predict = tf.matmul(x, weights) + bias - 构造损失函数
error = tf.reduce_mean(tf.square(y_predict - y_true)) - 优化损失
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
增加其他功能
- 变量tensorboard显示
- 增加命名空间
- 模型保存与加载
- 命令行参数设置
1 增加变量显示
目的:在tensorboard当中观察模型的参数、损失值等变量值的变化
1)收集变量 1、tf.summary.scalar(name=",tensor)收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值; 2、tf.summary.histogram(name=’’,tensor)收集高维度的变量参数–直方图(二维) 3、tf.summary.image(name=’'mtensor)收集输入的图片张量能显示图片–图片(三维) 2)合并变量写入事件文件 1、merged = tf.summary.merge_all() 2、运行合并:summary = sess.sun(merged),每次迭代都需运行 3、添加:FileWriter.add_summary(summary,i),i表示第几次的值。
相关代码:
file_writer = tf.compat.v1.summary.FileWriter("./tmp/linear", graph=sess.graph)
tf.compat.v1.summary.scalar("error", error)
tf.compat.v1.summary.histogram("weights", weights)
tf.compat.v1.summary.histogram("bias", bias)
merged = tf.compat.v1.summary.merge_all()
summary = sess.run(merged)
file_writer.add_summary(summary, i)
2 增加命名空间
使得代码结构更加清晰,tensorboard图结构清楚
3 模型的保存与加载
tf.train.Saver(var_list=None,max_to_keep=5) 保存和加载模型(格式:checkpoint文件–ckpt) var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递 max_to_keep:指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件,如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件) 相关代码:
if i % 10 == 0:
saver.save(sess, "./tmp/model/my_linear.ckpt")
if os.path.exists("./tmp/model/checkpoint"):
saver.restore(sess, "./tmp/model/my_linear.ckpt")
print("训练前模型参数为:权重%f, 偏置%f, 损失为%f" % (weights.eval(), bias.eval(), error.eval())
4 学习率的设置、步数设置与梯度爆炸
学习率愈大,训练到较好结果的步数越小;学习率越小,训练倒较好结果的步数越大。 但是学习过大会出现梯度爆炸现象。 梯度爆炸: 在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值 如何解决梯度爆炸问题?
- 重新设计网络
- 调整学习率
- 使用梯度截断(在训练过程中检查和限制梯度的大小)
- 使用激活函数
5 变量的trainable设置观察
trainable的参数作用,指定是否训练
全部代码:
def linear_regression():
"""
自实现一个线性回归
"""
with tf.compat.v1.variable_scope("prepare_data"):
X = tf.compat.v1.random_normal(shape=[100, 1], name="feature")
y_true = tf.matmul(X, [[0.8]]) + 0.7
with tf.compat.v1.variable_scope("create_model"):
weights = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=[1, 1]), name="Weights")
bias = tf.Variable(initial_value=tf.compat.v1.random_normal(shape=[1, 1]), name="Bias")
y_predict = tf.matmul(X, weights) + bias
with tf.compat.v1.variable_scope("loss_function"):
error = tf.reduce_mean(tf.square(y_predict - y_true))
with tf.compat.v1.variable_scope("optimizer"):
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
tf.compat.v1.summary.scalar("error", error)
tf.compat.v1.summary.histogram("weights", weights)
tf.compat.v1.summary.histogram("bias", bias)
merged = tf.compat.v1.summary.merge_all()
saver = tf.compat.v1.train.Saver()
init = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
sess.run(init)
file_writer = tf.compat.v1.summary.FileWriter("./tmp/linear", graph=sess.graph)
print("训练前模型参数为:权重%f, 偏置%f, 损失为%f" % (weights.eval(), bias.eval(), error.eval()))
for i in range(100):
sess.run(optimizer)
print("训练前模型参数为:权重%f, 偏置%f, 损失为%f" % (weights.eval(), bias.eval(), error.eval()))
summary = sess.run(merged)
file_writer.add_summary(summary, i)
if i % 10 == 0:
saver.save(sess, "./tmp/model/my_linear.ckpt")
if os.path.exists("./tmp/model/checkpoint"):
saver.restore(sess, "./tmp/model/my_linear.ckpt")
print("训练前模型参数为:权重%f, 偏置%f, 损失为%f" % (weights.eval(), bias.eval(), error.eval()))
return None
tensorboard显示: graphs: SCALARS: DISTRIBUTIONS:
HISTOGRAMS: 以上!!!!
|