在了解了TensorFlow的基本用法之后, 我们来进行一个小小的实战.
实战
首先我们会给出一个一元一次方程: y = 0.1x + 0.2
我们会给x赋值100次, 得到100个y值, 来作为我们这次的数据源
然后通过TensorFlow, 使用这100个数据, 通过200次梯度下降算法迭代, 来计算y = kx + b 的k和b, 进而还原出方程
代码
import tensorflow as tf
import numpy as np
#使用numpy生成100个随机点
x_data = np.random.rand(100)
y_data = x_data*0.1 + 0.2
#构造一个线性模型
b = tf.Variable(1.0)
k = tf.Variable(0.5)
y = k*x_data + b
#二次代价函数
loss = tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降算法来进行训练的优化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
#最小化代价函数
train = optimizer.minimize(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, sess.run([k, b]))
输出:
0 [0.28845701, 0.6007117]
20 [0.088952653, 0.20587215]
40 [0.093617611, 0.2033923]
60 [0.096312739, 0.2019598]
80 [0.097869784, 0.20113224]
100 [0.098769322, 0.2006541]
120 [0.099289015, 0.2003779]
140 [0.099589236, 0.20021832]
160 [0.099762686, 0.20012614]
180 [0.099862881, 0.20007287]
200 [0.099920787, 0.2000421]
语法补充
1. tf.reduce_mean
tensorflow中有一类在tensor的某一维度上求值的函数。如:
求最大值tf.reduce_max(input_tensor, reduction_indices=None, keep_dims=False, name=None)
求平均值tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
参数1--input_tensor:待求值的tensor。
参数2--reduction_indices:在哪一维上求解。
参数(3)(4)可忽略
举例说明:
# 'x' is [[1., 2.]
# [3., 4.]]
x是一个2维数组,分别调用reduce_*函数如下:
首先求平均值:
tf.reduce_mean(x) ==> 2.5 #如果不指定第二个参数,那么就在所有的元素中取平均值
tf.reduce_mean(x, 0) ==> [2., 3.] #指定第二个参数为0,则第一维的元素取平均值,即每一列求平均值
tf.reduce_mean(x, 1) ==> [1.5, 3.5] #指定第二个参数为1,则第二维的元素取平均值,即每一行求平均值
同理,还可用tf.reduce_max()求最大值等。
2. optimizer.minimize(loss)
计算模型相关参数的损失梯度, 然后根据计算所得的梯度更新变量, 使loss变小