资讯专栏INFORMATION COLUMN

深度学习 101-搭建 ResNet 识别鲜花图像

mikasa / 913人阅读

摘要:前言是一种经典的图像识别领域模型,在年图像识别领域多个竞赛中排行第一,并且性能上相较第二有大幅提升。在这篇文章里,我们就站在巨人们的肩膀上,搭建一个基于识别花卉图片的神经网络吧。

1 前言

ResNet 是一种经典的图像识别领域模型,在 2015 年图像识别领域多个竞赛中排行第一,并且性能上相较第二有大幅提升。在这篇文章里,我们就站在巨人们的肩膀上,搭建一个基于 ResNet 识别花卉图片(Oxford 102 Flowers)的神经网络吧。

2 ResNet 简介

在 ResNet 以前,由于存在梯度消失和梯度爆炸的问题,神经网路层数越深,网络越难以训练,导致深层网络的准确度出现下降。

ResNet 通过引入残差块(Residual block),将 a[l]添加到第二个 ReLU 过程中,直接建立 a[l]与 a[l+2]之间的隔层联系。表达式如下:

论文[1]作者推测模型对残差的拟合优化会比对随机权重的拟合更加容易(因为baseline就是恒等映射),所以在极端状况下,残差块的中间层没有激活,即W≈0,b≈0,则有:

残差块示例

所以这种构造方式保证了深层的网络比浅层包含了更多(至少恒等)的图像信息。多个残差块推挤在一起,便形成了一个残差网络。

残差网络和普通深度神经网络对比

3 用 ResNet 构造分类模型

在下列 demo 中,我们使用 keras 已有的 ResNet50预训练模型,对 Oxford 102 Flowers 数据集中的 10 种花卉图片进行多分类任务模型的构造。在工程上我们只需要修改 ResNet50 顶部的全连接层,对输入的图片数据进行裁剪,旋转,放大等数据增强,训练所有模型参数即可。代码如下:

import osfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Model, load_modelfrom keras.applications import ResNet50from keras.optimizers import Adamfrom keras.layers import Flatten, Dense, Dropout, Inputfrom keras.callbacks import EarlyStopping, ModelCheckpointimport numpy as npimport mathdef fc_block(X,units,dropout,stage):    fc_name = "fc" + str(stage)    X = Dense(units,activation ="elu",name = fc_name)(X)    X = Dropout(dropout)(X)    return Xdef ResNet50_transfer():    #call base_model    base_model = ResNet50(        include_top=False,        weights="imagenet",        input_tensor= Input(shape=img_size + (3,))    )    # freeze resnet layers" params    for layer in base_model.layers:        layer.trainable = False    # top architecture    X = base_model.output    X = Flatten()(X)    X = Dropout(0.4)(X)    X = fc_block(X,fc_layer_units[0],dropout = 0.4,stage = 1)    X = fc_block(X,fc_layer_units[1],dropout = 0.4,stage = 2)    # output layer    X = Dense(len(classes),activation="softmax",name = "fc3_output")(X)    # create model    model = Model(inputs = base_model.input,outputs = X, name = "ResNet50_transfer")    return modeldef generate_data(train_path,valid_path):    # generate & augment training data    train_datagen = ImageDataGenerator(rotation_range=30., shear_range=0.2, zoom_range=0.2, horizontal_flip=True)    train_datagen.mean = np.array([123.675, 116.28 , 103.53], dtype=np.float32).reshape((3, 1, 1))    train_data = train_datagen.flow_from_directory(train_path, target_size=img_size, classes=None)    # generate training data    valid_datagen = ImageDataGenerator()    valid_datagen.mean = np.array([123.675, 116.28 , 103.53], dtype=np.float32).reshape((3, 1, 1))    valid_data = train_datagen.flow_from_directory(valid_path, target_size=img_size, classes=None)    return train_data, valid_datadef call_back():    early_stopping = EarlyStopping(verbose=1, patience=10, monitor="val_loss")    model_checkpoint = ModelCheckpoint(filepath="102flowersmodel.h5", verbose=1, save_best_only=True, monitor="val_loss")    callbacks = [early_stopping, model_checkpoint]    return callbacks# path_to_img: "dataset/flower_data_10/train/1//image_06734.jpg"train_path = "dataset/flower_data_10/train"valid_path = "dataset/flower_data_10/valid"nb_epoch = 20batch_size = 32img_size = (224,224)# output classesclasses = list(map(str,[1,2,3,4,5,6,7,8,9,10]))rgb_mean = [123.68, 116.779, 103.939]fc_layer_units = [512,64]model = ResNet50_transfer()model.compile(loss="categorical_crossentropy", optimizer=Adam(lr=1e-5), metrics=["accuracy"])train_data, valid_data = generate_data(train_path,valid_path)callbacks = call_back()model.fit_generator(train_data, steps_per_epoch= math.ceil(train_data.samples / batch_size), epochs=nb_epoch,                    validation_data=valid_data, validation_steps=math.ceil(valid_data.samples / batch_size),                    callbacks=callbacks)

经过 20 个 epoch 的训练后,验证集的准确度已经达到了 0.8837。

4 小结

本文章简单地介绍了 ResNet 的特点,以及提供了搭建图片分类模型的代码模板。显卡配置较高的同学可以尝试搭建不同规模的 ResNet 网络观察网络深度对模型性能的影响;对于图像识别模型感兴趣的同学推荐细读 ResNet 论文: Deep Residual Learning for Image Recognition。

参考资料

[1] Deep Residual Learning for Image Recognition: https://arxiv.org/abs/1512.03385

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123318.html

相关文章

  • 如何将深度学习训练速度提升一百倍?PAISoar 来了

    摘要:概述近几年来深度学习发展迅速,图像处理语音识别等领域都取得了飞速发展。性能指标基于,深度神经网络模型的分布式训练性能提升明显。技术对于许多在大型数据集上训练的现代深度学习模型来说,基于数据并行的同步分布式训练是最合适的训练方法。 阿里妹导读:得力于数据规模增长、神经网络结构的演进和计算能力的增强,深度学习的图像处理、语音识别等领域取得了飞速发展。随着训练数据规模和模型复杂度的不断增大...

    Harriet666 评论0 收藏0
  • 如何将深度学习训练速度提升一百倍?PAISoar 来了

    摘要:概述近几年来深度学习发展迅速,图像处理语音识别等领域都取得了飞速发展。性能指标基于,深度神经网络模型的分布式训练性能提升明显。技术对于许多在大型数据集上训练的现代深度学习模型来说,基于数据并行的同步分布式训练是最合适的训练方法。 阿里妹导读:得力于数据规模增长、神经网络结构的演进和计算能力的增强,深度学习的图像处理、语音识别等领域取得了飞速发展。随着训练数据规模和模型复杂度的不断增大...

    cpupro 评论0 收藏0
  • 计算机视觉和 CNN 发展十一座里程碑

    摘要:从到,计算机视觉领域和卷积神经网络每一次发展,都伴随着代表性架构取得历史性的成绩。在这篇文章中,我们将总结计算机视觉和卷积神经网络领域的重要进展,重点介绍过去年发表的重要论文并讨论它们为什么重要。这个表现不用说震惊了整个计算机视觉界。 从AlexNet到ResNet,计算机视觉领域和卷积神经网络(CNN)每一次发展,都伴随着代表性架构取得历史性的成绩。作者回顾计算机视觉和CNN过去5年,总结...

    刘厚水 评论0 收藏0
  • 经典ResNet结果不能复现?何恺明回应:它经受住了时间的考验

    摘要:大神何恺明受到了质疑。今天,上一位用户对何恺明的提出质疑,他认为何恺明年的原始残差网络的结果没有被复现,甚至何恺明本人也没有。我认为,的可复现性经受住了时间的考验。 大神何恺明受到了质疑。今天,Reddit 上一位用户对何恺明的ResNet提出质疑,他认为:何恺明 2015 年的原始残差网络的结果没有被复现,甚至何恺明本人也没有。网友称,他没有发现任何一篇论文复现了原始 ResNet 网络的...

    Ilikewhite 评论0 收藏0
  • 斯坦福:「目标检测」深度学习全面指南

    摘要:然而,幸运的是,目前更为成功的目标检测方法是图像分类模型的扩展。几个月前,发布了一个用于的新的目标检测。 随着自动驾驶汽车、智能视频监控、人脸检测和各种人员计数应用的兴起,快速和准确的目标检测系统也应运而生。这些系统不仅能够对图像中的每个目标进行识别和分类,而且通过在其周围画出适当的边界来对其进行局部化(localizing)。这使得目标检测相较于传统的计算机视觉前身——图像分类来说更加困难...

    Harpsichord1207 评论0 收藏0

发表评论

0条评论

mikasa

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<