TensorFlow学习笔记(一)hello world

680 阅读3分钟

最近在coursera开始学习TensorFlow课程,整理下知识点以做备忘。

关于机器学习

举个例子,我们平时写的程序大致是这样的。

输入的是数据和规则,输入的是计算结果。

而对于机器学习,输入的是数据和对应的结果,输出的是规则。

因为这一特性,机器学习能解决传统程序很难解决的问题。如人脸识别,我们很难找到用来区别人脸和其他物体的一种规则。却可以利用机器学习,通过输入大量的人脸数据,使其学到这种规则。

TensorFlow中的"hello world"

学习一门新的语言时,往往是从"hello world"开始的,它帮我们熟悉程序的编译和运行过程。

在学习TensorFlow时,同样也是从一个简单的例子入门。假设我们收集到这样一组数据

房间数量 价格(万元)
1 100
2 150
3 200
4 250
5 300

我们能很容易发现房间数量和价格之间的规则:y = 50x + 50。我们通过TensorFlow提供的能力,写程序去学到这个规则。

这里首先导入了tensorflow模块。然后又导入了numpy模块,它帮助我们用向量的方式表示输入的数据。keras是将神经网络定义成一系列连续的层的框架,我们也导入进来。

import tensorflow as tf
import numpy as np
from tensorflow import keras

接下来,我们创建一个最简单的神经网络,只有一层,一个神经元和一个输入数据。

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

现在,我们需要编译这个神经网络。在编译时,需要指定优化函数和损失函数。在这个例子中,这两个函数被很好的封装了起来,这里简单的解释下做了什么。

我们已经知道,房间数量和价格之间的规则是y = 50x + 50

当程序尝试去“学习”这个规则的时候,会先做一个猜测...可能是y = 10x + 100。损失函数会评价这个猜测的好坏,优化函数会进行下一个猜测,并会去尝试最小化损失函数的结果。比如接下来可能会猜测y = 30x + 70,这个仍然比较差,但是会比上一个猜测更接近正确结果。

接下来会重复EPOCHS次猜测,EPOCHS的含义在后面会讲到。我们这里用的损失函数是“STOCHASTIC GRADIENT DESCENT”,优化函数是“MEAN SQUARED ERROR”。先不用明白这两个函数的原理,只需要知道它很有效就行...

model.compile(optimizer='sgd', loss='mean_squared_error')

接下来我们把数据填充进去。这里有5组数据,我们用numpy提供的np.array来表示它们。

xs = np.array([1.0,  2.0, 3.0, 4.0, 5.0], dtype=float)
ys = np.array([100.0, 150.0, 200.0, 250.0, 300.0], dtype=float)

model.fit函数会训练这个神经网络,用来学习xs和ys之间的关系。这里会迭代epochs次我们上面说到的那些操作,即猜测,计算损失函数,利用优化函数做下一个猜测。当运行这个代码时,会输出每次迭代的损失等信息。

model.fit(xs, ys, epochs=700)

到这里为止,我们已经学到了xy之间的关系。接下来我们用model.predict函数来计算下未知的x对应的预测结果y。举个例子,如果我们输入x = 7.0,看下预测的结果是否是400?

print(model.predict([7.0]))

执行后,发现结果是402.93878,非常接近400。

输出结果不是400是神经网络的机制导致的,在这个例子中所有的数据都是完全满足y=50x+50的,但现实中基本不会有这种情况,数据并不能完全满足某个规则,神经网络得到的结果也是最大概率会满足数据的一种规则。