1. 简介
深度学习是目前人工智能领域中最火热的技术之一,深度学习对应的Python库非常多,keras即为其中一种。Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行,这样我们就可以使用 Keras 轻松地开发深度学习模型,而不需要深入掌握所使用的后端库。
2. 环境搭建
2.1 安装 keras 库
首先,需要使用 pip 安装 Keras。在终端输入以下代码:
pip install keras
如果你的 python 2.x 版本与 python 3.x 版本都安装了Keras模块,那么需要加上版本号,例如:
pip install keras==2.2.4
安装完成后,在python中导入keras。在 python 代码中输入以下代码:
import keras
2.2 安装相关依赖库
Keras 的后端有多种选择,我们这里采用最常见的 TensorFlow。最好将 TensorFlow 升级到最新版本。同时,还需要安装以下库:
NumPy—Python中用于科学计算的一个库。
Pandas—Python中一个常用的数据分析库,可以用于数据预处理。
Matplotlib—Python中一个著名的用于绘制图表的库。
在终端输入以下代码进行上述库的安装:
pip install tensorflow
pip install numpy
pip install pandas
pip install matplotlib
3. 用 Keras 训练模型
在深度学习中,我们首先需要准备好输入数据和输出数据的结构。因此,我们首先会进行数据预处理。在 Keras 中,提供了一些常见数据集的 API,例如 CIFAR-10、MNIST、Fashion-MNIST 等。这里我们以 CIFAR-10 数据集为例,介绍如何使用 Keras 训练模型。
3.1 数据预处理
首先导入 Keras 中的 cifar10 数据集:
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
对于数据预处理部分,需要将图像的像素值映射到 0~1 范围内,因此将像素值除以 255 即可。
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
接下来,我们将标签转换为 one-hot 向量。例如,对于 CIFAR-10 数据集,标签值为 0~9,我们将其转换为包含 10 个元素的向量,其中索引为标签值的元素赋值为 1,其他元素赋值为 0。可以使用 Keras 中的 `to_categorical()` 函数来进行转换:
from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
3.2 构建模型
使用 Keras 时,可以通过序列模型来构建多层神经网络。一个简单的序列模型包含一个输入层和一个输出层,中间可包含多个隐藏层。可以通过 Keras 中的 Dense 函数来添加这些层。
以下是一个简单的卷积神经网络实现:
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', input_shape=x_train.shape[1:], activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# compile the model
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
该模型包含两个卷积层、两个池化层和两个 dropout 层。在模型中的每个层后都添加了批量归一化,最后使用 Dense 函数添加一层 softmax 层作为输出层。
3.3 训练模型
在训练模型前,可以使用 summary() 方法查看模型的结构和参数数量。这里的模型参数数量包括所有层中权重矩阵和偏置的数量。
model.summary()
接下来,我们需要使用模型的 fit 函数来训练模型。 fit 函数接受训练数据、标签、批大小、训练轮数等参数。 Keras 可以将训练和测试的过程封装在一函数中,即 fit() 函数。
# Train the model
batch_size = 64
epochs = 10
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test),
shuffle=True)
在这里,我们训练了 10 次,每次以大小为 64 的批次进行训练。
4. 结果评估
在训练完成后,我们可以使用模型的 evaluate() 或 predict() 方法来评估模型。评估模型时,我们需要将测试数据传递给模型及其对应的标签值。由于模型输出的是概率值,因此我们需要将概率转换为标签。
# Evaluate the model
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])
该代码段将输出测试损失和测试精度。以下是运行结果:
10000/10000 [==============================] - 3s 335us/step
Test loss: 0.8387068187713623
Test accuracy: 0.7177999858856201
5. 总结
本文使用 Keras 及 TensorFlow 后端建立卷积神经网络来对 CIFAR-10 数据集进行分类。 在训练模型时,我们进行了数据预处理过程,将像素值映射到了 0~1 范围内,将标签转换为 one-hot 向量。接下来,我们使用 tensorflow 后端建立了简单的卷积神经网络模型,并进行了训练。在训练后,我们使用 evaluate() 方法对模型进行了评估。