Keras 模型编译
之前,我们研究了如何使用 Sequential 和 Function API 创建模型的基础知识。本章将介绍如何编译模型。编译是创建模型的最后一步。编译完成后,我们就可以进入训练阶段。
首先,学习一些概念,有助于我们更好地理解编译过程。
Loss 损失
在机器学习中,Loss
函数用于发现学习过程中的错误或偏差。Keras 在模型编译过程中需要损失函数。
Keras 在损失模块中提供了不少的损失函数,下面为大家罗列出来:
mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
squared_hinge
categorical_hinge
categorical_hine
huber_loss
categorical_crossentropy
sparse_categorical_crossentropy
binary_crossentropy
kullback_leibler_divergence
poisson
cosine_proximity
is_categorical_crossentropy
以上所有损失函数都接受两个函数:
y_true
作为 tensor 的真实标签y_pred
与y_true
形状相同的预测 在使用下面指定的损失函数之前,首先要导入损失模块:from keras import losses
Optimizer 优化器
在机器学习中,optimizer
是通过比较预测和损失函数来优化输入权重的重要过程。Keras 提供了很多优化器作为模块,具体如下:
SGD 随机梯度下降优化器
keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
RMSprop 优化器
keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
Adagrad 优化器
keras.optimizers.Adagrad(learning_rate = 0.01)
Adadelta 优化器
keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
Adam 优化器
keras.optimizers.Adam(
learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)
Adamax 优化器。
from keras import optimizers
Metrics 指标
在机器学习中,指标用于评估模型的功能。它类似于损失函数,但不用于训练过程。Keras也提供了许多的指标作为模块,详细如下:
accuracy
binary_accuracy
categorical_accuracy
sparse_categorical_accuracy
top_k_categorical_accuracy
sparse_top_k_categorical_accuracy
cosine_proximity
clone_metric
和损失函数一样,指标一样接受一下的两种参数:
y_true
作为 tensor 的真实标签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()
现在我们应用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)
表示具有相同形状的测试数据。
创建模型
让我们选择一个简单的多层感知器 (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
更多建议: