手动计算渐变

以下代码应该是相当不言自明的,除了几个新元素:

  • random_uniform()函数在图形中创建一个节点,它将生成包含随机值的张量,给定其形状和值作用域,就像 NumPy 的rand()函数一样。
  • assign()函数创建一个为变量分配新值的节点。 在这种情况下,它实现了批次梯度下降步骤 \theta(next step)= \theta - \eta  \nabla_{\theta}MSE(\theta)
  • 主循环一次又一次(共n_epochs次)执行训练步骤,每 100 次迭代都打印出当前均方误差(MSE)。 你应该看到 MSE 在每次迭代中都会下降。
  1. housing = fetch_california_housing()
  2. m, n = housing.data.shape
  3. m, n = housing.data.shape
  4. # np.c_按colunm来组合array
  5. housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]
  6. scaled_housing_data_plus_bias = scale(housing_data_plus_bias)
  7. n_epochs = 1000
  8. learning_rate = 0.01
  9. X = tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name="X")
  10. y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name="y")
  11. theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name="theta")
  12. y_pred = tf.matmul(X, theta, name="predictions")
  13. error = y_pred - y
  14. mse = tf.reduce_mean(tf.square(error), name="mse")
  15. gradients = 2/m * tf.matmul(tf.transpose(X), error)
  16. training_op = tf.assign(theta, theta - learning_rate * gradients)
  17. init = tf.global_variables_initializer()
  18. with tf.Session() as sess:
  19. sess.run(init)
  20. for epoch in range(n_epochs):
  21. if epoch % 100 == 0:
  22. print("Epoch", epoch, "MSE =", mse.eval())
  23. sess.run(training_op)
  24. best_theta = theta.eval()