keras入门简单教程

 在本次博客中,我将讲述如何利用keras搭建一个卷积神经网络用于自己图像数据分类。

为什么使用keras,对于深度学习初学者来说,keras很简单,模块化的方法使得搭建卷积神经网络变得简单。

本篇博客不会涉及具体的深度学习和卷积神经网络的基础知识,具体理论知识会在稍后的博客中涉及。

导入必要的库和模块

$ import numpy as np
$ import os 
$ import cv2
$ import glob

从keras中导入Sequential模块,它是一个神经网络的线性栈,适合本教程搭建CNN。

$ from keras.models import Sequential

从keras.layers导入定义好layers

$ from keras.layers import Dense, Dropout, Flatten
$ from keras.layers.convolutional import Convolution2D, Maxpooling2D, ZeroPading2D

从keras.optimizers导入不同的优化算法

$ from keras.optimizer import SGD, Adam

导入自带的图像预处理模块(扩增:如果你的数据量很少的话)以及可视化训练过程的tensorboard

$ from keras.preprocessing.image import ImageDataGenerate
$ from keras.callbacks import Tensorboard, ModelCheckpoint

准备数据

数据的话,只需要建立2个文件夹,分别用于training data 和 validation data,每个文件夹下面建立n个子文件夹,n代表图像分类的类数,每个子文件下面存放相同类的图像数据。

$ train_dir = './data/train/'
$ val_dir = './data/val/'

输入卷积神经网络的图像大小必须一致,我们也可以利用keras自带的数据预处理方法使其裁剪为统一大小。  

构建CNN,这里我们构建VGG-16

$ model = Sequential()
$ model.add(ZeroPadding2D((1, 1), input_shape=(224, 224, 3)))
$ model.add(Convolution2D(64, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(64, 3, 3, activation='relu'))
$ model.add(MaxPooling2D((2, 2), strides=(2, 2)))

$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(128, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(128, 3, 3, activation='relu'))
$ model.add(MaxPooling2D((2, 2), strides=(2, 2)))

$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(256, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(256, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(256, 3, 3, activation='relu'))
$ model.add(MaxPooling2D((2, 2), strides=(2, 2)))

$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(MaxPooling2D((2, 2), strides=(2, 2)))

$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(ZeroPadding2D((1, 1)))
$ model.add(Convolution2D(512, 3, 3, activation='relu'))
$ model.add(MaxPooling2D((2, 2), strides=(2, 2)))

$ model.add(Flatten())
$ model.add(Dense(4096, activation='relu'))
$ model.add(Dropout(0.5))
$ model.add(Dense(1024, activation='relu'))
$ model.add(Dropout(0.5))
$ model.add(Dense(n, activation='softmax'))

上面的程序是搭建的VGG-16的模型,其实就像我们小时候玩的积木一样一样滴,就是一层一层的搭建。so easy …….

下面要设置model的一些参数,比如,loss函数,优化器,迭代次数了等。

$ sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) #带动量的随机梯度下降
$ model.compile(optimizer=sgd,loss='categorical_crossentropy',metric=['accuracy']) # loss 函数 categorical_crossentropy:亦称作多类的对数损失

$ train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=4,fill_mode='constant',cval=0,horizontal_flip=True,vertical_flip=True)#train data 扩增8倍
$ val_datagen = ImageDataGenerator(rescale=1./255)

$ train_generator = train_datagen.flow_from_directory(train_dir, color_mode='rgb',target_size=(224,224),batch_size=1)
$ val_generator = test_datagen.flow_from_directory(val_dir, color_mode='rgb',target_size=(224,224),batch_size=1)

图像大小为224大小的RGB格式,扩增了8倍,并且归一化到(0-1)

编译model

$ tb = TensorBoard(log_dir='./logs/log/', write_images=True, histogram_freq=0)
$ checkpointer = ModelCheckpoint(filepath='./model/model.hdf5',save_best_only=True,verbose=1)

$ model.fit_generator(train_generator,steps_per_epoch=2000, epochs=80, workers=8, verbose=1,validation_data=val_generator, validation_steps=360,callbacks=[tb,checkpointer])

添加callback,可以实时的监测loss 和 accuracy.

在终端输入

tensorboard --logdir=./logs/log/ 回车打开出现的链接即可,最好用chrome浏览器。

测试model

# score = model.predict(test_generator,steps=x)

steps=x代表测试集的图像数量,返回值为label以及对应的probaility.

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦