TensorFlow在人工智能,机器学习和深度学习中的应用入门,阅读材料(一)

教程视频:




正文

原文地址:

https://github.com/lmoroney/dlaicourse/blob/master/Course%201%20-%20Part%202%20-%20Lesson%202%20-%20Notebook.ipynb

神经网络的“Hello World”

就像你的每一个入门App一样,用非常简单的代码,向你展示了你的代码是如何工作的。

对于创建神经网络来说,我喜欢把学习两个数字之间的关系作为例子。举个🌰,如果你正在写下面这样的代码,那么你已经知道了其中的“规则”--

float hw_function(float x){    
 float y = (2 * x) - 1;    
 return y;
}

那么你该如何训练出一个神经网路来完成和上面代码一样的任务呢?使用数据!通过向模型中喂入一组x和一组y,这样应该可以找到它们之间的关系。

这是一种和你过去所使用的完全不同的编程范式,那么让我们一点点的过一遍。

导入

首先是导入我们需要的库。这里我们导入了TensorFlow,为了方便使用,起了一个别名为“tf”。

然后我们导入了一个叫做numpy的库,可以帮助我们方便快捷的表现我们的数据。

当然了,我们也导入了可以将神经网路哦定义成一系列layer的框架: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=2x-1.

当计算机尝试去学习那个规则时,它会进行猜测,可能是 y=10x+10。损失函数通过把你的猜测的答案和正确的答案进行比较,来衡量猜测的好坏程度。

然后使用优化器进行下一次猜测。基于损失函数的结果,他会尝试让损失最小化。基于这点,他可能会给出一个 y=5x+5,尽管还是很糟糕,当里正确答案更近一步了。

这个过程将重复n次,这个值由之后你将看到的 epochs 参数来决定。但首先,我们得告诉它使用“均方差”作为损失函数,使用“随机梯度下降”作为优化器。你不需要理解其中数学原理,但你可以看到它们是如何工作的。

之后你会学习到,在不同的场景中使用合适的损失函数和优化器。

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

提供数据

下一步,我们会喂进一些数据。在这个例子中我们给出了6个x和6个y。你可以发现它们之间的关系是 y=2x-1,所以是  x = -1, y=-3 等等。

一个叫做“Numpy”的python库提供了大量数组类型的数据结构,是用来做这件事的事实标准。我们使用np.array[] 来放入特定的值。

xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

训练神经网络

使用 model.fit 函数来处理神经网络的训练,它可以学习到 x 和 y 之间的关系。它会进行我们之前提到过的循环。进行猜测->衡量猜测的好坏程度->使用优化器进行另一个猜测。他会重复你指定的epochs次。当你运行代码时,你可以中输出结果的右手边看到损失。 

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


训练输出

好了,你的模型已经训练好了,学习到了x和y之间的关系。你可以使用 model.predict 函数来为之前没有见过的X,计算出其所对应的 Y。举个例子,如果 X=10,你认为 Y 会是多少呢?在运行下面这行代码之前,猜测一下。

print(model.predict([10.0]))

You might have thought 19, right? But it ended up being a little under. Why do you think that is?

你可能会认为是19,对吗?实际上它的值会比19低一点点。为什么会这样呢?

记住,神经网络是处于概率大,通过我我们喂进去的数据,他计算出 X 和 Y 之间的关系有很大的可能是 y=2x-1,但就只有6个数据点,并不能让我们完全确定。结果就是,答案是一个非常接近19的数,但不是精确的19。

在你研究神经网络的过程中,会经常看到这样的情况。你总是在处理概率,而不是精确值。

完整代码:

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

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

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

xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

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

print(model.predict([10.0]))


本文禁止转载或摘编

-- --
  • 投诉或建议
评论