Keras简介

目录

安装

后端配置

用Keras进行图像分类

拟合模型

测试模型

生成预测

数据扩充

保存和还原模型

下一步


这是我们系列中有关学习Python及其在机器学习和AI中的用途的第七个模块。在上一篇中,我们讨论了使用NLTK进行文本分析。现在让我们进入Keras,这是神经网络的高级库。

安装

使用Anaconda conda install可以轻松安装Keras

conda install keras

这将立即安装您需要的所有依赖项。

后端配置

Keras可以使用几种可用库之一作为后端,这是处理诸如张量之类的底层操作的部分。我们将使用TensorFlow,这是默认设置。

首先,我们将略微调整TensorFlow的配置。具体来说,我们将选项allow_growth设置为true,这使TensorFlow可以动态增长已使用的GPU内存,而无需事先分配所有内容。如果我们不这样做,TensorFlow可能会尝试分配过多的内存,以至于您的GPU立即耗尽内存(对我而言确实如此)。为此,将以下代码放在文件的开头:

如果您的后端是TensorFlow 1.x

from keras.backend.tensorflow_backend import set_session
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
set_session(tf.Session(config=config))

对于TensorFlow 2.x,您必须为GPU 调用函数set_memory_growth。您可以在tf.config.experimental.set_memory_growth文档中详细了解其背后的细节。

您有哪个版本?检查命令conda list的结果以查看您的TensorFlow版本。即使使用相同的Anaconda安装命令,我在一台计算机上的版本为1.13.1,另一台计算机的版本为2.1.0

如果要强制Keras使用CPU而不是GPU,请在首次导入Keras之前添加以下代码:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

这比GPU慢很多,但是如果您没有很多GPU内存,则可能要这样做。

Keras进行图像分类

我们将使用英特尔®图像分类数据集演示Keras的图像分类。该数据集包含六个类别的图像,分为六个不同的目录,这非常方便,因为Keras提供了内置功能来处理该格式的数据。

尽管您不必为神经网络背后的数学问题担心太多,但您确实需要足够的了解,因为您必须准确指定模型包含哪些层。

Keras提供的模型之一是顺序模型,即多层模型。创建顺序模型并添加层非常容易:

from keras.models import Sequential

model = Sequential()
model.add(layer_one)
model.add(layer_two)
# ...

这是我们的模型对图像分类的外观:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.layers.normalization import BatchNormalization

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(150, 150, 3))) # our images are 150*150
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(128, kernel_size=(3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.15))
model.add(Dense(64, activation="relu"))
model.add(Dense(6, activation="softmax"))

神经网络模型的构建超出了本模块的范围,但总而言之:卷积层的重复模式(由于模式越来越复杂,滤波器数量不断增加),最大池化层和批处理归一化通常用作图像分类问题的第一步。该步骤的输出是多维的,我们将其平展为具有Flatten层的一维矢量。我们以几个紧密连接的层作为结束,在这两个层之间有一个遗漏层,以帮助对抗过拟合。最后一层必须输出带有六个元素的向量,因为我们有六个类别。

接下来,我们编译模型,这意味着我们对其进行配置以进行训练:

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

我们的损失函数sparse_categorical_crossentropy很好地适合分类问题,而类别之间没有重叠。有关损失函数的完整讨论,请参见Keras文档。我们正在使用Adam优化器。有关优化程序的完整列表,请参见相关文档。并且metrics指定模型在训练和测试期间的评估结果。

拟合模型

现在我们有了模型的结构,可以将其适合我们的数据集。

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(validation_split=0.2)
train_generator = 
    datagen.flow_from_directory("intel-images/seg_train/seg_train", 
    batch_size=32, target_size=(150,150), class_mode="sparse", 
    subset="training")
validation_generator = 
    datagen.flow_from_directory("intel-images/seg_train/seg_train", 
    batch_size=32, target_size=(150, 150), class_mode="sparse", 
    subset="validation")
model.fit_generator(train_generator, epochs=40, 
                    validation_data=validation_generator)

(如果你想在精度较低的情况下更快地完成这个过程,请随意减少epoch的数量,特别是如果你使用CPU的话。40 epoch需要相当长的时间。)

根据Keras文档,这就是ImageDataGenerator所做的

使用实时数据增强生成一批张量图像数据。数据将被循环(分批)。

我们的示例不进行任何数据扩充。我们稍后再看一下该功能。

在前面的代码中,validation_split=0.2意味着我们将使用训练集的20%进行验证。由于数据集仅包含训练集和测试集,因此我们必须使用训练集的子集作为验证集。

flow_from_directory 是一个简洁的内置函数,非常适合像我们这样的数据集结构:每个类别的子目录。

class_mode="sparse" 表示我们正在使用一维整数标签。

fit_generatorImageDataGenerator在指定的多个时期内使模型适合。

测试模型

训练后,我们可以使用evaluate_generator函数测试模型。就像fit_generator一样,它需要一个生成器作为参数。我们可以为测试数据创建一个,类似于对训练数据进行的创建:

test_datagen = ImageDataGenerator()
test_generator = 
    datagen.flow_from_directory(
        "intel-images/seg_test/seg_test", 
        target_size=(150,150), class_mode="sparse")
print(model.evaluate_generator(test_generator))

对于我们的示例,这将返回一个包含两个值的数组:损失和准确性。(您可以通过查看model.metrics_names值进行检查。)

我的准确度为81.7%,对于非平凡的数据集上相对简单的模型而言,这还不错。

生成预测

现在,您可以使用model.predict方法在任何图像上生成预测。此方法将图像的NumPy数组作为输入,其中图像也是形状(1501503)的NumPy数组。要对一张图像进行预测,可以执行以下操作:

import skimage.io
import numpy as np

model.predict(np.expand_dims(skimage.io.imread("file.jpg"), axis=0))

skimage.io.imread将读取图像并向expand_dims数组添加另一个维度。输出是一组预测,其中每个预测是一组值,这些值指示每个类别的概率。

数据扩充

数据扩充是指您根据现有的训练集生成新的训练数据时,以提高准确性和通用性并减少过度拟合。

对于图像,可以通过对图像进行多种转换来进行数据增强:旋转、翻转、缩放、移动、剪切等。

ImageDataGenerator使这变得容易。要将数据扩充应用于我们的模型,只需更改两行代码。

首先,使用更多参数实例化ImageDataGenerator,指定我们想要的转换:

datagen = ImageDataGenerator(rotation_range=30, 
                             horizontal_flip=True, 
                             zoom_range=0.2, 
                             shear_range=0.2)

还有很多可能性——有关完整的参数列表,请参见图像预处理文档

第二行是fit_generator调用。这个函数有可选的steps_per_epochvalidation_steps参数,我们可以忽略这些参数,因为我们有固定数量的训练样本。通过数据扩充,我们可能会有大量的训练样本,因此我们必须指定要使用的训练样本数。如果不这样做,该函数将仅使用固定大小的样本集。一个步骤对应于给定batch_size的一批。

model.fit_generator(train_generator, epochs=40, 
                    validation_data=validation_generator, 
                    steps_per_epoch=1600, validation_steps=32)

同样,如果您希望过程更快,请随意减少时期数或步骤数。经过2-3小时的训练,我的准确率达到了85.5%。

保存和还原模型

Keras允许您将训练后的模型保存为HDF5格式:

model.save("images_model.h5")

恢复模型也只需一行:

import keras.models
model = keras.models.load_model("images_model.h5")

这需要h5py软件包,如果您使用,则应已安装conda install。如果没有,请在Jupyter Notebook单元中运行以下pip命令:

!pip install --upgrade h5py

下一步

在本模块中,我们介绍了在图像分类问题中使用Keras的过程。Keras的可用层比我们在这里使用的层多得多。如果您想深入研究,可以使用Keras文档作为起点。Iit还提供了许多常见的深度学习问题的示例。

接下来的模块中,我们将简单的介绍一下TensorFlow,与NumPyscikit学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值