# TensorFlow从0到1 - 5 - TensorFlow轻松搞定线性回归

TensorFlow的API有低级和高级之分。

## 第一个机器学习的TF实现

TensorFlow的计算分为两个阶段：

• 构建计算图；
• 执行计算图。

```import tensorflow as tf

# model parameters
a = tf.Variable([-1.], tf.float32)
b = tf.Variable([50.], tf.float32)

# model input and output
x = tf.placeholder(tf.float32)
linear_model = a * x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) / 8

# training data
x_train = [22, 25, 28, 30]
y_train = [18, 15, 12, 10]

# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)  # 1st

print("loss: %s" % (sess.run(loss, {x: x_train, y: y_train})))

# 2nd
fixa = tf.assign(a, [-1.])
fixb = tf.assign(b, [40.])
sess.run([fixa, fixb])

print("loss: %s" % (sess.run(loss, {x: x_train, y: y_train})))```

```loss: 50.0
loss: 0.0```

B-P-F-1 损失函数

## tf.train API

```import tensorflow as tf

# model parameters
a = tf.Variable([-1.], tf.float32)
b = tf.Variable([50.], tf.float32)

# model input and output
x = tf.placeholder(tf.float32)
linear_model = a * x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) / 8   # sum of the squares

# training data
x_train = [22, 25, 28, 30]
y_train = [18, 15, 12, 10]

# optimizer
train = optimizer.minimize(loss)

# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})

# evaluate training accuracy
curr_a, curr_b, curr_loss = sess.run([a, b, loss], {x: x_train, y: y_train})
print("a: %s b: %s loss: %s" % (curr_a, curr_b, curr_loss))```

• TF官方的训练数据是x_train = [1, 2, 3, 4]，y_train = [0, -1, -2, -3]，而我们的训练数据是“平行世界”的观察记录x_train = [22, 25, 28, 30]，y_train = [18, 15, 12, 10]。
• TF官方的(a, b)初始值是(.3, -.3), 我们的是(-1., 50.)。
• 或许你还发现在官方版本的loss函数末尾没有`/ 8`，是因为我使用均方差的缘故，8由4x2得到（4个训练数据）。

`a: [ nan] b: [-inf] loss: nan`

```for i in range(49):
sess.run(train, {x: x_train, y: y_train})
curr_a, curr_b, curr_loss = sess.run([a, b, loss], {x: x_train, y: y_train})
print("a: %s b: %s loss: %s" % (curr_a, curr_b, curr_loss))```

overflow

TF实际是工作的，并没有撂挑子。只是它训练时每次调整(a, b)都幅度很大，接下来又矫枉过正且幅度越来越大，导致最终承载a和b的tf.float32溢出而产生了nan。这不是TF的一个bug，而是算法本身、训练数据、学习率、训练次数共同导致的（它们有个共同的名字：超参数。）。可见，训练是一门艺术

`a: [-1.02855277] b: [ 40.75948715] loss: 0.00379487`

```import tensorflow as tf

# model parameters
a = tf.Variable([-1.], tf.float32)
b = tf.Variable([50.], tf.float32)

# model input and output
x = tf.placeholder(tf.float32)
linear_model = a * x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) / 8   # sum of the squares

# training data
x_train = [22, 25, 28, 30]
y_train = [18, 15, 12, 10]

# optimizer
train = optimizer.minimize(loss)

# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(70000):
sess.run(train, {x: x_train, y: y_train})

# evaluate training accuracy
curr_a, curr_b, curr_loss = sess.run([a, b, loss], {x: x_train, y: y_train})
print("a: %s b: %s loss: %s" % (curr_a, curr_b, curr_loss))```

## TensorBoard

TF的另一个强大之处就是可视化算法的TensorBoard，把构造的计算图显示出来。图中显示，每一个基本运算都被独立成了一个节点。除了图中我标注的Rank节点、range节点，start节点、delta节点外，其他节点都是由所写代码构建出来的。

TensorBoard

## 词汇表

• derivative； 导数；
• estimator： 估计；
• inference： 推理；
• linear regression：线性回归；
• loss function： 损失函数；
• magnitude： 量；
• optimal： 最优的；
• optimizers： 优化器；

37 篇文章31 人订阅

0 条评论

## 相关文章

### 谷歌发布 TensorFlow Fold，支持动态计算图，GPU 增速 100 倍

【新智元导读】谷歌官方博客最新发布TensorFlow Fold，通过为每个输入构建单独的计算图解决由于输入的大小和结构不同导致的问题。此外，通过动态批处理，实...

39590

36470

38050

### 机器学习库初探之 Caffe

Caffe 是一个清晰而高效的深度学习框架，其作者是博士毕业于 UC Berkeley 的贾扬清，目前在 Facebook 工作。Caffe 是纯粹的 C++/...

1.4K20

65170

38060

1.1K00

13430

12610

69610