深度学习笔记--使用keras创建CNN模型

深度学习笔记–使用keras创建CNN模型

keras是基于tensorflow开发的high-level 的API,官方网址地址: https://www.tensorflow.org/guide/keras
keras中文网站:https://keras-cn.readthedocs.io/en/latest/
相比于tensorflow,使用起来代码量更小,提供很多实用的功能。本文给出使用keras&tensorflow创建CNN模型的代码对比。

创建CNN模型

mnist相当于机器学习中的”hello world”,本文使用mnist数据集下载地址:http://yann.lecun.com/exdb/mnist/ 下载四个.gz的文件后,直接放在与代码同一个路径下,无需解压。

keras版本:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./", one_hot=True)
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras import optimizers
from keras.optimizers import SGD


if __name__ == "__main__":
     print (mnist.train.images.shape,mnist.train.labels.shape)
     sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
     x_train,y_train = mnist.train.images,mnist.train.labels
     x_test,y_test= mnist.test.images,mnist.test.labels
     x_train = x_train.astype('float32')
     x_test = x_test.astype('float32')
     x_train = x_train.reshape(x_train.shape[0],28,28,1)
     x_test = x_test.reshape(x_test.shape[0],28,28,1)
     print (x_train.shape)
     print (y_train.shape)
     #build the model
     model = Sequential()
     model.add(Conv2D(32,(3,3),activation = 'relu',input_shape = (28,28,1),padding='same'))
     model.add(MaxPooling2D(pool_size = (2,2)))
     model.add(Conv2D(64,(3,3),activation = 'relu',padding='same'))
     model.add(MaxPooling2D(pool_size = (2,2)))
     model.add(Flatten())
     model.add(Dense(128,activation = 'relu'))
     model.add(Dense(10,activation = 'softmax'))
     print (model.summary())
     model.compile(loss=keras.losses.categorical_crossentropy,optimizer=sgd,metrics=['accuracy'])
     model.fit(x_train,y_train,batch_size = 100,epochs = 5)
     score = model.evaluate(x_test,y_test)
     print ("loss: "+str(score[0])
     print ("accuracy: "+str(score[1]))

这段代码是参考了其他几篇文章的代码改的,在实际操作中又根据自己的喜好改了一下参数,爬了一下坑,有以下几点发现:
(1)没事不要轻易做标准化,对于mnist数据集合,有些操作是对于每个像素点的值除以255,实验证明这样做对于模型拟合的效果产生较大影响,一个epoch完成后,accuracy只有10%,对于10个数字的识别,这个准确率完全等于随机猜。去掉这个操作后,一轮训练可达到90%。
(2)Conv2D这个函数的每个参数的含义,如果不明白要记得去查看一下,不然容易对CNN的结构不清楚。Conv2D(64,(3,3)……)中的64的含义是这一层输出的矩阵的某一纬度的值,也是(None, 14, 14, 64)中的64,下图可以看出网络的结构。
(3)对于keras的书写规范,网上的写法五花八门,写法上和函数参数的输入也各有不同,我主要参考的文档地址:
https://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/
(4)本来打算写一个tensorflow的demo,后来看了一下tensorflow的官网推荐的都是基于keras的实现,故放弃之。

最后给一下代码运行结果:
深度学习笔记--使用keras创建CNN模型_第1张图片

你可能感兴趣的:(深度学习笔记--使用keras创建CNN模型)