使用Tensoflow实现梯度下降算法的一次线性拟合

# Author Qian Chenglong
import tensorflow as tf
import  numpy as np

#生成100个随机数据点
x_date=np.random.rand(100)
y_date=x_date*0.1+0.2

#构造一个线性模型
k=tf.Variable(0.)
b=tf.Variable(0.)
y=k*x_date+b

# 二次代价函数
loss=tf.reduce_mean(tf.square(y-y_date))#最小二乘

my_optimizer=tf.train.GradientDescentOptimizer(0.2)#定义一个使用梯度下降算法的训练器
train=my_optimizer.minimize(loss)#训练目标loss最小

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

with tf.Session() as sess:
  sess.run(init)
  for step in range(201):
    sess.run(train)
    if step%20==0:
        print(step, '[k,b]:', sess.run([k, b]))

 API说明:

np.random.rand(100)生成100个0~1之间的随机数

tf.square():计算元素的平方

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

计算张量的各个维度上的元素的平均值。

axis是tf.reduce_mean函数中的参数,按照函数中axis给定的维度减少input_tensor。除非keep_dims是true,否则张量的秩将在axis的每个条目中减少1。如果keep_dims为true,则缩小的维度将保留为1。 如果axis没有条目,则减少所有维度,并返回具有单个元素的张量。

参数:

  • input_tensor:要减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为None(默认),则减少所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的缩小尺寸。
  • name:操作的名称(可选)。
  • reduction_indices:axis的不支持使用的名称。
tf.Variable(initializer, name):initializer是初始化参数,可以有tf.random_normal,tf.constant,tf.constant等,name就是变量的名字,用法如下:
a1 = tf.Variable(tf.random_normal(shape=[2,3], mean=0, stddev=1), name='a1')
a2 = tf.Variable(tf.constant(1), name='a2')
a3 = tf.Variable(tf.ones(shape=[2,3]), name='a3')
!

运行session.run()可以:

  1. 获得你要得到的运算结果;
  2. 你所要运算的部分;
 
#qiancl 666
import tensorflow as tf
import numpy as np
#学习率
learning_rate=0.01
#最大训练步数
max_train_step=1000
#np.array()矩阵
train_X_date=np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],[9.779],[6.182],[7.59],[2.167],
                       [7.042],[10.791],[5.313],[7.997],[5.654],[9.27],[3.1]],dtype=np.float32)
train_Y_date=np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],[3.366],[2.596],[2.53],[1.221],
                       [2.827],[3.465],[1.65],[2.904],[2.42],[2.94],[1.3]],dtype=np.float32)
#样本个数
tolal_samples=train_X_date.shape[0]
#输入数据占位
x=tf.placeholder(tf.float32,[None,1])
y_=tf.placeholder(tf.float32,[None,1])
#tf.random_normal([1,1])生成【1,1】的符合正态分布的随机数
w=tf.Variable(tf.random_normal([1,1]),name="weight")
b=tf.Variable(tf.zeros([1]),name="bias")
y=tf.matmul(x,w)+b
loss=tf.reduce_sum(tf.pow(y-y_,2))/tolal_samples

#创建优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate)

#训练目标
train_op=optimizer.minimize(loss)

#训练
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print("开始训练")
    for step in range(max_train_step):
        sess.run(train_op, feed_dict={x: train_X_date, y_: train_Y_date})
        if step % 100 == 0:
            c = sess.run(loss, feed_dict={x: train_Y_date, y_: train_Y_date})
            print("Step:%d, loss==%0.4f, w==%0.4f, b==%0.4f" % (step, c, sess.run(w), sess.run(b)))
原文地址:https://www.cnblogs.com/long5683/p/10045957.html