Keras中模型的编译

Posted 来西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras中模型的编译相关的知识,希望对你有一定的参考价值。

本文介绍如何编译模型。 编译是创建模型的最后一步。 编译完成后,我们可以进入训练阶段。让我们学习一些所需的概念,以更好地理解编译过程。

1 损失函数

      在机器学习中,损失函数用于发现学习过程中的错误或偏差。 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

2 优化器

       在机器学习中,优化是一个重要的过程,它通过比较预测和损失函数来优化输入权重。 Keras 提供了相当多的优化器作为一个模块,优化器如下:

  • SGD - 随机梯度下降优化器。
  • RMSprop - RMSProp 优化器。
  • Adagrad - Adagrad 优化器。
  • Adadelta - Adadelta 优化器。
  • Adam - Adam 优化器。
  • Adamax - Adam 的 Adamax 优化器。
  • Nadam - Nesterov Adam 优化器。

      在使用优化器之前导入优化器模块,如下所示:

from keras import optimizers

3 指标

      在机器学习中,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 - 作为张量的真实标签。
  • y_pred - 与 y_true 形状相同的预测。

      在使用指标之前导入指标模块,如下所示:

from keras import metrics

4 编译模型

      Keras 模型提供了一个方法,compile() 来编译模型。 compile() 方法的参数和默认值如下:

compile(
optimizer,
loss = None,
metrics = None,
loss_weights = None,
sample_weight_mode = None,
weighted_metrics = None,
target_tensors = None
)

      重要参数如下:

  • loss function
  • Optimizer
  • metrics

      编译模式的示例代码如下:

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

5 模型训练

      模型由 NumPy 数组使用 fit() 进行训练。 此拟合函数的主要目的是用于评估您的训练模型。 这也可以用于绘制模型性能。 它具有以下语法:

model.fit(X, y, epochs = , batch_size = )
  • X, y - 这是一个评估数据的元组。
  • epochs - 在训练期间不需要评估模型的次数。
  • batch_size - 训练实例。

      让我们以一个简单的 numpy 随机数据示例来使用这个概念。

6 创建数据

      让我们在下面提到的命令的帮助下使用 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))

7 创建模型

      让我们创建简单的顺序模型:

from keras.models import Sequential model = Sequential()

8 添加层

       创建层以添加到模型中:

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))

9 编译模型

      现在模型已定义。 您可以使用以下命令进行编译:

model.compile(loss = categorical_crossentropy, optimizer = sgd, metrics = [accuracy])

10 进行拟合

      现在我们应用 fit() 函数来训练我们的数据:

model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))

11 创建多层感知器 ANN

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

11.1 数据集模块

      在创建模型之前,我们需要选择一个问题,需要收集所需的数据并将数据转换为 NumPy 数组。 收集数据后,我们可以准备模型并使用收集的数据对其进行训练。 数据收集是机器学习中最困难的阶段之一。 Keras 提供了一个特殊的模块,即数据集,用于下载用于训练目的的在线机器学习数据。 它从在线服务器获取数据,处理数据并将数据作为训练和测试集返回。 让我们检查一下 Keras 数据集模块提供的数据。 模块中可用的数据如下:

  • CIFAR100小图像分类
  • IMDB电影评论情感分类
  • 路透社新闻专线主题分类
  • MNIST 手写数字数据库
  • Fashion-MNIST 时尚文章数据库
  • 波士顿房价回归数据集

      让我们使用手写数字(或 mnist)的 MNIST 数据库作为您的输入。 mnist 是 60,000 张 28x28 灰度图像的集合。 它包含 10 位数字。 它还包含 10,000 张测试图像。下面的代码可用于加载数据集:

from keras.datasets import mnist 

(x_train, y_train), (x_test, y_test) = mnist.load_data()
  • 第一行:从 keras 数据集模块导入 minst。
  • 第三行:调用 load_data 函数,该函数将从在线服务器获取数据并将数据作为 2 个元组返回,第一个元组 (x_train, y_train) 表示具有形状的训练数据 (number_sample, 28, 28) 及其带有形状的数字标签, (number_samples, )。 第二个元组 (x_test, y_test) 表示具有相同形状的测试数据。

       其他数据集也可以使用类似的 API 获取,每个 API 也返回类似的数据,除了数据的形状。 数据的形状取决于数据的类型。

11.2 创建模型

       让我们选择一个简单的多层感知器 (MLP),如下所示,并尝试使用 Keras 创建模型。

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)
)


12 最后的思考

      我们已经创建了模型,加载了数据并将数据训练到模型中。 我们仍然需要评估模型并预测未知输入的输出,我们将在以后的文章中介绍。

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))

以上是关于Keras中模型的编译的主要内容,如果未能解决你的问题,请参考以下文章

使用Keras训练神经网络备忘录

使用自定义损失函数编译 Keras 模型时出现 TypeError

标准 Keras 模型输出是啥意思? Keras 的时代和损失是啥?

如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?

在 Keras 训练期间动态更改损失函数,无需重新编译优化器等其他模型属性

Keras深度学习实战——神经网络性能优化技术详解