影视处理

Tensorflow 3:线性回归

2020-03-18  本文已影响0人  古风子
tf

基于TF1

我们对y = 8x+3做线性回归预测

详细代码

import tensorflow as tf
# 数据集
with tf.variable_scope("Data"):
    # 随机100条样本,每条样本一个特征值,值正态分布
    x = tf.random_normal(shape=[100, 1], mean=5.0, stddev=1.0, name="x_data")
    # 100条样子的目标值。人为设定权重8,偏置3.0
    y_true = tf.matmul(x, [[8.0]]) + 3.0

# 线性回归预测模型
with tf.variable_scope("Model"):
    # 权重初始值
    weight = tf.Variable(tf.random_normal(shape=[1, 1],
                                          mean=0.0,
                                          stddev=1.0,
                                          name="weight"))
    # 偏置初始值
    bais = tf.Variable(0.0, name="bais")
    # 预测值
    y_predict = tf.matmul(x, weight) + bais


# 损失函数
with tf.variable_scope("Loss"):
    # 均方误差
    loss = tf.reduce_mean(tf.square(y_true - y_predict))

#损失函数(Lost Function)是用来评估我们预测的值和真实的值之间的差距是多少,损失函数有很多种#写法,我们这里使用均方误差作为我们的损失函数;)损失函数的值越小越好,有些教程也叫Cost #Function

#定义优化器##
# 优化器
with tf.variable_scope("Optimizer"):
    # 梯度下降优化器
    train = tf.train.GradientDescentOptimizer(0.03).minimize(loss)

#优化函数代表我们要通过什么方式去优化我们需要学习的值,这个例子里指的是weight和bais,
#优化函数的种类有很多,平时我们用的比较多的是GradientDescentOptimizer和AdamOptimizer等,
#这里我们选用最常用也是最最基本的GradientDescentOptimizer(梯度下降),后面传入的值是学习
#效率。一般是一个小于1的数。越小收敛越慢,但并不是越大收敛越快哈,取值太大甚至可能不收敛了



# 变量初始化器
var_init = tf.global_variables_initializer()

# 收集需要在board上显示的tensor
tf.summary.scalar(name="Loss", tensor=loss)#显示标量信息
tf.summary.histogram(name="weight", values=weight)#显示直方图
summary_merged = tf.summary.merge_all()

# 运行
with tf.Session() as sess:
    # 建立事件文件
    fw = tf.summary.FileWriter(logdir='/home/jiadongfeng/tensorflow/board/', graph=sess.graph)

    sess.run(var_init)
    print("初始化 权重:{} 偏置:{}".format(weight.eval(), bais.eval()))

    for i in range(3000):
        # 训练
        sess.run(train)
        if i % 10 == 0:
            # 打印
            print("第{}次优化,权重:{} 偏置:{}".format(i, weight.eval(), bais.eval()))
            # 保存参数变化
            fw.add_summary(summary=sess.run(summary_merged), global_step=i)

输出结果

初始化 权重:[[2.734528]] 偏置:0.0
第0次优化,权重:[[12.215229]] 偏置:1.79318273067
第10次优化,权重:[[8.41327]] 偏置:1.14258658886
第20次优化,权重:[[8.342195]] 偏置:1.17200863361
第30次优化,权重:[[8.361684]] 偏置:1.21978008747
第40次优化,权重:[[8.371914]] 偏置:1.26391017437
第50次优化,权重:[[8.330644]] 偏置:1.29630839825
第60次优化,权重:[[8.325379]] 偏置:1.33381652832
第70次优化,权重:[[8.301124]] 偏置:1.36594009399
第80次优化,权重:[[8.305267]] 偏置:1.40126609802
第90次优化,权重:[[8.304716]] 偏置:1.4362360239
第100次优化,权重:[[8.291805]] 偏置:1.47307109833
...
第1280次优化,权重:[[8.021396]] 偏置:2.88953852654
第1290次优化,权重:[[8.019871]] 偏置:2.89200615883
第1300次优化,权重:[[8.020469]] 偏置:2.89465808868
第1310次优化,权重:[[8.019744]] 偏置:2.89687681198
第1320次优化,权重:[[8.020452]] 偏置:2.89916849136
第1330次优化,权重:[[8.0177765]] 偏置:2.90094971657
第1340次优化,权重:[[8.018569]] 偏置:2.90323352814
...
第2890次优化,权重:[[8.000576]] 偏置:2.99686932564
第2900次优化,权重:[[8.0005865]] 偏置:2.99693894386
第2910次优化,权重:[[8.000538]] 偏置:2.99700069427
第2920次优化,权重:[[8.000539]] 偏置:2.99706816673
第2930次优化,权重:[[8.0005245]] 偏置:2.99713230133
第2940次优化,权重:[[8.000518]] 偏置:2.99719953537
第2950次优化,权重:[[8.00053]] 偏置:2.99726390839
第2960次优化,权重:[[8.000543]] 偏置:2.99732971191
第2970次优化,权重:[[8.000494]] 偏置:2.99738407135
第2980次优化,权重:[[8.000498]] 偏置:2.99744796753
第2990次优化,权重:[[8.000494]] 偏置:2.99750232697

有结果可以看出,在迭代到1300次的时候,趋于稳定。

tensor 计算图

计算图

损失函数图

损失函数

有上图可知,在迭代达到1k-1.5k的时候,损失函数趋于达到最低值

权重变化分布图(DISTRIBUTIONS)

DISTRIBUTIONS

有上图可知,在迭代达到1k-1.5k的时候,权重值趋于达到实际值8

权重直方图(HISTOGRAMS)

扩展

梯度下降

1-官方解释:

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

2-通俗理解:

我们对一个多元函数求偏导,会得到多个偏导函数.这些导函数组成的向量,就是梯度.

一元函数的梯度可以理解为就是它的导数.

1-官方解释.

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是解析解。

2-通俗讲

梯度下降就是让梯度中所有偏导函数都下降到最低点的过程. 都下降到最低点了,那每个未知数(或者叫维度)的最优解就得到了,所以他是解决函数最优化问题的算法

梯度下降中的下降的意思是让函数的未知数随着梯度的方向运动;
什么是梯度的方向呢? 把这一点带入到梯度函数中, 结果为正, 那我们就把这一点的值变小一些,同时就是让梯度变小些;
当这一点带入梯度函数中的结果为负的时候, 就给这一点的值增大一些.

梯度下降

如上图,点A的导函数(此时把导函数看作梯度)为负,就让点A沿着函数轨迹往右移动一点;点B的导数为正,就让点B往左移动一点;这个移动的过程中,点A和店B的高度都在慢慢下降,所以这个过程叫做梯度下降.

在这个下降的过程中.因为我们并不知道哪一个点才是最低点,也没有办法来预测下降多少次才能到最低点;所以,先随机点出来,然后根据这个点每次下降;什么时候下降得到的值(点带入偏导函数得到的)和上一次的值基本基本一样,也就是相差特别特别小的时候,我们认为就到了最低点。

上一篇下一篇

猜你喜欢

热点阅读