美文网首页
基于mnist的Hello World 体验

基于mnist的Hello World 体验

作者: golgotha | 来源:发表于2017-11-01 22:12 被阅读24次

    有两个隐层的神经网络,使用minist手写训练集。代码如下:

    from keras.models import Sequential
    from keras.layers.core import Dense, Dropout,Activation
    from keras.layers.convolutional import Convolution2D
    from keras.layers.convolutional import MaxPooling2D
    from keras.layers import Flatten
    from keras.optimizers import SGD
    from keras.datasets import mnist
    from keras import backend as K
    import keras
    import numpy as np
    import struct
    
    def train():
        model = Sequential()
        model.add(Dense(input_dim=28*28, output_dim=500))
        model.add(Activation("sigmoid"))
        model.add(Dense(output_dim=500))
        model.add(Activation("sigmoid"))
        model.add(Dense(output_dim=10))
        model.add(Activation("sigmoid"))
    
        model.compile(loss='categorical_crossentropy',
                      optimizer='adam',
                      metrics=['accuracy'])
    
        (X_train, y_train), (X_test, y_test) = mnist.load_data()  # 使用Keras自带的mnist工具读取数据(第一次需要联网)
    
        X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[
            2])  # 由于mist的输入数据维度是(num, 28, 28),这里需要把后面的维度直接拼起来变成784维
        X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])
        Y_train = (np.arange(10) == y_train[:, None]).astype(int)  # 参考上一篇文章,这里需要把index转换成一个one hot的矩阵
        Y_test = (np.arange(10) == y_test[:, None]).astype(int)
    
        # 开始训练,这里参数比较多。batch_size就是batch_size,nb_epoch就是最多迭代的次数, shuffle就是是否把数据随机打乱之后再进行训练
        # verbose是屏显模式,官方这么说的:verbose: 0 for no logging to stdout, 1 for progress bar logging, 2 for one log line per epoch.
        # 就是说0是不屏显,1是显示一个进度条,2是每个epoch都显示一行数据
        # show_accuracy就是显示每次迭代后的正确率
        # validation_split就是拿出百分之多少用来做交叉验证
        model.fit(X_train, Y_train, batch_size=200, nb_epoch=2, shuffle=True, verbose=1,validation_split=0.3)
        print('test set')
        model.evaluate(X_test, Y_test, batch_size=200)
    
    def trainCNN():
        modelCNN = Sequential()
        modelCNN.add(Convolution2D(24, 3, 3, input_shape=(28,28,1)))#这里使用24个filter,每个大小为3x3。输入图片大小28x28
        modelCNN.add(MaxPooling2D((2,2)))#pooling为2x2,即每4个网格取一个最大值 pooling之前是24(filter)x26x26,pooling后是24(filter)x13x13
        modelCNN.add(Convolution2D(48, 3, 3))#再用24x3x3filter卷积一次,大小为48(filter)x11x11
        modelCNN.add(MaxPooling2D((2, 2)))  # pooling为2x2,完成后成为48(filter)x5x5
        modelCNN.add(Flatten())
        modelCNN.add(Dense(output_dim=100))
        modelCNN.add(Activation('relu'))
        modelCNN.add(Dense(output_dim=10))
        modelCNN.add(Activation('softmax'))
    
        modelCNN.compile(loss='categorical_crossentropy',
                      optimizer='adam',
                      metrics=['accuracy'])
    
        # input image dimensions
        img_rows, img_cols = 28, 28
        batch_size = 200
        num_classes = 10
    
        # the data, shuffled and 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)
    
        modelCNN.fit(x_train, y_train,
                  batch_size=batch_size,
                  epochs=2,
                  verbose=1,
                  validation_data=(x_test, y_test))
        score = modelCNN.evaluate(x_test, y_test, verbose=0)
        print('Test loss:', score[0])
        print('Test accuracy:', score[1])
    if __name__ == "__main__":
        trainCNN();
    

    全连接和cnn都跑了两轮,结果如下:
    全连接网络: loss: 0.2520 - acc: 0.9265 - val_loss: 0.2469 - val_acc: 0.9292
    cnn: loss: 0.0769 - acc: 0.9770 - val_loss: 0.0605 - val_acc: 0.9785
    可以看到cnn的精度,明显高于全连接网络。不过cnn相对全连接还是深了一些,训练速度慢了不少。

    相关文章

      网友评论

          本文标题:基于mnist的Hello World 体验

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