美文网首页每天写1000字每天写500字
用Keras搭建卷积神经网络

用Keras搭建卷积神经网络

作者: 弃用中 | 来源:发表于2019-01-01 20:17 被阅读180次

    本文我们将学习使用Keras一步一步搭建一个卷积神经网络。具体来说,我们将使用卷积神经网络对手写数字(MNIST数据集)进行识别,并达到99%以上的正确率。

    我们还将介绍Colaboratory——一个免费的Jupyter notebook环境,关键的是可以免费使用GPU(学生党买不起呀)!

    为什么选择Keras呢?

    主要是因为简单方便。更多细节请看:https://keras.io/

    什么卷积神经网络?

    简单地说,卷积神经网络(CNNs)是一种多层神经网络,它可以有效地减少全连接神经网络参数量太大的问题。如果对其背后的原理感兴趣的话,斗胆推荐一些学习资料:

    深度学习入门:基于Python的理论与实现

    Neural Networks and Deep Learning

    CS231n: Convolutional Neural Networks for Visual Recognition

    下面就直接进入主题吧!

    1. 搭建环境

    如果想要在个人电脑上搭建的话,我们需要先安装好Python,进入:https://www.python.org/

    下载安装就好。

    之后,打开终端输入pip install -i https://pypi.douban.com/simple keras

    输入以下命令可以确认正常安装:

    python -c "import keras;print(keras.__version__)"
    

    当然,如果想直接使用Colaboratory的话,直接打开你的Google云端硬盘

    为了方便起见,新建一个名为Keras的文件夹,进入Keras文件夹,单击鼠标右键

    选择Colaboratory就可新建一个Jupyter notebok啦!

    如果没有看到Colaboratory这一项的话,就选择关联更多应用

    搜索Colaboratory,并关联即可。

    2. 导入库和模块

    我们导入Sequential模型(相当于放积木的桌子)

    from keras.models import Sequential
    

    接下来,我们导入各种层(各种形状各异积木)

    from keras.layers import Conv2D, MaxPool2D
    from keras.layers import Dense, Flatten
    

    最后,我们导入to_categorical函数,以便之后对数据进行转换

    from keras.utils import to_categorical
    

    3. 加载数据

    MNIST是一个非常有名的手写数字数据集,我们可以使用Keras轻松加载它。

    from keras.datasets import mnist
    
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    

    查看一下训练集的大小

    print(x_train.shape)
    
    # (60000, 28, 28)
    

    可以看到60000个样本,它们都是28像素x28像素的。

    看一下这些手写数字长什么样

    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.imshow(x_train[0])
    

    4. 预处理数据

    使用Keras是必须显式声明输入图像深度的尺寸。例如,具有所有3个RGB通道的全色图像的深度为3。

    我们的MNIST图像的深度为1,但我们必须明确声明。

    也就是说,我们希望将数据集从形状(n,rows,cols)转换为(n,rows,cols,channels)

    img_x, img_y = 28, 28
    
    x_train = x_train.reshape(x_train.shape[0], img_x, img_y, 1)
    x_test = x_test.reshape(x_test.shape[0], img_x, img_y, 1)
    

    除此之外,我们将数据标准化一下:

    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    

    之后,将标记值(y_train, y_test)转换为One-Hot Encode的形式,至于为什么要这么做?请查看:https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/

    y_train = to_categorical(y_train, 10)
    y_test = to_categorical(y_test, 10)
    print(y_train.shape)
    # (60000, 10)
    

    5. 定义模型结构

    我们参照下图定义一个模型结构

    代码如下:

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Flatten())
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    

    是不是有点搭积木的既视感?

    6. 编译

    现在,只需要编译模型,就可以开始训练了。当编译模型时,我们声明了损失函数和优化器(SGD,Adam等)。

    model.compile(optimizer='adam',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    

    Keras有很多损失函数优化器供你选择。

    7. 训练

    接下来,我们传入训练集进行训练

    model.fit(x_train, y_train, batch_size=128, epochs=10)
    

    以下是在Colaboratory上训练的过程

    以下是在个人电脑上训练的过程

    可以看到,花费的时间差别还是很大的!

    8. 评估模型

    最后,传入测试集对模型模型进行评估

    score = model.evaluate(x_test, y_test)
    print('acc', score[1])
    # acc 0.9926
    

    准确率达到了%99以上!

    完整代码如下:

    # 2. 导入库和模块
    from keras.models import Sequential
    from keras.layers import Conv2D, MaxPool2D
    from keras.layers import Dense, Flatten
    from keras.utils import to_categorical
    
    # 3. 加载数据
    from keras.datasets import mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    # 4. 数据预处理
    img_x, img_y = 28, 28
    x_train = x_train.reshape(x_train.shape[0], img_x, img_y, 1)
    x_test = x_test.reshape(x_test.shape[0], img_x, img_y, 1)
    
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    
    y_train = to_categorical(y_train, 10)
    y_test = to_categorical(y_test, 10)
    
    # 5. 定义模型结构
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Flatten())
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    
    # 6. 编译
    model.compile(optimizer='adam',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 7. 训练
    model.fit(x_train, y_train, batch_size=128, epochs=10)
    
    # 8. 评估模型
    score = model.evaluate(x_test, y_test)
    print('acc', score[1])
    

    参考

    [1] https://elitedatascience.com/keras-tutorial-deep-learning-in-python

    [2] http://adventuresinmachinelearning.com/keras-tutorial-cnn-11-lines/

    相关文章

      网友评论

        本文标题:用Keras搭建卷积神经网络

        本文链接:https://www.haomeiwen.com/subject/lilolqtx.html