Keras深度学习简介

Keras是一种高级神经网络API,能够在Tensorflow,Theano和CNTK之上运行。它通过高标准,模块化和可扩展的API实现快速试验。Keras也可以在CPU和GPU上运行。

Keras 由Francois Chollet开发和维护,是Tensorflow核心的一部分,这使得Tensorflows是高级API的首选。

本文是关于如何使用Keras进行深度学习。

在本文中,我们将介绍Keras的基础知识,包括两个最常用的Keras模型(Sequential和Functional),核心层以及一些预处理功能。

安装Keras

假设您已经安装了Tensorflow或Theano或CNTK。

可以使用pip或conda安装Keras:

pip install keras

or

conda install keras

加载数据集

Keras提供七种不同的数据集,可以直接使用Keras加载。这些包数据括图像数据集、房价和电影评论数据集。

在本文中,我们将使用MNIST数据集,其中包含70000张28x28灰度图像和10个不同的类。Keras将其拆分为具有60000个实例的训练集和具有10000个实例的测试集。

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

Keras深度学习简介

为了将图像提供给卷积神经网络,我们将dataframe(数据帧)转换为四个维度。这可以使用numpys reshape方法完成。我们还将数据转换为浮点数并将其标准化。

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

x_train = X_train.reshape(X_train.shape[0], 32, 32, 1)
x_test = X_test.reshape(X_test.shape[0], 32, 32, 1)

Keras深度学习简介

我们还将使用Keras的to_categorical方法将标签转换为热编码。

from keras.utils import to_categorical

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

Keras深度学习简介

使用sequential API创建模型

在Keras中创建模型的最简单方法是使用sequential API,它允许层层堆栈。sequential API的问题在于它不允许模型具有多个输入或输出,这些是某些问题所需要的。

然而,sequential API是大多数问题的完美选择。

要创建卷积神经网络,我们只需要创建一个Sequential对象并使用该add函数来添加层。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=x_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(10, activation='softmax'))

Keras深度学习简介

上面的代码首先创建一个Sequential对象并添加一些卷积,最大池化和损失层。然后它将输出展平并将其传递给最后一个密集和损失层,然后再将其传递到输出层。

sequential API还支持另一种语法,直接将层传递给构造函数。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout

model = Sequential([
 Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=x_train.shape[1:]),
 Conv2D(filters=32, kernel_size=(5,5), activation='relu'),
 MaxPool2D(pool_size=(2, 2)),
 Dropout(rate=0.25),
 Conv2D(filters=64, kernel_size=(3,3), activation='relu'),
 Conv2D(filters=64, kernel_size=(3,3), activation='relu'),
 MaxPool2D(pool_size=(2, 2)),
 Dropout(rate=0.25),
 Flatten(),
 Dense(256, activation='relu'),
 Dropout(rate=0.5),
 Dense(10, activation='softmax')
])

Keras深度学习简介

使用Functional API创建模型

functional API允许创建相同的模型,以简单性和可读性为代价提供更大的灵活性。

它可以与多个输入和输出层以及共享层一起使用,这使得能够构建真正复杂的网络结构。

使用functional API时,我们总是需要将前一层传递给当前层。它还需要使用输入层。

from keras.models import Model
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout, Input

inputs = Input(shape=x_train.shape[1:])

x = Conv2D(filters=32, kernel_size=(5,5), activation='relu')(inputs)
x = Conv2D(filters=32, kernel_size=(5,5), activation='relu')(x)
x = MaxPool2D(pool_size=(2, 2))(x)
x = Dropout(rate=0.25)(x)

x = Conv2D(filters=64, kernel_size=(3,3), activation='relu')(x)
x = Conv2D(filters=64, kernel_size=(3,3), activation='relu')(x)
x = MaxPool2D(pool_size=(2, 2))(x)
x = Dropout(rate=0.25)(x)

x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(rate=0.5)(x)
predictions = Dense(10, activation='softmax')(x)

model = Model(inputs=inputs, outputs=predictions)

Keras深度学习简介

functional API也经常用于迁移学习。

编译模型

在开始训练模型之前,我们需要先配置学习过程。为此,我们需要指定一个优化器、一个损失函数和一些可选的指标,如准确性。

损失函数是衡量我们的模型在实现给定目标方面有多好。

优化器用于通过使用梯度更新权重来最小化损失(目标)函数。

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

Keras深度学习简介

扩充图像数据

扩充是从现有数据中创建更多数据的过程。对于图像,对于图像,可以进行小的转换,如旋转图像、缩放图像、添加噪声等等。

这有助于使模型更加稳定,并解决了数据不足的问题。Keras有一种方法ImageDataGenerator可以用来增强图像。

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
 rotation_range=10,
 zoom_range=0.1,
 width_shift_range=0.1,
 height_shift_range=0.1
)

Keras深度学习简介

这ImageDataGenerator 将创建新的图像,这些图像将被旋转,放大或缩小,并在宽度和高度上移位。

配置模型

现在我们定义并编译了我们的模型,它已准备好进行训练。为了训练模型,我们会正常使用该fit方法,但因为我们正在使用datagenerator,我们将使用fit_generator并将我们的生成器,X数据,y数据以及周期数和批量大小传递给它。我们还将它传递给验证集,以便我们可以观测两组的损失和准确性以及使用生成器时所需的steps_per_epoch,并且只设置为训练集的长度除以batch_size。

epochs = 3
batch_size = 32
history = model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), epochs=epochs,
 validation_data=(x_test, y_test), steps_per_epoch=x_train.shape[0]//batch_size)

Keras深度学习简介

Keras深度学习简介

输出

可视化训练过程

我们可以将每个时期的训练和测试准确性和损失可视化,以便我们可以直观地了解模型的性能。在训练时获得的历史变量中保存了跨时间的准确性和损失,我们将使用Matplotlib来可视化这些数据。

import matplotlib.pyplot as plt

plt.plot(history.history['acc'], label='training accuracy')
plt.plot(history.history['val_acc'], label='testing accuracy')
plt.title('Accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()

Keras深度学习简介

Keras深度学习简介

训练/测试的准确性

plt.plot(history.history['loss'], label='training loss')
plt.plot(history.history['val_loss'], label='testing loss')
plt.title('Loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()

Keras深度学习简介

Keras深度学习简介

训练/测试的损失

在上图中,我们可以看到模型没有过度拟合,因为验证损失仍然在减少,所以我们可以继续训练。

结论

本文中,我们介绍了如何安装以及如何创建一个简单的卷积神经网络。

相关推荐