利用tensorflow keras搭建一个简单的卷积神经网络

源码下载点击这里
#1 运行结果
(1)首先我们在cnn.py中建立一个卷积神经网络,建立卷积神经网络,并通过输入:

python cnn.py

运行程序,程序运行的结果如下所示:
利用tensorflow keras搭建一个简单的卷积神经网络_第1张图片
根据图示中的结果可知,在我们搭建的卷积神经网络中需要在线下载mnist手写字体的数据集合。再次运行

python cnn.py

运行过程如下所示:
利用tensorflow keras搭建一个简单的卷积神经网络_第2张图片
在运行过程中,通过12次迭代对6000张手写字体数据集合图片进行训练,如上图中所示为为第二轮训练进行中的过程.
(2)通过12轮迭代完成后,模型的训练结果如下图所示
利用tensorflow keras搭建一个简单的卷积神经网络_第3张图片
根据上述的运行结果:
最后输出的验证结果为:

(‘Test score:’, 0.033758414796000578)
(‘Test accuracy:’, 0.98960000000000004)

其中:
Test score:表示对与图像测试集合上的损失。
Test accuracy:表示在图像测试集合上的准确率。
在每一次迭代后面都会输出对应的损失值,和对应的精确度以及在验证集上的结果。
为了更直观地描述每一次迭代的效果对输出的结果通过曲线的方式描绘,描绘结果如下图所示。
#2 代码实现
为了更好的了解卷积神经网络的实现,进一步分析代码如下所示:
##2.1参数初始化
在搭建卷积神经网络模型之前,我们先通过初始化一些参数来设置模型的结构和卷积神经网络的参数。根据搭建神经网络所需要的参数,进行如下设定:
(1)K.set_image_dim_ordering(‘th’):
设置了Keras将要使用的维度顺序,也可以通过keras.backend.image_dim_ordering()来获取当前维度的顺序。对于Keras而支持两种后端引擎对张量进行计算。
(2)设置batch_size=128表示批大小,表示每一次处理图片的多少,对于batch_zie的调节有更多的了解可以通过这篇博客进行了解:

(3)设置nb_classes:
设置nb_classes = 10表示所有的图片一共分为十个类别对应的从0~9十种类型
(4)设置epochs:
epochs=80设置为模型训练时迭代的次数。
(5)设置img_rows,img_cols:
设置输入图片的行和列的值img_rows = 28 并且img_cols = 28说明对应的输入图片的特征为像素 28 ∗ 28 28*28 2828的图片
(6)设置nb_filters,pool_size,kernel_size:
设置nb_filters = 32表示每一个卷积层卷积核的个数为32个,同时pool_size和kernel_size分别设置了池化层中最大池的大小和卷积层中卷积核的大小。在这里设置池化层中最大池的大小 2 ∗ 2 2*2 22为卷积层中卷积核的大小 3 ∗ 3 3*3 33

K.set_image_dim_ordering('th')
batch_size = 128
nb_classes = 10
epochs = 80
img_rows, img_cols = 28, 28
nb_filters = 32
pool_size = (2, 2)
kernel_size = (3, 3)

##2.2数据读取和处理
(1)数据读取

(X_train, y_train), (X_test, y_test) = mnist.load_data()

通过mnist.load_data()获取手写字体数据集的测试信息。返回十个numpy.ndarray的数据类型。
其中:X_train:表示训练集合特征
y_train:表示训练集标签
X_test:表示测试集特征
y_test:表示测试标签
(2)判断当前维度的顺序,并设置调整
判断当前的为度是’th’类型还是’tf’类型。对于不同的维度顺序通过reshape改变数据的形状。
如果采用’th’形式的数据类型通过修改为如下所示类型的数据,并设置’th’的input_shape格式。

X_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)
input_shape = (1, img_rows, img_cols)
  print input_shape

否则如果采用’tf’格式的数据形式通过则对数据的设置如下所示:

X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
  X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
  input_shape = (img_rows, img_cols, 1)

(3)数据转换
为了更好的处理数据信息,将像素值为0255压缩到01。并通过np_utils.to_categorical()函数将标量型数值转换为向量具体的转换方式如下:
如果对应的某个标签的值为:5,4,3
那么转换后得到的向量值为:
0,0,0,0,1,0,0,0,0,0
0,0,0,1,0,0,0,0,0,0
0,0,1,0,0,0,0,0,0,0

X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

##2.3搭建模型结构

在Keras中主要通过序贯模型(Sequential)来搭建模型的结构。
在下述代码中,我们首先通过一个实例化一个序贯模型。

model = Sequential()

接下来通过model.add()在模型中加入不同的网络层,通过网络层的现行堆叠来构建卷积神经网络。在整CNN构建的过程中堆叠的顺序如下:
(1)在这里的CNN模型中,我们加入一个二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape参数。在卷积层中设置的参数表示的含义分别如下:
(1)nb_filters:卷积核的数量
(2)kernel_size[0],kernel_size[1]:卷积核的大小
(3)padding=“same”:表示的是对卷积化后新的特征映射大小的计算方式分为"valid"和"same"两种
(4)input_shape:表示输入图片的大小,当然在不同的维度顺序下的输入结果是不一样的。
同样的,在接下来的过程分别加入relu激活函数和第二个卷积层以及池化层。在池化层中采用最大池操作,并设置最大池的大小。
通过Dropout(0.25)暂时性随机丢弃25%的神经元细胞
model.add(Flatten())将数据压扁平后为数据的全连接做准备。
在构建完卷积神经网络之后,通过model.compile()对卷积神经网络进行编译。

model = Sequential()
model.add(Convolution2D(nb_filters, (kernel_size[0], kernel_size[1]),
                    padding='same',
                    input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, (kernel_size[0], kernel_size[1])))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
          optimizer='adadelta',
          metrics=['accuracy'])

##2.4模型训练和验证
在模型中,我们通过下叙方式进行模型的训练和验证,并通过tensorboard对验证训练和验证进行可视化。
结果如下:
利用tensorflow keras搭建一个简单的卷积神经网络_第4张图片
上图为运行的结果,为了缩短模型训练和运行的时间,我们较少了模型中训练集和测试集的手写字体数据集照片数量。
在通过sudo tensorboard --logdir=logfile启动tensorboard后在浏览器中输入127.0.0.1:6006出现如下所示的结果
acc利用tensorflow keras搭建一个简单的卷积神经网络_第5张图片 loss利用tensorflow keras搭建一个简单的卷积神经网络_第6张图片
上图是随着迭代次数的增加,在训练集上精确度和损失的变化曲线。下图则分别表示随着迭代次数增加在验证集上的精确度和损失。
acc利用tensorflow keras搭建一个简单的卷积神经网络_第7张图片loss利用tensorflow keras搭建一个简单的卷积神经网络_第8张图片

tb_cb = keras.callbacks.TensorBoard(log_dir='/home/ccu/data', write_images=1, histogram_freq=1)
model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs,
      verbose=1, callbacks=[tb_cb], validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, verbose=0)

你可能感兴趣的:(机器学习,python,卷积神经网络,手写字体,tensorflow)