首页 > 代码库 > [Keras] mnist with cnn
[Keras] mnist with cnn
典型的卷积神经网络。
- Keras傻瓜式读取数据:自动下载,自动解压,自动加载。
- # X_train:
array([[[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], ..., [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.]]], ..., [[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], ..., [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0., 0., ..., 0., 0., 0.]]]], dtype=float32)
- # y_train:
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
但需要二值化作为output:np_utils.to_categorical(y_train, nb_classes)
- # Y_train:
Y_train[0]Out[56]: array([ 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.])Y_train[1]Out[57]: array([ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.])Y_train[2]Out[58]: array([ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])
Code:
#coding:utf-8import osfrom PIL import Imageimport numpy as np#读取文件夹mnist下的42000张图片,图片为灰度图,所以为1通道,#如果是将彩色图作为输入,则将1替换为3,并且data[i,:,:,:] = arr改为data[i,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]def load_data(): data = np.empty((42000,1,28,28),dtype="float32") label = np.empty((42000,),dtype="uint8") imgs = os.listdir("./mnist") num = len(imgs) for i in range(num): img = Image.open("./mnist/"+imgs[i]) arr = np.asarray(img,dtype="float32") data[i,:,:,:] = arr label[i] = int(imgs[i].split(‘.‘)[0]) return data,label
Code: a Multilayer Perceptron
import numpy as npnp.random.seed(1337) # for reproducibility import osfrom keras.datasets import mnist #自动下载
# import 套路from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activationfrom keras.optimizers import RMSpropfrom keras.utils import np_utils batch_size = 128 #Number of images used in each optimization stepnb_classes = 10 #One class per digitnb_epoch = 12 #Number of times the whole data is used to learn
(X_train, y_train), (X_test, y_test) = mnist.load_data() #Flatten the data, MLP doesn‘t use the 2D structure of the data. 784 = 28*28X_train = X_train.reshape(60000, 784)X_test = X_test.reshape(10000, 784) #Make the value floats in [0;1] instead of int in [0;255] --> [归一化]X_train = X_train.astype(‘float32‘)X_test = X_test.astype(‘float32‘)X_train /= 255X_test /= 255 #Display the shapes to check if everything‘s okprint(X_train.shape[0], ‘train samples‘)print(X_test.shape[0], ‘test samples‘) # convert class vectors to binary class matrices (ie one-hot vectors)
Y_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes) #Define the model achitecturemodel = Sequential()
########################################################################################model.add(Dense(512, input_shape=(784,)))model.add(Activation(‘relu‘))model.add(Dropout(0.2))model.add(Dense(512))model.add(Activation(‘relu‘))model.add(Dropout(0.2))model.add(Dense(10)) #Last layer with one output per classmodel.add(Activation(‘softmax‘)) #We want a score simlar to a probability for each class########################################################################################
#Use rmsprop to do the gradient descent see http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf#and http://cs231n.github.io/neural-networks-3/#adarms = RMSprop()#The function to optimize is the cross entropy between the true label and the output (softmax) of the modelmodel.compile(loss=‘categorical_crossentropy‘, optimizer=rms, metrics=["accuracy"])
#Make the model learn --> [Training]model.fit(X_train, Y_train,batch_size=batch_size, nb_epoch=nb_epoch,verbose=2,validation_data=(X_test, Y_test)) #Evaluate how the model does on the test setscore = model.evaluate(X_test, Y_test, verbose=0) print(‘Test score:‘, score[0])print(‘Test accuracy:‘, score[1])
Code: a Convolutional Neural Network
import numpy as npnp.random.seed(1337) # for reproducibility import osfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.utils import np_utils batch_size = 128nb_classes = 10nb_epoch = 12 # input image dimensionsimg_rows, img_cols = 28, 28# number of convolutional filters to usenb_filters = 32# size of pooling area for max poolingnb_pool = 2# convolution kernel sizenb_conv = 3 # the data, shuffled and split between train and test sets(X_train, y_train), (X_test, y_test) = mnist.load_data() #Add the depth in the input. Only grayscale so depth is only one#see http://cs231n.github.io/convolutional-networks/#overviewX_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols) #Make the value floats in [0;1] instead of int in [0;255]X_train = X_train.astype(‘float32‘)X_test = X_test.astype(‘float32‘)X_train /= 255X_test /= 255 #Display the shapes to check if everything‘s okprint(‘X_train shape:‘, X_train.shape)print(X_train.shape[0], ‘train samples‘)print(X_test.shape[0], ‘test samples‘) # convert class vectors to binary class matrices (ie one-hot vectors)Y_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)
##############################################################################################model = Sequential()#For an explanation on conv layers see http://cs231n.github.io/convolutional-networks/#conv#By default the stride/subsample is 1#border_mode "valid" means no zero-padding.#If you want zero-padding add a ZeroPadding layer or, if stride is 1 use border_mode="same"model.add(Convolution2D(nb_filters, nb_conv, nb_conv, border_mode=‘valid‘, input_shape=(1, img_rows, img_cols)))
model.add(Activation(‘relu‘))
model.add(Convolution2D(nb_filters, nb_conv, nb_conv))model.add(Activation(‘relu‘))
#For an explanation on pooling layers see http://cs231n.github.io/convolutional-networks/#poolmodel.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))
#Flatten the 3D output to 1D tensor for a fully connected layer to accept the inputmodel.add(Flatten())model.add(Dense(128))model.add(Activation(‘relu‘))
model.add(Dropout(0.5))model.add(Dense(nb_classes)) #Last layer with one output per classmodel.add(Activation(‘softmax‘)) #We want a score simlar to a probability for each class###############################################################################################
#The function to optimize is the cross entropy between the true label and the output (softmax) of the model#We will use adadelta to do the gradient descent see http://cs231n.github.io/neural-networks-3/#adamodel.compile(loss=‘categorical_crossentropy‘, optimizer=‘adadelta‘, metrics=["accuracy"]) #Make the model learnmodel.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,verbose=1, validation_data=http://www.mamicode.com/(X_test, Y_test)) #Evaluate how the model does on the test setscore = model.evaluate(X_test, Y_test, verbose=0) print(‘Test score:‘, score[0])print(‘Test accuracy:‘, score[1])
另一个卷积示例:
#coding:utf-8 ‘‘‘ GPU run command: THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python cnn.py CPU run command: python cnn.py‘‘‘#导入各种用到的模块组件from __future__ import absolute_importfrom __future__ import print_functionfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.advanced_activations import PReLUfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.optimizers import SGD, Adadelta, Adagradfrom keras.utils import np_utils, generic_utilsfrom six.moves import rangefrom data import load_dataimport randomimport numpy as np np.random.seed(1024) # for reproducibility #加载数据data, label = load_data()
#打乱数据index = [i for i in range(len(data))]random.shuffle(index)data = data[index]label = label[index]print(data.shape[0], ‘ samples‘) #label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数label = np_utils.to_categorical(label, 10) ################开始建立CNN模型############### #生成一个modelmodel = Sequential()#【第一个卷积层】,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。#border_mode可以是valid或者full,参见这里:http://blog.csdn.net/niuwei22007/article/details/49366745#激活函数用tanh#你还可以在model.add(Activation(‘tanh‘))后加上dropout的技巧: model.add(Dropout(0.5))model.add(Convolution2D(4, 5, 5, border_mode=‘valid‘,input_shape=(1,28,28))) model.add(Activation(‘tanh‘))#【第二个卷积层】,8个卷积核,每个卷积核大小3*3。4表示输入的特征图个数,等于上一层的卷积核个数#激活函数用tanh#采用maxpooling,poolsize为(2,2)model.add(Convolution2D(8, 3, 3, border_mode=‘valid‘))model.add(Activation(‘tanh‘))
model.add(MaxPooling2D(pool_size=(2, 2))) #【第三个卷积层】,16个卷积核,每个卷积核大小3*3#激活函数用tanh#采用maxpooling,poolsize为(2,2)model.add(Convolution2D(16, 3, 3, border_mode=‘valid‘)) model.add(Activation(‘relu‘))
model.add(MaxPooling2D(pool_size=(2, 2)))
#【全连接层】,先将前一层输出的二维特征图flatten为一维的。#Dense就是隐藏层。16就是上一层输出的特征图个数。4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4#全连接有128个神经元节点,初始化方式为normalmodel.add(Flatten())model.add(Dense(128, init=‘normal‘))model.add(Activation(‘tanh‘))#【Softmax分类】,输出是10类别model.add(Dense(10, init=‘normal‘))model.add(Activation(‘softmax‘)) ##############开始训练模型###############使用SGD + momentum#model.compile里的参数loss就是损失函数(目标函数)sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss=‘categorical_crossentropy‘, optimizer=sgd,metrics=["accuracy"]) #调用fit方法,就是一个训练过程. 训练的epoch数设为10,batch_size为100.#数据经过随机打乱shuffle=True。verbose=1,训练过程中输出的信息,0、1、2三种方式都可以,无关紧要。show_accuracy=True,训练时每一个epoch都输出accuracy。#validation_split=0.2,将20%的数据作为验证集。model.fit(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)
[Keras] mnist with cnn
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。