imagenet在图像识别领域里面有着很高地知名度,数据量大,数据类别多,很多比赛也都是围绕着这个数据集展开的,我们今天并不是要使用这么大的数据集,因为的确是算力不太能达到要求,这里就退而求其次,使用网上公开的mini-imagenet数据集来进行实验,这个数据集里面一共有6w张图片,共分为100个类别,每个类别里面有600张图片。

数据集截图如下所示:

接下来随便看几个类别的数据集。

n01981276:

n02099601:

n02116738:

n13133613:

迁移学习是一种很强大的深度学习技术,在实际应用中解决图像分类等问题中效果卓越,用一句简单的话来说就是“站在巨人的肩膀山学习”,大多数针对图像分类任务而开源出来的迁移学习模型很多都是基于ImageNet数据集开发的,这些预训练的模型往往都是那些谷歌、亚马逊等大厂耗费大量的计算资源训练几周的时间跑出来的模型,在图像的特征提取计算上都有着非常不错的性能,以至于对于我们【小批量数据+简单神经网络】模式的实验来说,我们往往会选择使用【预训练模型+fine-tuning】的方式来高效地达到我们所需的效果,请注意,这里是高效。

首先我们来开发一个数据生成器,用于后续模型的训练:

def imageGenerator(h=224,w=224):'''由于深度学习模型所需数据较多,这里设计实现了图片生成器'''train_datagen=ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')validation_datagen=ImageDataGenerator(rescale=1./255)train_generator=train_datagen.flow_from_directory(trainDir,target_size=(224,224),batch_size=bsize,class_mode='categorical')validation_generator=validation_datagen.flow_from_directory(testDir,target_size=(224, 224),batch_size=bsize,class_mode='categorical')  return train_generator,validation_generator

接下来初始化模型:

def myVGGModel(freeze_num=11,h=224,w=224,way=3):'''初始化定义迁移学习模型'''conv_base=VGG19(input_shape=(h,w,3), include_top=False, weights='imagenet')x=conv_base.outputx=Dense(512, activation='relu',kernel_regularizer=regularizers.l2(l=0.0001))(x)x=Dropout(0.3)(x)prediction=Dense(62,activation='softmax')(x)model=Model(inputs=conv_base.input,outputs=prediction)  #构造完新的FC层,加入custom层model.summary()print("layer nums:", len(model.layers))for layer in model.layers[:freeze_num]:layer.trainable = Falsefor layer in model.layers[freeze_num:]:layer.trainable = Truefor layer in model.layers:print("layer.trainable:", layer.trainable)#模型编译model.compile(optimizer=SGD(lr=0.0001, momentum=0.9),loss='categorical_crossentropy', metrics=['accuracy'])return model

接下来是模型的训练部分:

#模型训练拟合计算
history=model.fit_generator(train_generator,epochs=1000,validation_data=test_generator)
#训练数据曲线可视化
print(history.history.keys())
plt.clf()
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epochs')
plt.legend(['train','test'], loc='upper left')
plt.savefig(saveDir+'train_validation_acc.png')
plt.clf()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig(saveDir+'train_validation_loss.png')
#保存模型结构+权重数据
model_json=model.to_json()
with open(saveDir+'structure.json','w') as f:f.write(model_json)
model.save_weights(saveDir+'weight.h5')
print('Model Save Success.........................................')

训练结束后,我设定了自动存储模型的结构和权重信息,另外对整个训练过程的loss曲线和准确度曲线也进行了可视化。

train_validation_acc.png如下所示:

train_validation_loss.png如下所示:

默认训练了1000次,在验证集上达到了76%左右的精度,这个还没有调参,对于这个数据量应该还算可以的了:

基于迁移学习的mini-imagenet数据分类实践相关推荐

  1. 【Pytorch神经网络实战案例】24 基于迁移学习识别多种鸟类(CUB-200数据集)

    1 迁移学习 在实际开发中,常会使用迁移学习将预训练模型中的特征提取能力转移到自己的模型中. 1.1 迁移学习定义 迁移学习指将在一个任务上训练完成的模型进行简单的修改,再用另一个任务的数据继续训练, ...

  2. 【城市污水处理过程中典型异常工况智能识别】(基于迁移学习,拓扑结构卷积神经网络的污水异常工况识别)

    基于迁移学习拓扑结构卷积神经网络的污水异常工况识别 **摘 要:针对城市污水处理过程的异常工况识别问题,本文提出了基于图像纹理性分析的工况识别方法.首先总结了几种典型的异常工况的特点,并且分析了卷积神 ...

  3. 大作业论文之基于迁移学习的图像预测研究

    基于迁移学习的图像预测研究 摘  要:深度学习技术发展迅速,在图像处理领域取得了显著成果.[2]但是由于部分图像样本少,标注困难,使得深度学习的效果远未达到预期.迁移学习是机器学习中一种新的学习范式, ...

  4. 基于迁移学习的脑肿瘤自动检测研究与系统实现

    摘要 针对深度学习训练成本高,以及基于磁共振图像(Magnetic Resonance Imaging ,MRI)的脑肿瘤临床诊断需要大量医学常识且极为耗时的问题,本文提出了一种基于迁移学习(Tran ...

  5. Python基于MASK信息抽取ROI子图并构建基于迁移学习(densenet)的图像分类器实战(原始影像和mask文件都是二维的情况)

    Python基于MASK信息抽取ROI子图并构建基于迁移学习(densenet)的图像分类器实战(原始影像和mask文件都是二维的情况) 目录

  6. 基于迁移学习的农作物病虫害检测方法研究与应用

    基于迁移学习的农作物病虫害检测方法研究与应用 1.研究思路 迁移学习方式并结合深度学习提出了一种基于残差网络(ResNet 50)的 CDCNNv2 算法.通过对 10类作物 3 万多幅病虫害图像进行 ...

  7. 时间序列预测新范式——基于迁移学习的AdaRNN方法

    本文转载自知乎王晋东不在家的<小王爱迁移>系列之十五:自动选择源域的迁移学习方法 源地址为:<小王爱迁移>系列之32:时间序列预测新范式--基于迁移学习的AdaRNN方法 - ...

  8. 基于迁移学习的旋转机械故障诊断方法研究学习笔记

    基于迁移学习的旋转机械故障诊断方法研究学习笔记 现在大一点的神经网络模型也要求数据量的足够大,但是对于小样本的数据,有一些神经网络模型也能够处理的很好 2. 这是现在神经网络也要求的数据最好能够独立同 ...

  9. 基于迁移学习的语义分割算法分享与代码复现

    摘要:语义分割的数据集是比较大的,因此训练的时候需要非常强大的硬件支持. 本文分享自华为云社区<[云驻共创]基于迁移学习的语义分割算法分享>,原文作者:启明. 此篇文章是分享两篇基于迁移学 ...

  10. 基于迁移学习的反欺诈方法研究

    迁移学习(Transfer learning),顾名思义,就是把已知学到的知识应用于理解未知事物上,这很符合我们的认知过程.举个最简单的例子,假设我们给朋友介绍一种新产品,就叫"奇里古刹币& ...

最新文章

  1. 与aspect长得像的单词_长相差不多的单词,你能一眼识别吗?
  2. 如果政府强制开发linux应用,Linux开发环境及应用-中国大学mooc-题库零氪
  3. 做系统ghost步骤图解_Ghost 博客搭建超全指南
  4. java项目经验怎么写_模具工简历项目经验怎么写
  5. 作业1---四则运算
  6. HTML可以替代CSS的所有功能,CSS-用Divs替换HTML表
  7. JEECG Online Coding 开发操作图解
  8. 剖析SpringSession的redis原理
  9. 1047: 对数表 Java
  10. Mybatis源码分析(一) | 如何调试Mybatis源码
  11. 智能手机串号IMEI码丢失(无效IMEI)解决恢复办法
  12. Axure 下载教程
  13. 概率论排列公式和组合公式实质 压强 : 压力=ps=压强*面积; 万有引力公式:
  14. ERDAS IMAGINE 2013裁剪影像方法
  15. 基于人工神经网络的识别Matlab,基于人工神经网络的汽车牌照识别MATLAB实现
  16. windows server 2003的一些设置
  17. 信号与系统——典型的连续时间信号讲解
  18. onSubmit与onClick的区别
  19. CAN接受和发送失败的原因有哪些---之前调试MCP2515驱动时,数据一直发不出去,三个发送邮箱都被占满.至今未解决,读寄存器-总线错误
  20. Python GUI 开发工具

热门文章

  1. Qml文件的两种加载方式
  2. SpringBoot集成Redis分布式锁以及Redis缓存
  3. python_类装饰器
  4. Linux命令:more
  5. Yii框架官方指南系列53——专题:使用命令行生成代码(已废弃)
  6. 利用MVC思想和php语言写网站的心得
  7. 20145302张薇《Java程序设计》第三周学习总结
  8. 关于co-NP的理解
  9. C语言字符型数据scanf,scanf()函数如何输入字符型数据?
  10. java远程方法调用(rmi)--好_java 远程方法调用(RMI)