使用Keras构建神经网络图像识别模型

一、Keras的结构与安装

       1. Keras简介

           Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。

           Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:

           1)简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性);

           2)支持CNN和RNN,或二者的结合;

           3)无缝CPU和GPU切换。

       2. Keras的模块结构

           

 

       3.  使用Keras搭建神经网络的过程

          

 

       4. Anaconda3环境下Keras的安装教程

             1)方法一

                   a)右键选择anaconda3用管理员权限打开,进入anaconda3的主界面,如图所示;

 

                    b)点击左边的environment,在右边的搜索栏内输入keras,点击跟前的选择Not installed,如图所示;

                    c)搜索到keras之后,右边会有点击安装的选择项,直接点击安装即可,安装时间可能有点长,请耐心等待。

              2)方法二

                    a)在anaconda3下的script文件下进入cmd命令内,输入命令pip install keras,如图所示;

                    b)回车,运行成功后的结果如图所示。

 

 

               3)检验Keras安装是否成功

                     a)快速打开Anaconda3自带的Spyder编辑器,如图所示;

                     b)输入import keras,运行后查看,如图所示表示安装成功;

 

 

                     c)注意:可能会出现“ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow`”错误,说明安装的keras版本过高,降低版本,在anaconda3下的script文件下进入cmd命令内,输入命令pip install keras==2.2即可。

 

 

 

 

 二、典型示例--手写识别模型

       1. 目标

                   1)示例背景

                          给定多张 0 - 9 手写数字图像(集合),从中通过学习产生神经网络识别模型。使用该模型,能够对输入的一幅手写数字图像,识别出 0 - 9 的数字。

                   2)选取数据集

                         本模型将选取MNIST数据集进行训练测试。MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张 28*28 像素的灰度手写数字图片。

                         a)读入MNIST数据

                               测试下载MNIST数据代码如下(可能会很慢,建议用镜像下载):

from tensorflow.keras.datasets import mnist
# 导入mnist数据集,需要保持网络畅通
# 训练数据:x_train是60000张28*28的数据,所以尺寸是60000*28*28,y_train是对应的数字,尺寸是60000*1;测试数据x_test和y_test同理
(x_train,y_train),(x_test,y_test)=mnist.load_data()
print('x_shape:',x_train.shape)        # (60000,28,28)

 

                              测试成功输出结果如下图:

 

                          b)展示MNIST部分数据

                                代码如下:

from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt

(x_train,y_train),(x_test,y_test)=mnist.load_data()

plt.subplot(3,3,1)
plt.imshow(x_train[0])
plt.subplot(3,3,2)
plt.imshow(x_train[1])
plt.subplot(3,3,3)
plt.imshow(x_train[2])
plt.subplot(3,3,4)
plt.imshow(x_train[3])
plt.subplot(3,3,5)
plt.imshow(x_train[4])
plt.subplot(3,3,6)
plt.imshow(x_train[5])
plt.subplot(3,3,7)
plt.imshow(x_train[6])
plt.subplot(3,3,8)
plt.imshow(x_train[7])
plt.subplot(3,3,9)
plt.imshow(x_train[8])
plt.show()

                                结果如下图: 

 

 

 

       2. Keras构建手写识别模型

                  1)处理输入输出数据;

                        a)处理输入数据:由于每幅图像的每个像素作为一个神经网络的输入,所以一共有 28*28 = 784 个输入,需要对输入数据进行变换,即(60000,28,28)→ (60000,784),接着将像素值转换到 0 - 1 之间,以便加入到Keras神经网络模型中。代码如下:

# (60000,28,28) -> (60000,784)
x_train=x_train.reshape(x_train.shape[0],x_train.shape[1]*x_train.shape[2])
x_test=x_test.reshape(x_test.shape[0],x_test.shape[1]*x_test.shape[2])
# 将像素值转换到0-1之间,便于应用神经网络
x_train=x_train/255
x_test=x_test/255

 

                        b)处理输出数据:需要将输出转换为one-hot的模式。one-hot编码又称为一位有效编码,是将分类变量作为二进制向量的表示,一般用于多分类识别。对于one-hot编码,举一个小例子,如下图:

 

 

 

                              输出数据转换代码及其对应效果图如下:

import tensorflow.keras.utils as ut
print("y_train:\n",y_train)
print("y_test:\n",y_test)
print("\nAfter the one-hot code conversion")
y_train=ut.to_categorical(y_train)
y_test=ut.to_categorical(y_test)
print("y_train:\n",y_train)
print("y_test:\n",y_test)

 

 

                      2)构建深度神经网络模型

                            如下图模拟需要构建的神经网络:

 

 

 

                            a)创建序贯模型,添加全连接层,以形成深度网络结构;

                                  代码如下:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Activation
model = models.Sequential()

# 向模型中添加层
model.add(layers.Conv2D(32, kernel_size=(5, 5),  # 添加卷积层,深度32,过滤器大小5*5
                        activation='relu',  # 使用relu激活函数
                        input_shape=(img_rows, img_cols, 1)))   # 输入的尺寸就是一张图片的尺寸(28,28,1)
model.add(layers.MaxPooling2D(pool_size=(2, 2)))    # 添加池化层,过滤器大小是2*2
model.add(layers.Conv2D(64, (5, 5), activation='relu'))  # 添加卷积层,简单写法
model.add(layers.MaxPooling2D(pool_size=(2, 2)))    # 添加池化层
model.add(layers.Flatten())     # 将池化层的输出拉直,然后作为全连接层的输入
model.add(layers.Dense(500, activation='relu'))     # 添加有500个结点的全连接层,激活函数用relu
model.add(layers.Dense(10, activation='softmax'))   # 输出最终结果,有10个,激活函数用softmax

 

                            b)生成模型(编译)和训练;

                                  代码如下:

# 自动完成模型的训练过程
model.fit(X_train, Y_train,   # 训练集
        batch_size=128,   # batchsize
        epochs=5,    # 训练轮数
        validation_data=(X_test, Y_test))   # 验证集

 

                            c)对训练结果进行评估。

                                 代码如下:

# 定义损失函数、优化函数、评测方法
model.compile(loss=keras.losses.categorical_crossentropy,
        optimizer=keras.optimizers.SGD(),
        metrics=['accuracy'])

# 打印运行结果,即损失和准确度
score = model.evaluate(X_test, Y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

                             d)运行效果图

 

 

 

                      3)将构建好的网络模型应用于手写识别实战分类,并对分类结果进行预测

                            代码如下:

x_predict=X_test[0:9]
y=model.predict(x_predict)
print(y)

                           结果如下:

 

posted @ 2021-07-24 21:38  哦呦aholic  阅读(823)  评论(0编辑  收藏  举报