• (五) Keras Adam优化器以及CNN应用于手写识别


    视频学习来源

    https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553

    笔记



    Adam,常用优化器之一

    大多数情况下,adma速度较快,达到较优值迭代周期较少,

    一般比SGD效果好

    CNN应用于手写识别


    import numpy as np
    from keras.datasets import mnist  #将会从网络下载mnist数据集
    from keras.utils import np_utils
    from keras.models import Sequential  #序列模型
    #Convolution2D 是2维卷积
    #MaxPooling2D 是2维最大池化
    #Flatten 数据扁平化(降维)
    from keras.layers import Dense,Dropout,Convolution2D,MaxPooling2D,Flatten  #在这里导入dropout
    from keras.optimizers import Adam


    C:Program Files (x86)Microsoft Visual StudioSharedAnaconda3_64libsite-packagesh5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.

    from ._conv import register_converters as _register_converters

    Using TensorFlow backend.


    #载入数据
    (x_train,y_train),(x_test,y_test)=mnist.load_data()
    #查看格式
    #(60000,28,28)
    print('x_shape:',x_train.shape)
    #(60000)
    print('y_shape:',y_train.shape)
    
    #转化为4维
    #最后一个维度图片深度,1表示黑白,3表示彩色
    #rgb是红绿蓝三通道0-255表示各个通道的颜色深度
    #(60000,28,28)->(60000,28,28,1)
    #-1表示自动设置
    #除以255是做数据归一化处理
    x_train=x_train.reshape(-1,28,28,1)/255.0 #转换数据格式
    x_test=x_test.reshape(-1,28,28,1)/255.0 #转换数据格式
    #label标签转换成 one  hot 形式
    y_train=np_utils.to_categorical(y_train,num_classes=10) #分成10类
    y_test=np_utils.to_categorical(y_test,num_classes=10) #分成10类
    
    #定义序列模型
    model=Sequential()
    
    #第一个卷积层
    #input_shape 输入平面
    #filters 卷积核/滤波器个数
    #kernel_size 卷积窗口大小
    #strides 步长
    #padding padding方式 same/valid
    #activation 激活函数
    model.add(Convolution2D(
        input_shape=(28,28,1),#只需要在第一次添加输入平面
        filters=32,
        kernel_size=5,
        strides=1,
        padding='same',
        activation='relu'
    ))
    
    #平面大小28x28,用same padding得到的和上一次一样,也是28x28,有32个特征图
    #池化后变成14x14,32个特征图
    
    #第一个池化层
    model.add(MaxPooling2D(
        pool_size=2,  # 池化窗口大小 2x2的窗口
        strides=2,
        padding='same'
    ))
    
    #第二个卷积层
    #filters=64 kernel_seize=5  
    model.add(Convolution2D(64,5,strides=1,padding='same',activation='relu'))
    
    #第二个卷积层后64个特征图,14x14
    #第二个池化层后64个特征图,7x7
    
    #第二个池化层
    model.add(MaxPooling2D(2,2,'same'))
    
    #把第二个池化层的输出扁平化为1维
    #长度 64x7x7 
    model.add(Flatten())
    
    #第一个全连接层
    #1024个神经元
    model.add(Dense(1024,activation='relu'))
    
    #Dropout
    #训练时百分之40个神经元不工作
    model.add(Dropout(0.4))
    
    #第二个全连接层
    model.add(Dense(10,activation='softmax'))
    
    #定义优化器
    #学习速率为10的负4次方
    adam=Adam(lr=1e-4)
    
    
    #定义优化器,损失函数,训练效果中计算准确率
    model.compile(
        optimizer=adam, #sgd优化器
        loss='categorical_crossentropy',  #损失用交叉熵,速度会更快
        metrics=['accuracy'],  #计算准确率
    )
    
    #训练
    #六万张,每次训练64张,训练10个周期(六万张全部训练完算一个周期)
    model.fit(x_train,y_train,batch_size=64,epochs=10)
    
    #评估模型
    loss,accuracy=model.evaluate(x_test,y_test)
    
    print('
    test loss',loss)
    print('
    test accuracy',accuracy)
    
    loss,accuracy=model.evaluate(x_train,y_train)
    
    print('
    train loss',loss)
    print('
    train accuracy',accuracy)



    x_shape: (60000, 28, 28)
    y_shape: (60000,)
    Epoch 1/10
    60000/60000 [==============================] - 251s 4ms/step - loss: 0.3163 - acc: 0.9127
    Epoch 2/10
    60000/60000 [==============================] - 263s 4ms/step - loss: 0.0861 - acc: 0.9745
    Epoch 3/10
    60000/60000 [==============================] - 275s 5ms/step - loss: 0.0606 - acc: 0.9812
    Epoch 4/10
    60000/60000 [==============================] - 266s 4ms/step - loss: 0.0469 - acc: 0.9858
    Epoch 5/10
    60000/60000 [==============================] - 264s 4ms/step - loss: 0.0392 - acc: 0.9878
    Epoch 6/10
    60000/60000 [==============================] - 267s 4ms/step - loss: 0.0333 - acc: 0.9894
    Epoch 7/10
    60000/60000 [==============================] - 272s 5ms/step - loss: 0.0284 - acc: 0.9915
    Epoch 8/10
    60000/60000 [==============================] - 267s 4ms/step - loss: 0.0255 - acc: 0.9921
    Epoch 9/10
    60000/60000 [==============================] - 268s 4ms/step - loss: 0.0209 - acc: 0.9934
    Epoch 10/10
    60000/60000 [==============================] - 256s 4ms/step - loss: 0.0185 - acc: 0.9944
    10000/10000 [==============================] - 14s 1ms/step
     
    test loss 0.020771756899070168
     
    test accuracy 0.9934
    60000/60000 [==============================] - 78s 1ms/step
     
    train loss 0.009774932912984514
     
    train accuracy 0.9973666666666666
  • 相关阅读:
    css换行
    <a>标签里的<img>标签点击虚线框
    iframe子页面调用父页面元素
    快捷键
    用css绘制三角形
    解决div被embed,object覆盖问题
    一些兼容问题
    兼容padding
    记一次用html2canvas将页面内容生成海报并保存图片到本地
    PUPPETEER安装遇到 ERROR:CHROMIUM REVISION IS NOT DOWNLOADED.的解决办法
  • 原文地址:https://www.cnblogs.com/XUEYEYU/p/keras-learning-5.html
Copyright © 2020-2023  润新知