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()
为了将图像提供给卷积神经网络,我们将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的to_categorical方法将标签转换为热编码。
from keras.utils import to_categorical y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10)
使用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'))
上面的代码首先创建一个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') ])
使用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)
functional API也经常用于迁移学习。
编译模型
在开始训练模型之前,我们需要先配置学习过程。为此,我们需要指定一个优化器、一个损失函数和一些可选的指标,如准确性。
损失函数是衡量我们的模型在实现给定目标方面有多好。
优化器用于通过使用梯度更新权重来最小化损失(目标)函数。
model.compile( loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] )
扩充图像数据
扩充是从现有数据中创建更多数据的过程。对于图像,对于图像,可以进行小的转换,如旋转图像、缩放图像、添加噪声等等。
这有助于使模型更加稳定,并解决了数据不足的问题。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 )
这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)
输出
可视化训练过程
我们可以将每个时期的训练和测试准确性和损失可视化,以便我们可以直观地了解模型的性能。在训练时获得的历史变量中保存了跨时间的准确性和损失,我们将使用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()
训练/测试的准确性
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()
训练/测试的损失
在上图中,我们可以看到模型没有过度拟合,因为验证损失仍然在减少,所以我们可以继续训练。
结论
本文中,我们介绍了如何安装以及如何创建一个简单的卷积神经网络。