本系列文章适用于以下人群:
Keras是一个Python编写的高层神经网络API,可以基于TensorFlow或Theano(注意不是Thanos)等来实现神经网络。简单的来说就是TensorFlow和Theano是用来实现神经网络的Python库,但由于使用起来不够简单,对普罗大众不够友好,为了降低神经网络的使用门槛、减少用户的工作量,大神François Chollet开发了Keras来封装这些复杂,让实现一个高层神经网络的过程从搭建火前发射台变为拼装乐高积木。
那么使用Keras搭建一个神经网络到底有多简单呢,下面是一个Keras官方给出来的一个Demo。
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
# 造一些模拟训练的数据
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, 20))
y_test = np.random.randint(2, size=(100, 1))
# 创建神经网络结构
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 编译神经网络
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# 训练神经网络
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
# 使用神经网络
score = model.evaluate(x_test, y_test, batch_size=128)
(以上示例来自 Keras官方对于Sequential model讲解)
以上代码用随机数创建了一组训练数据和一组测试数据,接下来仅使用了6行代码就创建出了一个神经网络结构,又使用了两行代码进行编译和训练,至此就得到了一个训练好的神经网络。如果您已经能轻松看懂上看面代码的每一行是在做什么,由于这是篇入门性质的文章,也就没有再继续读下去的必要了,建议您去看更高阶的文章。
如果您已经搭建好Python和Keras环境可以复制粘贴上面的代码实际运行一下,实际感受一下神经网络的训练和使用过程。如果还没有搭建好环境,您至少需要安装Python(最好是Python3.X版本,2.X还剩下2020年就要停止维护了)、TensorFlow(本系列文章会基于TensorFlow构建神经网络)、Keras(废话),以及一个好用的Python的IDE(如Pycharm)。如果您使用的是Windows10操作系统,还有一张NVIDIA的好显卡,想要使用GPU加速的话,您还需要安装TensorFlow-GPU、CUDA、CUDNN。使用还是不使用GPU加速对于编码部分没有什么区别。本文不去讨论如何搭建环境,这些内容您可以自行百(GOO)度(GLE)。
假设已知一种水果的颜色和形状,来猜测一下是什么水果,如下图:
对于第一行,一个红色、球形的水果,有些人会首先想到苹果,有些人会首先想到石榴,也有些人会首先想到樱桃,甚至还有些人会首先想到一些很罕见的水果,这种差异实际上是每个人的“脑回路”的差异,其实就是因为在日常生活学习中,神经系统经常接收到哪些刺激决定的。
还是觉得抽象?那么想像这个场景,幼儿园有一组小朋友[小红,小蓝,小绿,小黄、小粉、小灰],老师说现在有一种红色的球形的水果要发给大家吃,让小朋友们来猜一下是什么,统计每个小朋友猜出来的结果做投票,选择票数最多的那一种发给大家,这个流程看起来会是这样:
假如幼儿园有多名老师,每名老师对每个小朋友都有不同程度的偏爱,他们想让自己更加偏爱的小朋友选中的水果在投票中占据更大的权重,所以这些老师们分别收集每个小朋友的猜想,再由他们来进行投票,如下面这种情况:
小朋友们也许太小了,他们眼前可能浮现了某种水果,但是不知道这个水果叫什么,于是他们补充了一下水果的特征交给老师,老师们再根据小朋友们的猜想去判断是哪些水果,比如这样:
一个神经网络的工作过程和这个比较类似。小朋友和老师都会对同样的一组输入条件做出不同的反应,导致这种差异的原因是这些人的生活经历、性格喜好等因素决定的。人脑中也是充满大量这种类似小朋友和老师这样能够接收信号并做出自己的反应的组织,也就是神经元,这些神经元在每个人出生的时候预设了一些属性,在生活和不断地学习过程,它们会不断地自我调整来适应这个世界,让人建立正确的认识掌握更多的知识。而一个人工神经网络就是在模拟这个过程,它会随机的初始化大量的神经元,这就如果创造了一个新生儿的大脑,它只具有结构,但不具备认识和知识,还不能完成除了学习以外的任何任务,所以这个时候往往要对它进行训练,即调整每个神经元的设置。
我们将上图的过程重新梳理一下:
建立一个神经网络通常来说,就是建立多组神经元,并且通过将一组神经元的输出作为输入传递给下一神经元的方式将神经网络组织起来,这样的神经元可能有很多组,每一组神经元都作为一个层(layer),输入与输出也分别做为一个层(layer)。考虑到输入层、神经元组成的层、输出层起到的不同作用,人工神经网络结构中都对它们有相应的名称,即:
输入数据的为输入层,中间的神经元们为隐藏层,输出结果的为输出层。也就是说人工神经网络是一种由一个输入层、若干个隐藏层、一个输出层组成的模型。
到这里再看一下上面贴出来的代码。
创建神经网络结构的部分:先是用model = Sequential()创建了一个名叫model的神经网络,后面的第一行model.add都是在为这个网络添加一个层(layer),至于add()里面的参数暂时先不去关注。
# 创建神经网络结构
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
之后的两行model.complie描述了一些这个神经网络的训练方式,model.fit使用一些数据来对其进行训练,即调整每个神经元。同样暂时不需要关注这些函数中的参数。
# 编译神经网络
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# 训练神经网络
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
到这里,一个人工神经网络已经准备好投入使用,但是通常在正式使用之前,会对神经网络的效果作一些评估,看看它能否胜任,一般来说会使用一些结果已知的测试数据查看一下这个神经网络的准确率。
score = model.evaluate(x_test, y_test, batch_size=128)
关于keras与人工神经网络的简单介绍到这里已经结束。本篇描述了人工神经网络的基本结构和使用Keras创建一个简单的人工神经网络的步骤。下一篇讲解人工神经网络中的数学问题: 深度学习从入门到夺门而出——Keras实践(二):猴子都能搞懂的数学基础。
本人水平有限,难免出现错误和讲述不清的地方,望各位理性指出,共同进步。