(二)tensorflow入门之使用tensorflow预测一元一次函数的参数(梯度下降法)

首先需要讲一个东西,优化器Optimizer。我们Optimizer是一个抽象类,我们一般用其子类 GradientDescentOptimizer,一个基于梯度下降的优化器。

GradientDescentOptimizer的初始化函数如下:

__init__(
    learning_rate,
    use_locking=False,
    name='GradientDescent'
)

其中

learning_rate为学习率,就是梯度下降算法中的步长

use_locking为是否使用锁,这个一般默认否

name为名字,默认就好

GradientDescentOptimizer还有一个重要的方法是minimize方法

minimize(
    loss,
    global_step=None,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    name=None,
    grad_loss=None
)

其中

loss为一个要最小化的张量

global_step为一个可选变量,在每次优化后自增1(好像没用呀)

var_list为要优化的变量列表,如果不定义的话,优化器会自动去loss张量的图中找变量来优化

其他的。。。一般没用到。。。

**除了优化器外,还要讲两个常用函数,其中一个是tf.reduce_mean **

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

reduce_mean(input_tensor,
                axis=None,
                keep_dims=False,
                name=None,
                reduction_indices=None)

第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
第四个参数name: 操作的名称;

第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;

类似函数还有:

tf.reduce_sum :计算tensor指定轴方向上的所有元素的累加和;
tf.reduce_max : 计算tensor指定轴方向上的各个元素的最大值;
tf.reduce_all : 计算tensor指定轴方向上的各个元素的逻辑和(and运算);

tf.reduce_any: 计算tensor指定轴方向上的各个元素的逻辑或(or运算);

**还有一个函数是tf.square **

tf.square(x)就简单了,对x内所有的元素进行平方。

好了,直接开干代码如下

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


# 定义好初始数据
x_data = np.random.rand(100)
# 这个就是我们要逼近的函数了
y_data = x_data * 0.1 + 0.3


# 定义两个变量作为优化目标,0.的意思表示我们需要使用一个小数
k = tf.Variable(0.5)
b = tf.Variable(0.5)
# 画个图来表示最后要输出的y
y = k * x_data + b

# 定义好误差为真实数据与模拟数据的差的平方和,注意y在前,y_data在后
loss = tf.reduce_mean(tf.square(y - y_data))

#定义一个优化器来进行优化
optimizer = tf.train.GradientDescentOptimizer(0.2)

# 调用minimize方法自动去找变量k和b,使用梯度下降法优化这两个值
train = optimizer.minimize(loss)

#因为用到了变量,需要搞个初始化的东西
init = tf.global_variables_initializer()

with tf.Session() as sess:
    # 不要忘了初始化变量
    sess.run(init)
    # 训练两百次
    for step in range(200):
        sess.run(train)
        if step % 20 == 0:
            print(step,sess.run([k,b]))

输出如下

0 [0.38804856, 0.32861382]
20 [0.21618558, 0.22901425]
40 [0.16851577, 0.25813898]
60 [0.14040442, 0.27531412]
80 [0.12382691, 0.2854425]
100 [0.114050955, 0.2914153]
120 [0.10828598, 0.29493752]
140 [0.10488632, 0.2970146]
160 [0.102881506, 0.2982395]
180 [0.10169925, 0.29896182]

可以看到两个变量逐渐向原来的参数逼近

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值