美文网首页
keras建立多层神经网络(持续更新)

keras建立多层神经网络(持续更新)

作者: 魏允臣 | 来源:发表于2019-01-26 21:02 被阅读0次

    本文参考了《tensorflow+keras深度学习人工智能时间应用》。若本文有任何谬误欢迎指正,本人将尽快更改并深表谢意。
    使用的数据集仍然是mnist

    以下使用Out[数字]:的方式表示代码输出结果
    Out[数字]:
    代码输出
    

    建立多层感知器模型的步骤

    1、数据预处理

    数据预处理后,会产生features(数字图像特征值)与label(数字真实的值)

    2、建立模型

    建立多层感知器模型

    3、训练模型

    输入训练模型features(数字图像特征值)与label(数字真实的值),执行10次训练

    4、评估模型准确率:

    使用测试数据评估模型准确率

    5、进行预测

    使用已经训练完成的模型,输入测试数据进行预测

    进行数据预处理

    步骤一 导入所需模块

    from keras.utils import np_utils
    import numpy as np
    np.random.seed(10)
    

    步骤二 读取mnist数据

    from keras.datasets import mnist
    (x_train_image,y_train_label),(x_test_image,y_test_label)=mnist.load_data()
    

    步骤三 将features(数字图像特征值)使用reshape转换

    下面的代码将原本28x28的数字图像以reshape转换成784个float数

    x_train=x_train_image.reshape(60000,784).astype('float32')
    x_test=x_test_image.reshape(10000,784).astype('float32')
    

    步骤四 将features(数字图像特征值)标准化

    将features(数字图像特征值)标准化可以提高模型预测的准确度,并且更快收敛

    x_train_norm=x_train/255
    x_test_norm=x_test/255
    

    步骤五 label(数字的真实值)以one-hot encoding进行转换

    使用np_utils.to_categorical将训练数据与测试数据的label进行one-hot encoding转换

    y_train_onehot=np_utils.to_categorical(y_train_label)
    y_test_onehot=np_utils.to_categorical(y_test_label)
    

    建立模型

    输入层(x)共有784个神经元,隐藏层(h)共有256个神经元,输出层(y)共有10个神经元

    步骤一 导入所需模块

    from keras.models import Sequential
    from keras.layers import Dense
    

    Keras 的核心数据结构是 model,一种组织网络层的方式。其中有两种模式,最简单且最常用的模型是 Sequential 序贯模型,它是由多个网络层线性堆叠的栈。对于更复杂的结构,可以使用 Keras 函数式 API,它允许构建任意的神经网络图。
    全连接层

    Dense(units, 
          activation=None, 
          use_bias=True, 
          kernel_initializer='glorot_uniform', 
          bias_initializer='zeros', 
          kernel_regularizer=None, 
          bias_regularizer=None, 
          activity_regularizer=None, 
          kernel_constraint=None, 
          bias_constraint=None)
    

    参数

    • units: 正整数,输出空间维度。
    • activation: 激活函数。
      若不指定,则不使用激活函数
      (即, “线性”激活: a(x) = x)。
    • use_bias: 布尔值,该层是否使用偏置向量。
    • kernel_initializer: kernel 权值矩阵的初始化器。
    • bias_initializer: 偏置向量的初始化器.
    • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数。
    • bias_regularizer: 运用到偏置向的正则化函数。
    • activity_regularizer: 运用到层的输出的正则化函数。
    • kernel_constraint: 运用到 kernel 权值矩阵的约束函数。
    • bias_constraint: 运用到偏置向量的约束函数。

    Dense 实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_biasTrue 时才有用)。
    注意: 如果该层的输入的秩大于 2,那么它首先被展平然后 再计算与 kernel 的点乘。

    步骤二 建立Sequential模型

    建立一个线性堆叠模型,后续只需要使用model.add()方法堆叠模型即可

    # 声明序贯模型
    model=Sequential()
    

    序贯模型(Sequential)是多个网络层的线性堆叠,通俗来讲就是「一条路走到黑」。

    步骤三 建立输入层与隐藏层

    以下代码将输入层与隐藏层加入模型,使用model.add方法加入Dense全连接层。Dense全连接层的特色是:所有的上一层与下一层的神经元都完全连接

    model.add(Dense(units=256,
                    input_dim=784,
                    kernel_initializer='normal',
                    activation='relu'))
    
    参数 参数说明
    units=256 定义隐藏层神经元个数为256
    input_dim=784 设置输入层神经元个数为784(28x28)
    kernel_initializer='normal' 使用正态分布的随机数来初始化weight和bias
    activation='relu' 选择relu作为激活函数

    步骤四 建立输出层

    使用model.add方法加入Dense全连接层,共有10个神经元,对应0-9十个数字。并且使用softmax激活函数进行转换,softmax可以将神经元的输出转换为预测每一个数字的概率

    model.add(Dense(units=10,
                    kernel_initializer='normal',
                    activation='softmax'))
    
    参数 参数说明
    units=10 定义输出层层神经元个数为10
    kernel_initializer='normal' 使用正态分布的随机数来初始化weight和bias
    activation='softmax' 选择softmax作为激活函数

    输出层的不需要设置input_dim,因为keras会按照上一层的units是256个神经元,设置这一层的input_dim为256个神经元

    步骤四 查看模型的摘要

    我们可以使用下列指令查看模型的摘要

    print(model.summary())
    
    模型摘要

    我们可以看到共有以下两层:

    • 隐藏层:共256个神经元,因为输入层与隐藏层是一起建立的,所以没有显示输入层
    • 输出层:共10个神经元

    模型的摘要还有Param字段,dense_1的Param为784x256+256=200960,dense_2的Param为256x10+10=2570,稍后会给出说明。
    以上每一层Param都是超参数(Hyper-Parameters)。
    我们需要通过方向传播算法更新神经元连接的权重和偏差。

    • 建立输入层与隐藏层的公式如下:
      h1 = relu( X x W1 + b1)
    • 建立隐藏层与输出层的公式如下:
      Y = softmax( h1 x W2 + b2)
    • 所以每一层的Param计算方式如下:
      Param = (上一层神经元数量)x (本层的神经元数量) + (本层的神经元数量)

    整个网络的超参数(Trainable params)是每一层Param的总和。通常Trainable params数值越大,代表模型越复杂。

    进行训练

    在我们建立好深度学习模型后,就可以采用反向传播算法进行训练了。

    步骤一 定义训练方式

    在训练模型之前,我们必须使用compile方法对训练模型进行设置:

    model.compile(loss='categorical_crossentropy',
                  optimizer='adam',metrics=['accuracy'])
    
    • loss:设置损失函数,在深度学习中用cross_entropy(交叉熵)训练效果较好
    • optimizer:设置训练时,在深度学习中使用adam优化器可以更快收敛,并提高准确率
    • metrics:设置评估模型的方式为accuracy

    步骤二 开始训练

    train_history=model.fit(x=x_train_norm,
                            y=y_train_onehot,
                            validation_split=0.2,
                            epochs=10,
                            batch_size=200,
                            verbose=2)
    
    训练结果
    程序代码说明
    使用model.fit进行训练,训练过程会存储在变量train_history中,需输入下列参数。

    输入训练数据参数

    • x = x_train_norm(features数字图像的特征值)
    • y = y_train_onehot(label数字图像的实际值)

    设置训练与验证数据比例

    • 设置参数 validation_split = 0.2
      设置后,keras在训练前会自动将数据分成两份:80%作为训练数据,20%作为验证数据。
      本数据集总量为60000,因此48000项为训练集,12000项为验证集

    设置epoch(训练周期)次数与每一批次的项数

    • epochs = 10:执行10个训练周期
    • batch_size = 200:每一批次200项数据

    设置为显示训练过程

    • verbose = 2:显示训练过程

    以上代码共执行了10个训练周期,每个训练训练周期执行下列功能:

    • 使用48000项训练数据训练,大约分为240个批次,每一批次200项
    • 训练完成后,会计算这个训练周期的准确率与误差,并在train_history中新增一项数据记录

    相关文章

      网友评论

          本文标题:keras建立多层神经网络(持续更新)

          本文链接:https://www.haomeiwen.com/subject/lmkwjqtx.html