创建数据

1
2
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3

搭建模型

1
2
3
4
5
#weights and biases是需要训练的变量
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases = tf.Variable(tf.zeros([1]))

y = Weights*x_data + biases

计算损失

1
2
3
4
5
loss = tf.reduce_mean(tf.square(y-y_data))
#官方API 解释
# tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
# Computes the mean of elements across dimensions of a tensor. Reduces input_tensor along the dimensions given in axis. Unless keep_dims is true, the rank of the tensor is reduced by 1 for each entry in axis. If keep_dims is true, the reduced dimensions are retained with length 1.If axis has no entries, all dimensions are reduced, and a tensor with a single element is returned.
# 这里没有设置axis,就是用所有维度上的元素求出平均,并且返回一个只有一个元素的张量,致力于表示损失

传递误差

这里用的误差传递方法是梯度下降法: Gradient Descent ,
“tf.train.GradientDescentOptimizer(0.5)”被用作参数的更新.

1
2
3
# 梯度下降算法的优化器
train = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
# 0.5是训练时梯度下降算法的步长,也叫学习率 loss也叫cost,指的是当前模型的损失

奇葩

1
2
init = tf.global_variables_initializer()
#初始化所有数据,虽然总感觉有点奇怪。但是奇葩是个褒义词。训练开始前初始化所有变量是个好习惯,特别是调参的时候,一份code要run all多次,初始化可以解决不必要的麻烦

训练

1
2
3
4
5
6
7
sess = tf.Session()
sess.run(init)
# TensorFlow 是一个符号主义的库,因此上面只是构建好了神经网络,并不会不执行上面的 init 。TensorFlow 都是在会话中进行的;所以要创建一个会话 (sess) 然后使用 sess.run() 去执行所有的操作
for i in range(2000):
sess.run(train)
if i % 20 == 0:
print (i,sess.run(weights),sess.run(biases))