本博客得代码来自一位b站分享技术得up,我觉得视频特别关注初学者,讲的非常细。希望分享给大家,视频传送门玩转Keras卷积神经网络Mnist数据集 ,代码传送门cnn代码
这篇博文分享一下使用Keras实现的cnn神经网络的代码
代码文件结构如下,CNN_Conv2d_train.py是用来训练这个模型的,CNN_Conv2d_predict.py是用于将我们自己的图片输入进去,用于预测的,Predict_image文件夹是用来放置我们用来预测的图片的。
我们先来介绍一下CNN_Conv2d_train.py文件中的代码
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Convolution2D, Activation, MaxPool2D, Flatten, Dense
from keras.optimizers import Adam
第一部分是导入各个包,numpy是用于科学计算的包,第二行用于导入minst数据集,第四行用于导入model,第五行用于导入层,这里涉及到二维卷积层,激活层,最大池化层,flatten层(用于将卷积得到的矩阵变成一个很大的一维向量),dense层全连接层,最后一行用于导入一个优化函数“adam”
nb_class = 10
nb_epoch = 4
batchsize = 1024
第二部分是定义一些参数,nb_class这个参数用于定义最终被分的类别的个数(本例是10类),nb_epoch这个参数是整个数据集被训练多少次(本例是四次),batchsize这个参数用于定义一次进入网络有多少张图片(本例是一次进入网络1024张图片)
# Prepare your data mnist, MAC /.Keras/datasets linux home .keras/datasets
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
第三部分是导入这个数据集,就是将mnist数据集导入内存中
# setup data shape
X_train = X_train.reshape(-1, 28, 28, 1) # TFchannel last theano (1,28,28)
X_test = X_test.reshape(-1, 28, 28, 1)
Y_train = X_train.astype('float32')
Y_test = Y_test.astype('float32')
第四部分用来建立数据的形状,第一行定义训练集图片的形状,每一个图片都是(28,28,1)形状,第一个参数-1的作用是“未知多少张图片”就是无论多少张图片都将其定义成(28,28,1)形式
第二行将训练集的图片也定义成(28,28,1)形式
第三行用于把训练集的标签转化为float32类型,同理,第四行用于将测试集的标签转化为float32类型
X_train = X_train/255.0
X_test = X_test/255.0
这一部分用于将训练集和测试集的图片矩阵值浮点化,并且归一化,除以255.0就是同时进行浮点化和归一化,这样这个矩阵的值就变成了零到一之间的一个小数。
# One-hot [0,0,0,0,0,1,0,0,0] =5
Y_train = np_utils.to_categorical(Y_train, nb_class)
Y_test = np_utils.to_categorical(Y_test, nb_class)
这部分用于将训练集和测试集的标签变为one-hot类型的
# setup model
model = Sequential()
# 1st Conv2D layer
model.add(Convolution2D(
filters=32,
kernel_size=[5, 5],
padding='same',
input_shape=(28, 28, 1)
))
model.add(Activation('relu'))
model.add(MaxPool2D(
pool_size=(2, 2),
strides=(2, 2),
padding="same",
))
# 2nd Conv2D layer
model.add(Convolution2D(
filters=64,
kernel_size=(5, 5),
padding='same',
))
model.add(Activation('relu'))
model.add(MaxPool2D(
pool_size=(2, 2),
strides=(2, 2),
padding="same",
))
#1st Fully connected Dense
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
#2nd Fully connected Dense
model.add(Dense(10))
model.add(Activation('softmax'))
这部分用于定义这个模型,首先对这个添加一个Convolution2D层(二维卷积层),其中有三十二个卷积核,卷积核的大小是(5,5),加入一个padding层,因为是第一层所以定义一个input_shape(之后就不用了);之后连接一个激活层,激活层使用的激活函数是relu,之后连接一个maxpooling层,其中pool_size的意思是2*2的区间行驶池化,strides的意思是每两个池化之间差两个,同时也在池化层中加入一个padding;之后再添加一个卷积层,但是卷积核的个数变为了64,添加激活层和池化层。
之后用Flatten层,把卷积得到的矩阵变为一个很长的向量,
之后加入全连接层Dense层,第一个Dense层的输出结果是一个1024维的向量,激活函数使用relu;第二个Dense层的输出是一个十维的向量,激活函数使用softmax(最后使用分类所以使用softmax)
这样整个模型就被定义完成了
#Define Optimizer and setup Parameter
adam = Adam(lr=0.0001)
#compile model
model.compile(
optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy'],
)
这一部分用来定义优化器和模型的参数,优化器使用adam,损失函数使用的是categorical_crossentropy loss(交叉熵损失函数)
#Run/Fireup network
model.fit(x=X_train,
y=Y_train,
epochs=nb_epoch,
batch_size=batchsize,
verbose= 1,
validation_data=(X_test,Y_test),
)
这一部分用于跑完整个model,其中先定义了测试集的数据,测试集的标签,定义整个训练集要被训练多少次,定义一次放多少数据到神经网络。verbos这个变量的作用是定义要不要添加测试集,最后定义了测试集的数据都有什么
至此,模型训练部分就结束了。
下面,开始我们模型预测部分:
import numpy as np
from keras.models import load_model
import matplotlib.pyplot as plt
import matplotlib.image as processimage
第一部分还是导包,
#load trained model
model = load_model('model_name.h5')
这一部分用于存储这个模型。
class MainPredictImg(object):
def __init__(self):
pass
def pred(self,filename):
#np array
pred_img = processimage.imread(filename) #read image
pred_img = np.array(pred_img) #tranfer to array np
pred_img = pred_img.reshape(-1,28,28,1) #reshape into network needed shape
prediction = model.predict(pred_img) #predict
Final_prediction = [result.argmax() for result in prediction][0] #[1,2,3,1,3,2,2,]
a = 0
for i in prediction[0]:
print a
print 'Percent:{:.30%}'.format(i)
a = a+1
return Final_prediction
这一部分定义一个类MainPredictImg用于做预测只用。先是一个构造器,之后定义pred方法用于预测。方法中首先是读取图片,之后是将图片转化为numpy数组,之后是将这个导入的图片转化为(28,28,1)的图片,之后对这个图片进行预测,之后对预测结果取周瑜打的,,最后把每一个预测值输出。