卷积神经网络用于图像分类,最早可以追溯到Lenet-5,它最早被应用于手写数字的识别,并且取得了不错的分类效果。

因为通常数据集是要求我们自己收集,而且有些数据并不是特别容易收集的,会遇到采集仪器价格昂贵、样本可收集性不高等问题。

这就说明了一个潜在的问题,数据集要多大才能用于分类网络中。

下面,送给大家三句话:

训练集中每个类应有1000张图像;

所用图像应当是具有代表性的高质量图像;

如果图像数量不够,可采用数据增强方法。

对于小样本数据如何处理

1、迁移学习

因为你正在使用是已经查看过大量图像并且学会区分类的网络,所以通常可以教给模型同一领域的新类,只需要几十个数据样本即可。

2、数据增强

博主分享几个自己常用的数据增强代码。

"伽马变换"
img = cv2.imread(file_pathname+'/'+filename, 1)
# 图像归一化
fi = img / 255.0
# 伽马变换
gamma = 0.8  #自己设定
out = np.power(fi, gamma)
out = out * 255
"平移"
def affine(img, a, b, c, d, tx, ty):  #平移H,  W,   = img.shapetem = img.copy()img = np.zeros((H + 2, W + 2, ), dtype=np.float32)img[1:H + 1, 1:W + 1] = temH_new = np.round(H * d).astype(np.int)W_new = np.round(W * a).astype(np.int)out = np.zeros((H_new + 1, W_new + 1, ), dtype=np.float32)x_new = np.tile(np.arange(W_new), (H_new, 1))y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)adbc = a * d - b * cx = np.round((d * x_new - b * y_new) / adbc).astype(np.int) - tx + 1y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1# 避免目标图像对应的原图像中的坐标溢出x = np.minimum(np.maximum(x, 0), W + 1).astype(np.int)y = np.minimum(np.maximum(y, 0), H + 1).astype(np.int)# assgin pixcel to new imageout[y_new, x_new] = img[y, x]out = out[:H_new, :W_new]out = out.astype(np.uint8)return out
"旋转"
def remote(img, degree):height, width = img.shape[:2]radians = float(degree / 180 * pi)heightNew = int(width * fabs(sin((radians))) + height * fabs(cos((radians))))widthNew = int(height * fabs(sin((radians))) + width * fabs(cos((radians))))# 得到二维矩阵的旋转的仿射矩阵matRotation = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)# 中心位置的实际平移matRotation[0, 2] += (widthNew - width) / 2matRotation[1, 2] += (heightNew - height) / 2imgRotation = cv2.warpAffine(img, matRotation,(widthNew, heightNew), borderValue=(0,0,0))return imgRotation

3、基于Keras的Data Augmentation方法

代码如下:

from keras.preprocessing.image import ImageDataGenerator
"""
parameters:rotation_range:整数,数据提升时图片随机转动的角度width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值channel_shift_range: Float. Range for random channel shifts.horizontal_flip:布尔值,进行随机水平翻转vertical_flip:布尔值,进行随机竖直翻转"""datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest',cval=0,channel_shift_range=0,horizontal_flip=False,vertical_flip=False,rescale=None)

数据增强告一段落,接下来就正式进入卷积神经网络的学习。

AlexNet

alexnet实现手写数字的识别

"直接用代码的形式来表达网络结构"
model = Sequential()
model.add(Conv2D(96, (11, 11), strides=(1, 1), input_shape=(28, 28, 1), padding='same',activation='relu',kernel_initializer='uniform'))
# 池化层
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第二层加边使用256个5x5的卷积核,加边,激活函数为relu
model.add(Conv2D(256, (5, 5), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
#使用池化层,步长为2
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第三层卷积,大小为3x3的卷积核使用384个
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
# 第四层卷积,同第三层
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same',activation='relu', kernel_initializer='uniform'))
# 第五层卷积使用的卷积核为256个,其他同上
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.summary()

VGG

一个5x5的卷积核用两个串联的3x3卷积核来代替

VGG11、13、16、19,SimpleVGG

"VGG13"
model = Sequential()
model.add(Conv2D(64, (3, 3), strides=(1, 1), input_shape=(32, 32, 3), padding='same', activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 2), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

GoogLeNet

虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

Resnet

ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好。

Densenet

密集连接:缓解梯度消失问题,加强特征传播,鼓励特征复用,极大的减少了参数量。

总结:上诉神经网络都经常用于图像分类中,并辅之迁移学习。

卷积神经网络:用于图像分类相关推荐

  1. 图像处理神经网络python_深度学习使用Python进行卷积神经网络的图像分类教程

    深度学习使用Python进行卷积神经网络的图像分类教程 好的,这次我将使用python编写如何使用卷积神经网络(CNN)进行图像分类.我希望你事先已经阅读并理解了卷积神经网络(CNN)的基本概念,这里 ...

  2. 卷积神经网络和图像分类识别

    Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日 原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅修改,已获作者本人授权. ...

  3. 【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]

    [神经网络与深度学习]CIFAR-10数据集介绍,并使用卷积神经网络训练模型--[附完整代码] 一.CIFAR-10数据集介绍 1.1 CIFAR-10数据集的内容 1.2 CIFAR-10数据集的结 ...

  4. pytorch1.7教程实验——迁移学习训练卷积神经网络进行图像分类

    只是贴上跑通的代码以供参考学习 参考网址:迁移学习训练卷积神经网络进行图像分类 需要用到的数据集下载网址: https://download.pytorch.org/tutorial/hymenopt ...

  5. 轻松学Pytorch-使用卷积神经网络实现图像分类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|人工智能与算法学习 大家好,本篇教程的贡献者来自社区投稿作 ...

  6. MTCNN-将多任务级联卷积神经网络用于人脸检测和对齐

    论文链接:  https://kpzhang93.github.io/MTCNN_face_detection_alignment/,本文是根据自己的理解翻译的如有错误,还请见谅,评论提出,立马修 ...

  7. Bag of Tricks for Image Classification with Convolutional Neural Networks(卷积神经网络在图像分类中的技巧)

    来源:Tong He Zhi Zhang Hang Zhang Zhongyue Zhang Junyuan Xie Mu L Amazon Web Services fhtong,zhiz,hzaw ...

  8. 经典卷积神经网络(CNN)图像分类算法详解

    本文原创,转载请引用 https://blog.csdn.net/dan_teng/article/details/87192430 CNN图像分类网络 一点废话:CNN网络主要特点是使用卷积层,这其 ...

  9. 在PyTorch中使用卷积神经网络建立图像分类模型

    概述 在PyTorch中构建自己的卷积神经网络(CNN)的实践教程 我们将研究一个图像分类问题--CNN的一个经典和广泛使用的应用 我们将以实用的格式介绍深度学习概念 介绍 我被神经网络的力量和能力所 ...

  10. 将图卷积神经网络用于解码分子生成

    ©PaperWeekly 原创 · 作者|张玮玮 学校|东北大学硕士 研究方向|脑电情绪识别 论文标题: A Two-Step Graph Convolutional Decoder for Mole ...

最新文章

  1. python写电商网站框架,python-django框架-电商项目-商品模块开发_20191124
  2. oracle重做日志文件版本不一致问题处理
  3. html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别
  4. 祝贺本刊编委石勇教授入选2016年汤森路透全球高被引科学家
  5. apache开源项目_众筹开源笔记本电脑,新的Apache项目等
  6. java用正则表达式 编写简单词法分析器_500+ 精选 Java 面试题大放送
  7. 力压微信成 App Store 榜第一,子弹短信能否避免火一把就“死”?| 畅言
  8. 查看IIS进程所对应的应用程序池名称
  9. 苹果计算机系统是什么,苹果电脑系统和Win电脑系统有什么不同
  10. java单线程任务调度_一文详解Spring任务执行和调度(小结)
  11. UVC系列2-探索Android UVC协议
  12. 如何学习渗透测试:初学者教程
  13. 程序员修炼之道(一)
  14. cpp读取分数并进行求和化简
  15. C/C++ 如何判断闰年,对判断闰年条件的疑惑解答
  16. Rouge | 自动文摘及机器翻译评价指标
  17. [转]嵌入式Web服务器
  18. 转载:“只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔|你的隐私已不是隐私
  19. js中settimeout的终止
  20. (Java)算法基础6:图/贪心算法(带模板上考场,模板一定滚瓜烂熟解决考场订制)

热门文章

  1. 【web前端特效源码】使用HTML5+CSS3制作一个会动的文字闪动动画效果~~适合初学者~超简单~ |前端开发|IT软件
  2. 变频器的技术应用:接线与参数设置
  3. 超详细 excel 基础知识
  4. 原生js实现动态生成表格
  5. 怎样卸载干净Oracle
  6. 郝斌C语言 流程控制
  7. IE浏览器打不开网页有什么解决的方法
  8. 第三天---网络系统硬件
  9. 企业网络管理和华为企业级路由交换产品介绍
  10. 万能的应用商店_WiFi万能助手