Bootstrap

《Kears》翻译连载2

这边,解释一下,将会连载关于《Deep learning with keras》一书的翻译版及一些自己的认识。如有侵权,请联系删除。若有错误,请指出,多谢关照。由于翻译水平有限,有兴趣的同行可以阅读原版书籍。如果连载的文章会给您多少带来帮助,倍感荣幸。

正文开始:

*****************************************************************************************************************************************************

使用Keras定义一个简单的神经网络模型

这里,我们使用Keras定义一个识别MNIST手写数字的网络。我们从一个简单的神经网络开始,然后逐步的改进它。

Keras提供了方便的库来加载数据集并将它们分成训练集X_train,用于网络调优。测试集X_test,用于评估网络性能。数据被转化成float32类型,用于支持GPU计算并归一化到[0,1](注:其实,个人认为这边的数据处理和GPU运算没有很大关系,关于转化成[0,1]可参照数字图像处理的内容)。此外,我们分别加载Y_train和Y_test,并使用一位有效编码对他们(标签,一位有效编码仅对标签编码编码),让我们来看下代码:

from __future__ import print_function

import numpy as np

from keras.datasets import mnist  #导入数据库

from keras.models import Sequential  #Sequential是简单的序贯模型

from keras.layers.core import Dense, Activation  #Dense 是密集层(全#连接),Activation 是激活函数

from keras.optimizers import SGD #从优化器中导入SGD(随机梯度下#降法)

from keras.utils import np_utils

np.random.seed(1617)  # 生成随机种子

# 接下来是网络和网络训练

NB_EPOCH = 20 # 网络迭代次数为20

BATCH_SIZE = 200 # 每一次使用200样本训练

VERBOSE = 1 # 函数中的一个参数,涉及到说其用法

NB_CLASSES = 10 #  最后的输出数量即总数量(0-9)共10个数字OPTIMIZER = SGD() # 使用SGD作为BP的优化函数

N_HIDDEN = 128 #涉及到说其用法

VALIDATION_SPLIT = 0.2 #这边是验证集所占的比例(注意,和test

#不同,该验证集是在训练阶段对网络模型进行验证,是训练样本中

#的一部分)

# 接下来是训练集和测试集中数据的shuffled 和 split

#关于shuffled 是一种数据操作,即 随机的从数据中取出#BATCH_SIZE个数据

(X_train,Y_train),(X_test,Y_test) = mnist.load_data() #加载数据

#X_train 是一个有60000个28*28像素图像的训练集(可看做一个三#维的,即28*28*60000),需要把它reshape成60000*784

RESHAPED = 784

X_train = X_train.reshape(60000,RESHAPED)

X_test = X_test.reshape(10000,RESHAPED)

X_train = X_train.astype(‘float32’) #转换其数据类型,可参阅数字图像处理内容

X_test = X_test.astype(‘float32’)

# 归一化 (标准化),这边 由于灰度值0-255(一个像素点8位的2进制数),所以将其对应在0-1之间需要除以255

X_train /= 255 # X_train = X_train/255

X_test / = 255

print(X_train.shape[0],’train samples’)

print(X_test.shape[0],’test_samples’) # 这边的shape可理解为其长和宽,#[0] 表示有多少样本

# 将 类向量转化为二进制类矩阵(把标签进行一位有效编码,这边使用函数实现,可自行写一下)

Y_train = np_utils.to_categorical(Y_train,NB_CLASSES)

Y_test = np_utils.to_categorical(Y_test,NB_CLASSES)

输入层有一个图像中每个像素相关联的神经元,共有28*28 = 784个神经元,MNIST中每一个像素有一个神经元

通常,每个像素的值被标准化在[0 ,1]之内(意味着每个像素没255除)。输出是10个类,每个类对应着一个数字。

最后一层时具有单个激活函数Softmax的神经元,这个激活函数时S型函数的推广。Softmax函数将任意实数值的k维向量压缩为范围在(0,1)之间的实数值k维向量,在我们的例子中,它将前一层提供的10个输出聚合并输出。

注:这边为方便理解,可以将Softmax函数简单理解为矩阵乘法,其实不妨将Softmax看做 Softmax两步,第一步是计算输入的图像属于每一个数字的概率即 Soft阶段,第二步,选出概率最大的作为最终的分类结果,即max阶段。其实,这边的分类,是将一个向量和一个矩阵相乘:(其实Softmax就是矩阵乘法(个人认为)):

对于一张图像(在MNIST例子中,我们将像素值(标准化之后的像素值,作为分类特征))。经过一系列的网络特征提取,假设我们得到了一张图像是n维行向量,最后的神经元是一个n*10(表示共10类)的二维矩阵,根据矩阵乘法,得到一个1*10的行向量,此时即找到最大的概率,其所对应的类别即为分类结果(前面使用了一位有效编码)。继续:

# 10个输出

# 最后一步是Softmax

model = Sequential()

model.add(Dense(NB_CLASSES, input_shape=(RESHAPED,))) # 可以#看到定义的最后的全连接层(密集层)输出是10,一共有10类,关#于input_shape=(RESHAPE,),表示其输入是一个一位的RESHAPE

#大小的一维向量。

model.add(Activation(‘sotfmax’))

model.summary()

一旦我们定义了模型,我们需要对它进行编译,这样它才可以以Keras(Theano或者Tensorflow)为后台运行。在编译的过程中有这样几个参数选择:

      我们需要用于训练过程中更新权重的优化器;

      我们需要选择目标函数,目标函数用于优化过程中,指定权重的变化(通常,目标函数称为损失函数,优化的过程定义为损失函数最小化的过程)

      我们需要评估训练模型

一些常见的目标函数(完整的目标函数的列表位于:http://keras.io/objectives/)如下所示:

MSE:表示预测值和实际值之间的均方误差。从数学上来讲,如果是n个预测值的向量,Y是观测值,那么他们满足下列等式:

目标函数平均了每次预测的所有错误,如果预测和真实值很远,那么平方运算就会使得这样的差距更加明显。

二进制交叉熵:二进制对数损失。假设模型预测值是p,目标是t,那么二进制交叉熵被定义为:

分类的交叉损失函数:多分类对数损失。如果目标值是tij,预测值是pij,那么分类交叉损失函数如下:

      这个目标函数适用于多分类预测。该目标函数也是softmax激活函数的默认选择。

      一些常见的度量标准(完整的度量标准参照:http://keras.io/metrics/)如下所示:

      准确率:目标正确预测的比例

      精度:This denotes how many selected items are relevant for a multilabel
classification

      召回率:This denotes how many selected items are relevant for a multilabel
classification

(关于precision和recall的解释,有兴趣可以参照周志华老师的《机器学习》一书(西瓜书)中的第二章“模型评估与选择”,上面给出关于原版书籍的解释)

度量与目标函数相似,唯一的区别是它们不用于训练模型,而只用于评估模型。在Kears中编译模型很容易:

model.compile(loss=’categorical_crossentropy’,optimizer=OPTIMIZER,metrics=[‘accuracy’])

一旦模型被编译,使用fit()函数进行训练,fit()函数需要指定一些少数参数:

      epochs:表示模型训练的次数,在每次迭代中,优化器都在调整权重,以便最小化目标函数。

      batch_size:表示优化器执行权重更新之前观察到的每一次中训练实例的数量。

在keras训练一个模型很简单,假设一个迭代NB_EPOCH的模型

      history = model.fit(X_train,Y_train,batch_size = BATCH_SIZE,epochs = NB_EPOCH, verbose = VERBOSE,validation_split = VALIDATION_SPLIT)

      在训练集中保留了部分验证集。关键思想是我们保留一部分训练数据,用于在训练时验证模型的性能。对于任何机器学习任务,这都是一个良好的实践,我们将在所有示例中采用它。

      利用测试集对训练好的模型进行评估,从而得到目标函数所能达到的最小值和评价指标所能达到的最佳值。

      注意:训练集和测试集是严格分离的。使用一个用于训练的样本来评估一个模型是没有任何意义的。学习本质上是一个过程,目的是概括看不见的观察结果,而不是记住已经知道的东西。

      score = model.evaluate(X_test,Y_test,verbose = VERBOSE)

      print(“Test score:”, score[0])

      prting(“Test accuracy,”score[1])

      恭喜你,你已经使用keras定义了第一个神经网络模型。只有简单几行代码,你的计算机可以识别手写字体。让我们来运行代码,看看它的性能。

******************************************************************************************************************************************************************************************

今天的正文部分就先到这里。如果有任何相关问题,请联系[email protected],正经问题可能会回复晚一些,但是一定会回复。OK,这边,如果有任何侵权,将会及时删除,给您带来的不便请多谅解。为了进一步了解keras,附上中文版keras文档地址:

https://keras-cn.readthedocs.io/en/latest/layers/recurrent_layer/#recurrent

;