Keras - 模型编译

  • 简述

    之前,我们研究了如何使用 Sequential 和 Functional API 创建模型的基础知识。本章介绍如何编译模型。编译是创建模型的最后一步。编译完成后,我们可以进入训练阶段。
    让我们学习一些需要更好地理解编译过程的概念。
  • 损失

    在机器学习中,损失函数用于发现学习过程中的错误或偏差。Keras 在模型编译过程中需要损失函数。
    Keras 在损失模块中提供了相当多的损失函数,它们如下 -
    • mean_squared_error
    • mean_absolute_error
    • mean_absolute_percentage_error
    • mean_squared_logarithmic_error
    • squared_hinge
    • hinge
    • categorical_hinge
    • logcosh
    • huber_loss
    • categorical_crossentropy
    • sparse_categorical_crossentropy
    • binary_crossentropy
    • kullback_leibler_divergence
    • poisson
    • cosine_proximity
    • is_categorical_crossentropy
    以上所有损失函数都接受两个参数 -
    • y_true - 作为张量的真实标签
    • y_pred - 与y_true形状相同的预测
    在使用损失函数之前导入损失模块,如下所示 -
    
    
    from keras import losses
    
    
  • 优化器

    在机器学习中,优化是一个重要的过程,它通过比较预测和损失函数来优化输入权重。Keras 提供了相当多的优化器作为一个模块,优化器如下:
    SGD - 随机梯度下降优化器。
    
    
    keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
    
    
    RMSprop - RMSProp 优化器。
    
    
    keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
    
    
    Adagrad -Adagrad 优化器。
    
    
    keras.optimizers.Adagrad(learning_rate = 0.01)
    
    
    Adadelta -Adadelta 优化器。
    
    
    keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
    
    
    Adam - Adam 优化器。
    
    
    keras.optimizers.Adam(
    
       learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
    
    )
    
    
    Adamax - Adam 的 Adamax 优化器。
    
    
    keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
    
    
    我希望- Nester 的 Adam 优化器。
    
    
    keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
    
    
    在使用优化器之前导入优化器模块,如下所示 -
    
    
    from keras import optimizers
    
    
  • 指标

    在机器学习中,Metrics用于评估模型的性能。它类似于损失函数,但不用于训练过程。Keras 提供了相当多的指标作为模块,指标,它们如下
    • 准确性
    • binary_accuracy
    • 分类准确度
    • sparse_categorical_accuracy
    • top_k_categorical_accuracy
    • sparse_top_k_categorical_accuracy
    • cosine_proximity
    • 克隆度量
    与损失函数类似,指标也接受以下两个参数 -
    • y_true - 作为张量的真实标签
    • y_pred - 与y_true形状相同的预测
    在使用如下指定的指标之前导入指标模块 -
    
    
    from keras import metrics
    
    
  • 编译模型

    Keras 模型提供了一个方法,compile()来编译模型。compile()方法的参数和默认值如下
    
    
    compile(
    
       optimizer, 
    
       loss = None, 
    
       metrics = None, 
    
       loss_weights = None, 
    
       sample_weight_mode = None, 
    
       weighted_metrics = None, 
    
       target_tensors = None
    
    )
    
    
    重要的论点如下 -
    • 损失函数
    • 优化器
    • 指标
    编译模式的示例代码如下 -
    
    
    from keras import losses 
    
    from keras import optimizers 
    
    from keras import metrics 
    
    
    
    model.compile(loss = 'mean_squared_error',  
    
       optimizer = 'sgd', metrics = [metrics.categorical_accuracy])
    
    
    说明,
    • 损失函数设置为mean_squared_error
    • 优化器设置为sgd
    • 指标设置为metrics.categorical_accuracy
  • 模型训练

    模型由 NumPy 数组使用fit()进行训练。此拟合函数的主要目的是用于评估您的训练模型。这也可以用于绘制模型性能。它具有以下语法 -
    
    
    model.fit(X, y, epochs = , batch_size = )
    
    
    说明
    • X, y - 这是一个评估数据的元组。
    • epochs - 在训练期间不需要评估模型的次数。
    • batch_size - 训练实例。
    让我们以一个简单的 numpy 随机数据示例来使用这个概念。

    创建数据

    让我们在下面提到的命令的帮助下使用 numpy 为 x 和 y 创建一个随机数据 -
    
    
    import numpy as np 
    
    
    
    x_train = np.random.random((100,4,8)) 
    
    y_train = np.random.random((100,10))
    
    
    现在,创建随机验证数据,
    
    
    x_val = np.random.random((100,4,8)) 
    
    y_val = np.random.random((100,10))
    
    

    创建模型

    让我们创建简单的顺序模型 -
    
    
    from keras.models import Sequential model = Sequential()
    
    

    添加图层

    创建图层以添加模型 -
    
    
    from keras.layers import LSTM, Dense 
    
    
    
    # add a sequence of vectors of dimension 16 
    
    model.add(LSTM(16, return_sequences = True)) 
    
    model.add(Dense(10, activation = 'softmax'))
    
    

    编译模型

    现在模型已定义。您可以使用以下命令进行编译 -
    
    
    model.compile(
    
       loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
    
    )
    
    

    应用拟合()

    现在我们应用fit()函数来训练我们的数据 -
    
    
    model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))
    
    
  • 创建多层感知器 ANN

    我们已经学会了创建、编译和训练 Keras 模型。
    让我们应用我们的学习并创建一个简单的基于 MPL 的 ANN。

    数据集模块

    在创建模型之前,我们需要选择一个问题,需要收集所需的数据并将数据转换为 NumPy 数组。收集数据后,我们可以准备模型并使用收集的数据对其进行训练。数据收集是机器学习中最困难的阶段之一。Keras 提供了一个特殊的模块,即数据集,用于下载用于训练目的的在线机器学习数据。它从在线服务器获取数据,处理数据并将数据作为训练和测试集返回。让我们检查一下 Keras 数据集模块提供的数据。模块中可用的数据如下,
    • CIFAR10小图像分类
    • CIFAR100小图像分类
    • IMDB电影评论情感分类
    • 路透社新闻专线主题分类
    • MNIST 手写数字数据库
    • Fashion-MNIST 时尚文章数据库
    • 波士顿房价回归数据集
    让我们使用手写数字(或 minst)的 MNIST 数据库作为我们的输入。minst 是 60,000 张 28x28 灰度图像的集合。它包含 10 位数字。它还包含 10,000 张测试图像。
    下面的代码可用于加载数据集 -
    
    
    from keras.datasets import mnist 
    
    
    
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    
    说明
    • 第 1 行从 keras 数据集模块导入minst 。
    • 第 3 行调用load_data函数,该函数将从在线服务器获取数据并将数据作为 2 个元组返回,第一个元组(x_train, y_train)表示训练数据的形状为(number_sample, 28, 28),其数字标签为形状(number_samples, )。第二个元组(x_test, y_test)表示具有相同形状的测试数据。
    其他数据集也可以使用类似的 API 获取,每个 API 也返回类似的数据,除了数据的形状。数据的形状取决于数据的类型。

    创建模型

    让我们选择一个简单的多层感知器 (MLP),如下所示,并尝试使用 Keras 创建模型。
    创建模型
    该模型的核心特征如下 -
    • 输入层由 784 个值(28 x 28 = 784)组成。
    • 第一个隐藏层,Dense由 512 个神经元和“relu”激活函数组成。
    • 第二个隐藏层,Dropout的值为 0.2。
    • 第三个隐藏层,同样 Dense 由 512 个神经元和“relu”激活函数组成。
    • 第四个隐藏层,Dropout的值为 0.2。
    • 第五层和最后一层由 10 个神经元和“softmax”激活函数组成。
    • 使用categorical_crossentropy作为损失函数。
    • 使用RMSprop()作为优化器。
    • 使用准确性作为指标。
    • 使用 128 作为批量大小。
    • 使用 20 作为 epoch。
    第 1 步 - 导入模块
    让我们导入必要的模块。
    
    
    import keras 
    
    from keras.datasets import mnist 
    
    from keras.models import Sequential 
    
    from keras.layers import Dense, Dropout 
    
    from keras.optimizers import RMSprop 
    
    import numpy as np
    
    
    第 2 步 - 加载数据
    让我们导入 mnist 数据集。
    
    
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    
    第 3 步 - 处理数据
    让我们根据我们的模型更改数据集,以便将其输入到我们的模型中。
    
    
    x_train = x_train.reshape(60000, 784) 
    
    x_test = x_test.reshape(10000, 784) 
    
    x_train = x_train.astype('float32') 
    
    x_test = x_test.astype('float32') 
    
    x_train /= 255 
    
    x_test /= 255 
    
    
    
    y_train = keras.utils.to_categorical(y_train, 10) 
    
    y_test = keras.utils.to_categorical(y_test, 10)
    
    
    说明
    • reshape用于将输入从 (28, 28) 元组重塑为 (784, )
    • to_categorical用于将向量转换为二进制矩阵
    第 4 步 - 创建模型
    让我们创建实际模型。
    
    
    model = Sequential() 
    
    model.add(Dense(512, activation = 'relu', input_shape = (784,))) 
    
    model.add(Dropout(0.2)) 
    
    model.add(Dense(512, activation = 'relu'))
    
    model.add(Dropout(0.2)) 
    
    model.add(Dense(10, activation = 'softmax'))
    
    
    第 5 步 - 编译模型
    让我们使用选定的损失函数、优化器和指标来编译模型。
    
    
    model.compile(loss = 'categorical_crossentropy',     
    
       optimizer = RMSprop(), 
    
       metrics = ['accuracy'])
    
    
    第 6 步 - 训练模型
    让我们使用fit()方法训练模型。
    
    
    history = model.fit(
    
       x_train, y_train, 
    
       batch_size = 128, 
    
       epochs = 20, 
    
       verbose = 1, 
    
       validation_data = (x_test, y_test)
    
    )
    
    
  • 最后的想法

    我们已经创建了模型,加载了数据并将数据训练到模型中。我们仍然需要评估模型并预测未知输入的输出,我们将在下一章学习。
    
    
    import keras 
    
    from keras.datasets import mnist 
    
    from keras.models import Sequential 
    
    from keras.layers import Dense, Dropout 
    
    from keras.optimizers import RMSprop 
    
    import numpy as np 
    
    
    
    (x_train, y_train), (x_test, y_test) = mnist.load_data() 
    
    
    
    x_train = x_train.reshape(60000, 784) 
    
    x_test = x_test.reshape(10000, 784) 
    
    x_train = x_train.astype('float32') 
    
    x_test = x_test.astype('float32') 
    
    x_train /= 255 
    
    x_test /= 255 
    
    
    
    y_train = keras.utils.to_categorical(y_train, 10) 
    
    y_test = keras.utils.to_categorical(y_test, 10) 
    
    
    
    model = Sequential() 
    
    model.add(Dense(512, activation='relu', input_shape = (784,))) 
    
    model.add(Dropout(0.2)) 
    
    model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2)) 
    
    model.add(Dense(10, activation = 'softmax'))
    
    model.compile(loss = 'categorical_crossentropy', 
    
       optimizer = RMSprop(), 
    
       metrics = ['accuracy']) 
    
    
    
    history = model.fit(x_train, y_train, 
    
       batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))
    
    
    执行应用程序将提供以下内容作为输出 -
    
    
    Train on 60000 samples, validate on 10000 samples Epoch 1/20 
    
    60000/60000 [==============================] - 7s 118us/step - loss: 0.2453 
    
    - acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20 
    
    60000/60000 [==============================] - 7s 110us/step - loss: 0.1023 
    
    - acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20 
    
    60000/60000 [==============================] - 7s 110us/step - loss: 0.0744 
    
    - acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20 
    
    60000/60000 [==============================] - 7s 110us/step - loss: 0.0599 
    
    - acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0504 
    
    - acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20 
    
    60000/60000 [==============================] - 7s 111us/step - loss: 0.0438 
    
    - acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20 
    
    60000/60000 [==============================] - 7s 114us/step - loss: 0.0391 
    
    - acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0364 
    
    - acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20 
    
    60000/60000 [==============================] - 7s 113us/step - loss: 0.0308 
    
    - acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0289 
    
    - acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0279 
    
    - acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0260 
    
    - acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0257 
    
    - acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0229 
    
    - acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20 
    
    60000/60000 [==============================] - 7s 115us/step - loss: 0.0235 
    
    - acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20 
    
    60000/60000 [==============================] - 7s 113us/step - loss: 0.0214 
    
    - acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0219 
    
    - acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0190 
    
    - acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0197 
    
    - acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20 
    
    60000/60000 [==============================] - 7s 112us/step - loss: 0.0198 
    
    - acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828