TensorFlow/[TensorFlow 学习笔记 ] 1 机器学习入门
机器学习不仅仅是一个与传统编程不同的学科,更是代表了一种新的编程范式。
我们首先从高层次来看下,机器学习与传统的编程范式有何不同?
我们需要输入规则和数据,程序输出答案。
而在机器学习中,编程范式如下图所示:
我们输入的数据和对应的答案,机器学习会从这些数据中学习,最终输出学习到的规则。
下面我们来看一个例子,看看机器学习(深度学习)是如何运作的。
在这个例子中,我会使用神经网络来学习两个数字之间的关系。
下面的代码展示了 x
和 y
2 个数之间的关系,我们知道它们之间的关系是 \(y=2 \times x -1\)。
1 | float hw_function(float x){ |
如果给出一系列的 x
和 y
:
1 | x: [1, 2, 3, 4, 5, 6, 7, 8] |
把这些数据输入到神经网络,神经网络会学习到它们之间的关系。
这与传统的编程范式很不一样,下面我们来一步一步编写代码,实现这个模型。
导入库
我们首先导入必要的库。
1 | import tensorflow as tf |
定义和编译模型
接着,我们定义一个最简单的神经网络。它只有一层,并且这一层只有一个神经元,输入数据的形状是 1。
1 | model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])]) |
下一步,我们需要编译模型,这需要使用到优化器(optimizer)和损失函数(loss)。
我们来了解一下这两个概念。
我们知道 x
和 y
之间的关系是 \(y=2 \times x -1\)。
但是当神经网络开始学习时,它会做一个猜测,例如 \(y=10 \times x +10\)。而损失函数就是用来衡量模型的猜测答案,和真实的答案之间的差距,进而衡量模型的好坏。
然后,模型会使用优化器来最小化损失函数,更新参数,从而做出新的猜测,例如 \(y=5 \times x +5\)。虽然这个猜测与真实情况相差也很大,但更加接近了。
模型会把这个过程重复 EPOCHS
次。我们使用的损失函数是 MEAN SQUARED ERROR
,优化器是 STOCHASTIC GRADIENT DESCENT
。如果你还不懂这些,没关系,后面我会更加详细地介绍这些概念。
1 | model.compile(optimizer='sgd', loss='mean_squared_error') |
数据
下一步,我们需要一些数据。这里我们使用 6 个 x
和 6 个 y
。
1 | xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float) |
训练神经网络
训练网络,需要调用 model.fit
,这个方法会执行我们上面提到的步骤:做出猜测,使用损失函数衡量网络的好坏,使用优化器来最小化损失函数,更新参数,做出新的更好的猜测。这个步骤会重复 epochs
次,这个 epochs
是你可以定义的。
1 | model.fit(xs, ys, epochs=500) |
模型训练完后,你会得到一个训练好的模型,学习到了 x
和 y
之间的关系。你可以使用 model.predict
方法来根据 x
预测对应的 y
。比如 x=10
,那么它对应的 y
是多少呢?你可以使用下面的方法来预测:
1 | print(model.predict([10.0])) |
正确的答案应该是 19,但是预测值不是 19,而是一个非常接近 19 的数字。为什么会这样呢?
因为,神经网络处理的是概率。所以,给神经网络输入数据,它计算出 x
和 y
之间的关系很有可能是 \(y=2 \times x -1\)。但我们只输入了 6 个数据,神经网络无法确定得到确切的关系。因此,预测的结果非常接近 19,但不一定是 19。
总结
当你使用神经网络时,你会经常看到这种模式:
- 神经网络做出猜测.
- 使用损失函数衡量网络的好坏。
- 使用优化器来最小化损失函数,更新参数,做出新的更好的猜测。
这个过程是在处理概率有关的内容,而不是确定性的内容。
并且,在做预测时,也是使用概率来得出结果(特别是在分类是)。