Keras – 模型编译
在此之前,我们学习了如何使用顺序和功能API创建模型的基本知识。本章解释了如何编译模型。编译是创建模型的最后一步。一旦编译完成,我们就可以进入训练阶段了。
让我们学习一些必要的概念来更好地理解编译过程。
Loss
在机器学习中, Loss 函数被用来寻找学习过程中的错误或偏差。Keras在模型编译过程中需要损失函数。
Keras在 Loss 模块中提供了相当多的损失函数,它们如下
- 均方误差
- 平均值_绝对误差
- 平均值_absolute_percentage_error
- 均方误差_对数误差
- 铰链平方
- 铰链
- 分类的铰链
- 对数
- huber_loss
- 分类交织熵(categorical_crossentropy
- 稀疏分类交叉熵
- 二元交叉熵
- 库尔贝克-莱布勒分歧
- Poisson
- 近似值(cosine_proximity
- 是分类交叉熵
上述所有损失函数都接受两个参数 –
- 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)
Nadam - Nesterov Adam优化器。
keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
在使用优化器之前,按以下规定导入优化器模块-
from keras import optimizers
衡量标准
在机器学习中, Metrics 用于评估模型的性能。它类似于损失函数,但不用于训练过程。Keras作为一个模块提供了相当多的度量, 度量 的内容如下
- 准确度
- 二进制准确率(binary_accuracy
- 分类精度(categorical_accuracy
- 稀疏分类准确率
- top_k_categorical_accuracy
- 稀疏的top_k分类准确率
- 余弦距离
- 克隆度量
与损失函数类似,度量也接受以下两个参数 –
- y_true – 作为张量的真实标签
-
y_ pred -** 与 y_true 相同形状的预测。
在使用metrics之前,请先导入metrics模块,具体方法如下
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])
其中、
- 损失函数被设置为 平均误差_平方误差
-
优化器设置为 sgd
-
衡量标准被设置为 metrics.categorical_accuracy
模型训练
模型是由NumPy数组使用 ** fit()** 训练的 ** 。** 这个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()函数
现在我们应用 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数据库中的手写数字
- 时尚-MNIST数据库中的时尚文章
- 波士顿住房价格回归数据集
让我们使用 MNIST手写数字数据库 (或称minst)作为我们的输入。minst是一个由60,000个,28×28灰度图像组成的集合。它包含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次作为历时。
第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