基于keras建立简单的CNN

来源:互联网 发布:java web小型购物网站 编辑:程序博客网 时间:2024/06/04 18:37
开发环境:
Win10 Anaconda3 Python3.6
处理器:AMD A8-7100 Radeon R5,8 Compute Cores 4C+4G

数据集:
mnist

准备工作:
安装theano 
pip install theano


(此处注意最好安装>0.8版本的,不然后面可能出bug)
安装keras
pip install keras


安装data
pip install data



了解backend
个人对backend理解就是这个网络的底层架构是基于什么搭建的。初次安装keras,默认的backend是tensorflow,但是目前看来theano比TensorFlow更灵活,适应的环境更多,更主要的是我是用的是theano。。。。
首先可以在工作区输入
import keras


你会得到一个反馈
using tensorflow backend(第一次安装使用时)
比较简单的修改方法:
在.keras.里面有个keras.json的文件,打开,把有tensorflow的那一行里面的tensorflow改成theano,然后全部复制,删除掉这里面的代码,在粘贴(貌似不这么做就没用,虽然只改了一个tensorflow)
这个时候在python里面再试着输入
import keras


就会反馈
using theano backend




开始搭建CNN:
(正片开始)
这次我们尝试搭建一个含有两个卷积层两个下采样层(池化层)两个全连接层的CNN
因为keras本身具有很多函数,所以在搭建的时候会省事很多

from keras.datasets import mnist



调用的数据(没有没关系,第一次运行的时候 会自动下载,所以也要保证有网。。。)

from keras.models import Sequential



用于模型初始化

from keras.layers import Convolution2D,Activation,MaxPooling2D,Flatten,Dense


隐含层所需要用得函数,其中Convolution2D是卷积层;Activation是激活函数;MaxPooling2D作为池化层;Flatten是起到将多维输入一维化的函数;Dense是全连接层

from keras.optimizers import Adam



优化方法Adam,还有很多其他的方法,详情见http://blog.csdn.net/niuwei22007/article/details/49131393

from keras.utils import np_utils


用于创建标签

初始化一个模型
model = Sequential()


主要的说一下卷积层,池化层
因为本身具有的函数,所以直接调用
model.add(Convolution2D(nb_filter = 32, #第一层先设置32个滤波器nb_row = 5,nb_col = 5,#设置滤波器大小为5*5padding = ‘same’#选择滤波器的扫描方式,即是否考虑边缘input_shape = (1,28,28)#初次设置卷积层需要设置输入的形状))




卷积层设置完毕
然后选择激活函数
在卷积神经网络中常用relu函数进行激活,所以,
model.add(Activation(‘relu’))


它长这样



然后下采样(池化)

model.add(MaxPooling2D(pool_size = (2,2)#设置为2*2的池化块strides = (2,2)#向右向下的步长padding = ‘same’))


这样就完成了一个卷积层和一个池化层的设置
因为第一次设置完毕后,接下来的层就可以省略的写了,也就是

model.add(Convolution2D(64,(5,5),padding = 'same'))model.add(Activation('relu'))model.add(MaxPooling2D(strides = (2,2),padding = 'same'))



接下来运用Flatten函数(因为输入的信息是一个多维的形式,所以 我们需要把它扁平化)

model.add(Flatten())model.add(Dense(1024))#加入全连接层,其中1024是节点数目model.add(Activation(‘relu’))



再搭建一层

model.add(Dense(10))#输出10个类model.add(Activation(‘softmax’))#用于分类的softmax函数



这样就完成了最核心的部分了,其他的就不一一码上了


实验结果:

我用SGD方法也尝试了下
但是效果不如这个好


实验总结:
因为有Keras的加持,编程变得简单了很多,基本就是模块搭建一样的,而且运算速度惊人的很快。第一次使用keras,也不是很了解,翻了一大堆blog,看了好多视频,才搭建出来
在这个试验中可以通过调试batch_size,epochs,以及学习率等参数来使得model变得更好

如果将数据先进行PCA处理可能会更准确,但是不知道是否存在这个模块,或者存在也不知道如何使用,就暂时没做。。







参考:
http://deeplearning.net/tutorial/lenet.html
http://blog.csdn.net/u012816943/article/details/50498251(上一篇的翻译版)
https://morvanzhou.github.io/tutorials/machine-learning/keras/
http://www.cnblogs.com/nsnow/p/4562363.html
http://blog.csdn.net/niuwei22007/article/details/49131393
http://blog.csdn.net/ycheng_sjtu/article/details/49804041
http://blog.csdn.net/u014180259/article/details/53580672





代码页:

# -*- coding: utf-8 -*-"""Created on Mon Jun 12 09:45:46 2017@author: genji"""import numpy as npnp.random.seed(1337)from keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers import Convolution2D,Activation,MaxPooling2D,Flatten,Densefrom keras.optimizers import Adamfrom keras.utils import np_utils#load data(X_train,Y_train),(X_test,Y_test) = mnist.load_data()#X.shape(60000,28,28),Y.shape(10000)#data pre_processingX_train = X_train.reshape(-1,1,28,28)X_test = X_test.reshape(-1,1,28,28)Y_train = np_utils.to_categorical(Y_train,num_classes = 10)Y_test = np_utils.to_categorical(Y_test,num_classes = 10)model = Sequential()model.add(Convolution2D(nb_filter = 32,#第一层卷积层中滤波器的个数#nb_row = 5, #滤波器的长度为5# nb_col = 5, #滤波器的宽度为5#border_mode = 'same', #padding mode 为same#input_shape = (1,28,28),))model.add(Activation('relu'))#激活函数为relumodel.add(MaxPooling2D(pool_size = (2,2),#下采样格为2*2strides = (2,2),padding = 'same', #padding mode is 'same'))model.add(Convolution2D(64,(5,5),padding = 'same'))model.add(Activation('relu'))model.add(MaxPooling2D(strides = (2,2),padding = 'same'))model.add(Flatten())#将多维的输入一维化model.add(Dense(1024))#全连接层 1024个点model.add(Activation('relu'))model.add(Dense(10))model.add(Activation('softmax'))#softmax 用于分类adam = Adam()#学习速率lr=0.0001model.compile(optimizer = adam,loss = 'categorical_crossentropy',metrics = ['accuracy'])print('Training ========== (。・`ω´・) ========')model.fit(X_train,Y_train,epochs = 1, batch_size = 64)#全部训练次数1次,每次训练批次大小64print('Testing ========== (。・`ω´・) ========')loss,accuracy = model.evaluate(X_test,Y_test)print('\nTest loss:',loss)print('\nTest accuracy',accuracy)





原创粉丝点击