文章目录

  • 一、简介
  • 二、流程
    • 1.数据处理
    • 2.神经网络搭建
    • 3.训练
    • 4.预测
  • 三、参考

一、简介

本文旨在通过一些简单的案例,学习如何通过keras搭建CNN。从数据读取,数据处理,神经网络搭建,模型训练等。本文也是参考其他博主的文章基础上做了些小修改学习的,感谢其他博主的分享。
具体的CNN的原理,以及keras的原理,这里就不啰嗦了。最后会提供一些参考博客,供大家学习。代码的github地址:traffic

二、流程

总体的文件夹结构:

1.数据处理

#!/usr/bin/env python
# encoding: utf-8
from keras.preprocessing.image import img_to_array#图片转为array
from keras.utils import to_categorical#相当于one-hot
from imutils import paths
import cv2
import numpy as np
import random
import osdef load_data(path,norm_size,class_num):data = []#数据xlabel = []#标签yimage_paths = sorted(list(paths.list_images(path)))#imutils模块中paths可以读取所有文件路径random.seed(0)#保证每次数据顺序一致random.shuffle(image_paths)#将所有的文件路径打乱for each_path in image_paths:image = cv2.imread(each_path)#读取文件image = cv2.resize(image,(norm_size,norm_size))#统一图片尺寸image = img_to_array(image)data.append(image)maker = int(each_path.split(os.path.sep)[-2])#sep切分文件目录,标签类别为文件夹名称的变化,从0-61.如train文件下00014,label=14label.append(maker)data = np.array(data,dtype="float")/255.0#归一化label = np.array(label)label = to_categorical(label,num_classes=class_num)#one-hotreturn data,label

上面是数据目录,下面是对应的数据处理代码。主要分为几个部分:

  1. 利用imutils模块的paths将train或test中的所有图片文件的路径找出来image_paths。
  2. 对其中每张图片,做如下操作,利用cv2读取图片和修改图片尺寸(图片尺寸不一,要统一尺寸)。
  3. 依次将图片和对应的标签,保存到对应的列表中
  4. 图片进行归一化操作,标签进行one-hot

2.神经网络搭建

这里搭建的网络是经典的LeNet网络,从input>conv>pool>conv>pool>Dense>Dense(softmax)。具体LeNet的学习,请见参考。这里是利用keras搭建的LeNet,keras的顺序模型(另外一种为函数式API)。

#!/usr/bin/env python
# encoding: utf-8
import keras
from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten
from keras.models import Sequential
import keras.backend as Kclass Lenet:#经典网络,不懂去查def neural(channel,height,width,classes):input_shape = (channel,height,width)if K.image_data_format() == "channels_last":#确认输入维度,就是channel是在开头,还是结尾input_shape = (height,width,channel)model = Sequential()#顺序模型(keras中包括顺序模型和函数式API两种方式)model.add(Conv2D(20,(5,5),padding="same",activation="relu",input_shape=input_shape,name="conv1"))model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="pool1"))model.add(Conv2D(50,(5,5),padding="same",activation="relu",name="conv2",))model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),name="pool2"))model.add(Flatten())model.add(Dense(500,activation="relu",name="fc1"))model.add(Dense(classes,activation="softmax",name="fc2"))return model

具体参数,其中卷积层卷积核一般不超过5,步长一般为1。池化层一般大小和步长都为2。

3.训练

#!/usr/bin/env python
# encoding: utf-8
import matplotlib.pylab as plt
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import sys
sys.path.append("../process")#添加其他文件夹
import data_input#导入其他模块
from traffic_network import Lenetdef train(aug, model,train_x,train_y,test_x,test_y):model.compile(loss="categorical_crossentropy",optimizer="Adam",metrics=["accuracy"])#配置#model.fit(train_x,train_y,batch_size,epochs,validation_data=(test_x,test_y))_history = model.fit_generator(aug.flow(train_x,train_y,batch_size=batch_size),validation_data=(test_x,test_y),steps_per_epoch=len(train_x)//batch_size,epochs=epochs,verbose=1)#拟合,具体fit_generator请查阅其他文档,steps_per_epoch是每次迭代,需要迭代多少个batch_size,validation_data为test数据,直接做验证,不参与训练model.save("../predict/traffic_model.h5")#保存模型plt.style.use("ggplot")#matplotlib的美化样式plt.figure()N = epochsplt.plot(np.arange(0,N),_history.history["loss"],label ="train_loss")#model的history有四个属性,loss,val_loss,acc,val_accplt.plot(np.arange(0,N),_history.history["val_loss"],label="val_loss")plt.plot(np.arange(0,N),_history.history["acc"],label="train_acc")plt.plot(np.arange(0,N),_history.history["val_acc"],label="val_acc")plt.title("loss and accuracy")plt.xlabel("epoch")plt.ylabel("loss/acc")plt.legend(loc="best")plt.savefig("../result/result.png")plt.show()if __name__ =="__main__":channel = 3height = 32width = 32class_num = 62norm_size = 32#参数batch_size = 32epochs = 40model = Lenet.neural(channel=channel, height=height,width=width, classes=class_num)#网络train_x, train_y = data_input.load_data("../data/train", norm_size, class_num)test_x, test_y = data_input.load_data("../data/test", norm_size, class_num)#生成数据aug = ImageDataGenerator(rotation_range=30,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode="nearest")#数据增强,生成迭代器train(aug,model,train_x,train_y,test_x,test_y)#训练

这部分就是网络的训练了,主要注意keras中model输出的事history,有四个属性可以查看。另外就是ImageDataGenerator数据增强,具体请查阅其他问下。

准确率在94%,跟原博客预测准确率一样。

4.预测

对test测试集数据,进行单张图片分类预测。代码如下:(其中.h5文件,请到我的GitHub下载predict文件夹

#!/usr/bin/env python
# encoding: utf-8
import keras
from keras.preprocessing.image import img_to_array
import imutils.paths as paths
import cv2
import os
import numpy as np
import matplotlib.pylab as plt#import sys
#sys.path.append("../process")
#import data_inputchannel = 3
height = 32
width = 32
class_num = 62
norm_size = 32  # 参数
batch_size = 32
epochs = 40test_path = "../data/test"
image_paths = sorted(list(paths.list_images(test_path)))#提取所有图片地址
model = keras.models.load_model("traffic_model.h5")#加载模型
for each in image_paths:image = cv2.imread(each)image = cv2.resize(image,(norm_size,norm_size))image = img_to_array(image)/255.0image = np.expand_dims(image,axis=0)result = model.predict(image)#分类预测proba = np.max(result)#提取最大概率predict_label = np.argmax(result)#提取最大概率下标label = int(each.split(os.path.sep)[-2])#提取标签plt.imshow(image[0])#显示图片plt.title("label:{},predict_label:{}, proba:{:.2f}".format(label,predict_label,proba))plt.show()
#test_x,test_y = data_input.load_data("../data/train",norm_size,class_num)
#model = keras.models.load_model("traffic_model.h5")
#result = model.predict( ,batch_size=1,verbose=0)
#print(result)
#print(result.shape)

三、参考

代码的github地址:traffic
原博客文章:
【Keras】从两个实际任务掌握图像分类
先附上一些讲解比较好的CNN文章:
零基础入门深度学习(4) - 卷积神经网络
keras中文文档这里面内容非常好,关于sequence,utils,fit_generator,ImageDataGenerator等等内容都有,推荐浏览。
从神经网络到卷积神经网络(CNN)
在Kaggle猫狗大战冲到Top2%
imutils.path.list_image

利用keras搭建CNN完成图片分类相关推荐

  1. 基于Keras搭建CNN、TextCNN文本分类模型

    基于Keras搭建CNN.TextCNN文本分类模型 一.CNN 1.1 数据读取分词 1.2.数据编码 1.3 数据序列标准化 1.4 构建模型 1.5 模型验证 二.TextCNN文本分类 2.1 ...

  2. 利用TensorFlow搭建CNN,DNN网络实现图像手写识别,总结。

    利用TensorFlow搭建CNN,DNN网络实现图像手写识别,总结. 摘要 一.神经网络与卷积网络的对比 1.数据处理 2.对获取到的数据进行归一化和独热编码 二.开始我们的tensorflow神经 ...

  3. 神经网络densecnn_对比学习用 Keras 搭建 CNN RNN 等常用神经网络

    参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习. Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个 ...

  4. (转!)利用Keras实现图像分类与颜色分类

    2018-07-19 全部谷歌渣翻加略微修改 大家将就的看哈 建议大佬们还是看看原文 点击收获原文 其中用到的示例文件 multi-output-classification 大家可以点击 下载 . ...

  5. 基于卷积神经网络CNN的图片分类实现——附代码

    目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4. ...

  6. CNN自定义图片分类(Pytorch)

    CNN图片分类(Pytorch)_zju_cbw的博客-CSDN博客这篇文章主要讲述用 pytorch 完成简单 CNN 图片分类任务,如果想对 CNN 的理论知识进行了解,可以看我的这篇文章,深度学 ...

  7. 利用keras搭建神经网络拟合非线性函数

    神经网络有着一个非常奇妙的结构,它的数学原理虽然相对简单,但是能做的事情却不少,数学家已经证明,具有2层(输入层除外)和非线性激活函数的神经网络,只要在这些层中有足够多的神经元,就可以近似任何函数(严 ...

  8. 基于Keras的生成对抗网络(1)——利用Keras搭建简单GAN生成手写体数字

    目录 0.前言 一.GAN结构 二.函数代码 2.1 生成器Generator 2.2 判别器Discriminator 2.3 train函数 三.结果演示 四.完整代码 五.常见问题汇总 0.前言 ...

  9. 利用TensorFlow搭建CNN

    通过相关资料,学习使用TensorFlow搭建CNN的流程.整的提出分为以下几个步骤:设置网络参数-设置输入占位符变量-设置网络结构-优化损失函数-设置训练参数-训练网络-输出准确度等 #!/usr/ ...

最新文章

  1. PHP替换字符串函数strtr()和str_replace()
  2. 开源!mathAI 手写拍照自动能解高数题,还不快试试?
  3. PyTorch基础(13)-- torch.nn.Unfold()方法
  4. Android逆向与病毒分析
  5. python - IO模型
  6. Spring 核心容器类BeanFactory
  7. PHP高级——抽象类与接口的区别
  8. 2016年光伏电站交易和融资的十大猜想
  9. 实体词典 情感词典_tidytextpy包 | 对三体进行情感分析
  10. ETL(数据仓库技术)
  11. 如何在不重新加载页面的情况下修改URL?
  12. springcloud基于ribbon的canary路由方案 1
  13. DanmuManager 一个简单的弹幕工具
  14. Spring源码之BeanDefinitionRegistryPostProcessor内部执行流程
  15. 人工智能在生活中的应用都有哪些?
  16. 渗透测试工程师从业经验
  17. 深度学习和机器学习研究方向与框架介绍
  18. 计算机二级题库删去哪套,Word标题前出现黑块究竟要怎么删除
  19. SpringCloud(4)— 统一网关Gateway
  20. phython学习笔记1

热门文章

  1. 《C语言程序设计(第四版)谭浩强》学习笔记
  2. Capture One pro 21 for Mac(RAW转换和图像编辑工具)
  3. 轻量级网络:Bottleneck结构(沙漏型结构)
  4. JPA当天时间范围查询
  5. Ubuntu18 04安装QQ
  6. 爬虫爬取学校通知信息(python))
  7. dmidecode命令详解
  8. UE4-音频音高和音量控制基础技巧
  9. 隐私计算头条周刊(10.16-10.22)
  10. 宝利通group终端升级指导书