利用keras搭建CNN完成图片分类
文章目录
- 一、简介
- 二、流程
- 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
上面是数据目录,下面是对应的数据处理代码。主要分为几个部分:
- 利用imutils模块的paths将train或test中的所有图片文件的路径找出来image_paths。
- 对其中每张图片,做如下操作,利用cv2读取图片和修改图片尺寸(图片尺寸不一,要统一尺寸)。
- 依次将图片和对应的标签,保存到对应的列表中
- 图片进行归一化操作,标签进行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完成图片分类相关推荐
- 基于Keras搭建CNN、TextCNN文本分类模型
基于Keras搭建CNN.TextCNN文本分类模型 一.CNN 1.1 数据读取分词 1.2.数据编码 1.3 数据序列标准化 1.4 构建模型 1.5 模型验证 二.TextCNN文本分类 2.1 ...
- 利用TensorFlow搭建CNN,DNN网络实现图像手写识别,总结。
利用TensorFlow搭建CNN,DNN网络实现图像手写识别,总结. 摘要 一.神经网络与卷积网络的对比 1.数据处理 2.对获取到的数据进行归一化和独热编码 二.开始我们的tensorflow神经 ...
- 神经网络densecnn_对比学习用 Keras 搭建 CNN RNN 等常用神经网络
参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习. Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个 ...
- (转!)利用Keras实现图像分类与颜色分类
2018-07-19 全部谷歌渣翻加略微修改 大家将就的看哈 建议大佬们还是看看原文 点击收获原文 其中用到的示例文件 multi-output-classification 大家可以点击 下载 . ...
- 基于卷积神经网络CNN的图片分类实现——附代码
目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4. ...
- CNN自定义图片分类(Pytorch)
CNN图片分类(Pytorch)_zju_cbw的博客-CSDN博客这篇文章主要讲述用 pytorch 完成简单 CNN 图片分类任务,如果想对 CNN 的理论知识进行了解,可以看我的这篇文章,深度学 ...
- 利用keras搭建神经网络拟合非线性函数
神经网络有着一个非常奇妙的结构,它的数学原理虽然相对简单,但是能做的事情却不少,数学家已经证明,具有2层(输入层除外)和非线性激活函数的神经网络,只要在这些层中有足够多的神经元,就可以近似任何函数(严 ...
- 基于Keras的生成对抗网络(1)——利用Keras搭建简单GAN生成手写体数字
目录 0.前言 一.GAN结构 二.函数代码 2.1 生成器Generator 2.2 判别器Discriminator 2.3 train函数 三.结果演示 四.完整代码 五.常见问题汇总 0.前言 ...
- 利用TensorFlow搭建CNN
通过相关资料,学习使用TensorFlow搭建CNN的流程.整的提出分为以下几个步骤:设置网络参数-设置输入占位符变量-设置网络结构-优化损失函数-设置训练参数-训练网络-输出准确度等 #!/usr/ ...
最新文章
- PHP替换字符串函数strtr()和str_replace()
- 开源!mathAI 手写拍照自动能解高数题,还不快试试?
- PyTorch基础(13)-- torch.nn.Unfold()方法
- Android逆向与病毒分析
- python - IO模型
- Spring 核心容器类BeanFactory
- PHP高级——抽象类与接口的区别
- 2016年光伏电站交易和融资的十大猜想
- 实体词典 情感词典_tidytextpy包 | 对三体进行情感分析
- ETL(数据仓库技术)
- 如何在不重新加载页面的情况下修改URL?
- springcloud基于ribbon的canary路由方案 1
- DanmuManager 一个简单的弹幕工具
- Spring源码之BeanDefinitionRegistryPostProcessor内部执行流程
- 人工智能在生活中的应用都有哪些?
- 渗透测试工程师从业经验
- 深度学习和机器学习研究方向与框架介绍
- 计算机二级题库删去哪套,Word标题前出现黑块究竟要怎么删除
- SpringCloud(4)— 统一网关Gateway
- phython学习笔记1