初学者怎样使用Keras进行迁移学习

雷锋网  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  
初学者怎样使用Keras进行迁移学习

本文为 AI 研习社编译的技术博客,原标题 :

Keras Transfer Learning For Beginners

作者 |  Aditya Ananthram

翻译 | 邓普斯•杰弗、斯蒂芬•二狗子

校对 | 邓普斯•杰弗       校对 | 邓普斯•杰弗     整理 | 菠萝妹

原文链接:

https://towardsdatascience.com/keras-transfer-learning-for-beginners-6c9b8b7143e

初学者怎样使用Keras进行迁移学习

本博客由3部分组成:

  1. 什么是迁移学习?

  2. 为什么迁移学习如此有效?

  3. 使用迁移学习实现一个图像识别器。

直接访问Github上的代码。

初学者怎样使用Keras进行迁移学习

“夜晚的星系”由布莱恩高夫在 Unsplash 发布  


    什么是迁移学习?

如果没有迁移学习,实现机器学习对于初学者来说是一件非常艰难的事情。在机器学习底层上,涉及计算从输入侧映射到输出之间的函数。函数本身只是一些加法和乘法的计算,当通过非线性激活函数和一些堆叠的神经网络层,可以构建这样的具有学习能力的函数,只要有足够的数据可供学习,并且有巨大的计算能力,就可以依葫芦画瓢地学习。

欢迎来到深度学习。

卷入神经网络在训练足够的数据时可以学习极其复杂的映射函数。我们还不能理解卷积网络是如何学习这种复杂的映射关系。

在基本层面上,CNN(卷积神经网络)的权重由过滤器组成。把一个过滤器想象成一个由某些数字组成的(n*n)矩阵。现在,这个过滤器对输入的图像进行卷积(滑动和乘法)。假设输入图像的大小为(10,10),过滤器的大小为(3,3),首先将过滤器与输入图像左上角的9个像素相乘,此相乘产生另一个(3,3)矩阵。该矩阵的9个像素值相加,该值成为CNN第2层左上角的单个像素值。

初学者怎样使用Keras进行迁移学习

卷积网络的表示

CNN的训练基本上包括在每个过滤器上找到正确的值,这样当输入图像通过多层时,激活最后一层的某些神经元,从而预测正确的类别。

尽管对于小型项目来说,从头开始训练CNN是可能的,但大多数应用程序都需要对非常大的CNN进行训练,正如您所猜测的,这需要非常大量的数据处理和计算能力。而这两个都不是那么容易被实现的。

这就是迁移学习的作用所在。在迁移学习中,我们取一个已经训练过的模型的预先训练的权重(一个已经在1000个类别的数百万张图片上训练过的权重,在几天的高功率GPU上训练过的权重),并使用这些已经学习过的特征来预测新的类别。

迁移学习的优势在于:

1:不需要一个非常大的训练数据集。

2:不需要太多的计算能力,因为我们使用的是预先训练好的权重,只需要学习最后几层的权重。

有几个模型已经在图像网络数据集上进行了训练,并且已经开放源代码。

例如,vgg-16、vgg-19、inception-v3等。有关这些型号的更多详细信息,请阅读此处的官方keras文档。


    为什么迁移学习如此有效?

为了了解为什么迁移学习如此有效,我们必须首先看看卷积神经网络的不同层真正学习的是什么。

当我们在一组图像上训练一个深卷积神经网络时,在训练过程中,通过在每一层图像上应用多个过滤器,图像通过网络。过滤矩阵的值与每层图像的激活值相乘。最后一层的激活用于确定图像属于哪个类。

当我们训练一个深层网络时,我们的目标是在每个滤波器矩阵上找到最佳值,这样当图像通过网络传播时,输出激活可以用来精确地找到图像所属的类。寻找这些滤波器矩阵值的过程是梯度下降。

当我们在ImageNet数据集上训练一个conv网络,然后看看conv网络的每一层上的过滤器学会了识别什么,或者每个过滤器被激活了什么,我们就能看到一些真正有趣的东西。

初学者怎样使用Keras进行迁移学习

conv网络前几层的过滤器学习识别颜色和某些水平和垂直线。

接下来的几层慢慢地学习如何使用在前几层中学习到的线条和颜色来识别细小的形状。

然后,下一层学习识别纹理,然后部分对象,如腿、眼睛、鼻子等。

最后,最后一层中的过滤器被诸如狗、汽车等整个物体激活。

初学者怎样使用Keras进行迁移学习

现在让我们开始迁移学习。它之所以如此有效,是因为我们使用了一个对ImageNet数据集进行预训练的网络,并且该网络已经学会识别初始层中不同对象的微小形状和小部分。通过使用预训练网络来进行迁移学习,我们只需在预训练网络的末尾添加一些密集的层,然后学习这些已经学习的特性的组合有助于识别新数据集中的对象。

因此,我们只训练了几个密集层。此外,我们使用这些已经学习过的琐碎特性的组合来识别新对象。所有这些都有助于使训练过程非常快速,与从头开始训练conv net相比,所需的训练数据非常少。


    现在让我们使用Keras中的迁移学习建立一个实际的图像识别模型。

我们将在这里使用的模型是MobileNet。

MobileNet是一种模型,它可以提供相当好的图像网络分类精度并占用非常少的空间。(根据keras文档,17 MB)。

需要的依赖关系:

  • Keras(带有tensorflow后端)

  • NumPy

  • Matplotlib

  • pandas

数据要求:

  • 训练数据必须以特定格式存储,以便馈送到网络中进行训练。我们将使用Keras中提供的ImageDataGenerator来训练我们的可用数据模型。这样,就代码而言,该过程变得更加简单。

  • 必须有一个主数据文件夹,在该数据文件夹中,每个包含相应图像的数据类必须有一个文件夹。文件夹的名称必须是其各自类的名称。

模型的构建是一个三步过程:

  1. 导入预先训练的模型并添加密集层。

  2. 将数据加载到ImageDataGenerators中。

  3. 训练和评估模型。

首先,载入相关包

						

import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense,GlobalAveragePooling2D
from keras.applications import MobileNet
from keras.preprocessing import image
from keras.applications.mobilenet import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam

然后,导入预训练好的MobileNet模型。Mobilenet(在Imagenet数据集上针对1000个类进行了训练)的最后一层由1000个神经元组成(每类一个)。 我们需要在网络的最后一层有尽可能多的神经元,一遍我们得到和我们想要识别的图片类别的数量一样。 因此,我们删掉这个了1000个神经元的网络层,并在网络最后添加了我们自己的定义的全连接层。

这过程可以通过导入模型时设置(IncludeTop=False)来实现。 

假设你想训练一个犬种分类器来识别120种不同的犬种,我们最后一层只需要120个神经元。使用以下代码完成。  

这是这个过程的第一步。导入和构建所需的模型。 

要检查模型的体系结构,我们只需要使用下面给出的这行代码。

						

for i,layer in enumerate(model.layers):
  print (i,layer.name)

现在我们有了模型,我们将使用预先训练的权重,我们的模型已经在(Imagenet数据集)上训练过了,我们必须将所有的权重设置为不可训练。我们将只训练我们之前制作的最后一层致密层。下面给出了这样做的代码。 

						

for layer in model.layers:
   layer.trainable= False
# or if we want to set the first 20 layers of the network to be non-trainable
for layer in model.layers[: 20 ]:
   layer.trainable= False
for layer in model.layers[ 20 :]:
   layer.trainable= True

现在我们进入流程的第2步,将训练数据加载到ImageDataGenerator中。

ImageDataGenerators内置在keras中,帮助我们训练我们的模型。我们只需要指定训练数据的路径,它就会自动分批发送训练数据。它使代码更加简单。为此,我们需要使用博客前面提到的特定格式的培训数据。

						

train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) #included in our dependencies

train_generator=train_datagen.flow_from_directory( 'path-to-the-main-data-folder' ,
                                                target_size=( 224 , 224 ),
                                                color_mode= 'rgb' ,
                                                batch_size= 32 ,
                                                class_mode= 'categorical' ,
                                                shuffle= True )

接下来我们进入步骤3,在数据集上训练模型。 

为此,我们首先编译我们创建的模型,然后用generator训练我们的模型。这可以使用下面的代码来完成。

						

model.compile(optimizer= 'Adam' ,loss= 'categorical_crossentropy' ,metrics=[ 'accuracy' ])
# Adam optimizer
# loss function will be categorical cross entropy
# evaluation metric will be accuracy

step_size_train=train_generator.n //train_generator.batch_size
model.fit_generator(generator=train_generator,
                  steps_per_epoch=step_size_train,
                  epochs= 10 )

有了这个,我们将训练一个模型。然后,通过使用这个训练过的模型预测新图片,类似代码model.predict(new_image)。

获取Github上的代码。

一如既往,快乐学习。


想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击【 初学者怎样使用Keras进行迁移学习 】:

https://ai.yanxishe.com/page/TextTranslation/1184


AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网雷锋网雷锋网 (公众号:雷锋网)

使用树莓派和Python实现目标检测

杰出数据科学家的关键技能是什么?

初学者怎样使用Keras进行迁移学习

如果你想学数据科学,这 7 类资源千万不能错过

等你来译:

深度学习目标检测算法综述

一文教你如何用PyTorch构建 Faster RCNN

高级DQNs:利用深度强化学习玩吃豆人游戏

用于深度强化学习的结构化控制网络 (ICML 论文讲解)


随意打赏

机器学习
提交建议
微信扫一扫,分享给好友吧。