keras示例 mnist_cnn

作者: 还有下文 | 来源:发表于2019-04-26 19:17 被阅读4次

    0 初始化操作

    均一化 0-255 ==> 0-1

    1 网络设计

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),
                     activation='relu',
                     input_shape=input_shape))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    
    • Sequential
      序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
    • Conv2D
    keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
    

    二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape参数。例如input_shape = (128,128,3)代表128*128的彩色RGB图像(data_format='channels_last')
    filters:卷积核的数目(即输出的维度)
    kernel_size:单个整数或由两个整数构成的list/tuple,卷积核的宽度和长度。如为单个整数,则表示在各个空间维度的相同长度。
    activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)

    • MaxPooling2D
    keras.layers.pooling.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
    

    为空域信号施加最大值池化
    pool_size:整数或长为2的整数tuple,代表在两个方向(竖直,水平)上的下采样因子,如取(2,2)将使图片在两个维度上均变为原长的一半。为整数意为各个维度值相同且为该数字。 池化窗口的大小

    • Dropout
    keras.layers.core.Dropout(rate, noise_shape=None, seed=None)
    

    Dropout将在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,Dropout层用于防止过拟合。

    • Flatten
    keras.layers.core.Flatten()
    

    Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

    • Dense
    keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
    

    units:大于0的整数,代表该层的输出维度。
    activation:激活函数
    use_bias: 布尔值,是否使用偏置项
    kernel_initializer:权值初始化方法

    2 网络优化

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy'])
    
    • loss
      损失函数,即模型的优化目标,也叫目标函数
      常用的有:
      mse: 均方误差
      mae: 绝对值误差
      binary_crossentropy:逻辑回归,交叉熵函数
      categorical_crossentropy:多类的对数损失,需要将标签转化为二值序列
    • MSE和交叉熵对比及应用场景:
      分类问题 一般用 crossentropy 作为损失函数,因为信息量和概率挂钩;KL散度(相对熵)是描述误差很好的指标;而回归问题一般用 MSE。
      损失函数的选取取决于输入标签数据的类型,如果输入的是实数、无界的值,损失函数使用平方差;如果输入标签是位矢量(分类标签),使用交叉熵会更合适。
    • optimizer 优化器
      编译keras模型必要的两个参数之一,可以自定义,也可以使用默认值。
      如自定义 sgd 优化器
    from keras import optimizers
    sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)
    keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
    

    其中参数说明:
    lr:大或等于0的浮点数,学习率
    momentum:大或等于0的浮点数,动量参数
    decay:大或等于0的浮点数,每次更新后的学习率衰减值
    nesterov:布尔值,确定是否使用Nesterov动量
    其他优化器还有:RMSprop、Adagrad、Adam、Adamax、Nadam、TFOptimizer
    以上优化器对比参考:
    https://blog.csdn.net/chenhaifeng2016/article/details/73382273

    • metrics 性能评估
      性能评估函数类似与目标函数, 只不过该性能的评估结果讲不会用于训练.


      image.png

    3 完整代码及结果

    '''Trains a simple convnet on the MNIST dataset.
    Gets to 99.25% test accuracy after 12 epochs
    (there is still a lot of margin for parameter tuning).
    16 seconds per epoch on a GRID K520 GPU.
    '''
    
    from __future__ import print_function
    import keras
    from keras.datasets import mnist
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Flatten
    from keras.layers import Conv2D, MaxPooling2D
    from keras import backend as K
    
    batch_size = 128
    num_classes = 10
    epochs = 12
    
    # input image dimensions
    img_rows, img_cols = 28, 28
    
    # the data, split between train and test sets
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    if K.image_data_format() == 'channels_first':
        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)
    else:
        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)
    
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    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')
    
    # convert class vectors to binary class matrices
    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)
    
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),
                     activation='relu',
                     input_shape=input_shape))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    
    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy'])
    
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(x_test, y_test))
    score = model.evaluate(x_test, y_test, verbose=0)
    print('Test loss:', score[0])
    print('Test accuracy:', score[1])
    
    image.png

    4 来源

    https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
    https://keras-cn.readthedocs.io/en/latest/other/optimizers/#optimizers

    相关文章

      网友评论

        本文标题:keras示例 mnist_cnn

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