一、简介
本文旨在通过一些简单的案例,学习如何通过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 os
def load_data(path,norm_size,class_num):
data = []#数据x
label = []#标签y
image_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=14
label.append(maker)
data = np.array(data,dtype="float")/255.0#归一化
label = np.array(label)
label = to_categorical(label,num_classes=class_num)#one-hot
return 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