CNN.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # coding=utf8
  2. import numpy as np
  3. from keras.datasets import mnist
  4. from keras.utils import np_utils
  5. from keras.models import Sequential
  6. from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
  7. from keras.optimizers import Adam
  8. from keras import models
  9. np.random.seed(1337) # for reproducibility
  10. # 加载数据集,下载的数据保存在'~/.keras/datasets/'
  11. (X_train, y_train), (X_test, y_test) = mnist.load_data()
  12. # print("X_train.shape", X_train.shape, "y_train.shape", y_train.shape)
  13. # print("X_train", X_train[0], "y_train", y_train[0])
  14. # 处理数据(对数据进行归一化)
  15. X_train = X_train.reshape(-1, 28, 28, 1) / 255. # 为了让激励函数更加有效
  16. X_test = X_test.reshape(-1, 28, 28, 1) / 255. #
  17. y_train = np_utils.to_categorical(y_train, num_classes=10)
  18. y_test = np_utils.to_categorical(y_test, num_classes=10)
  19. # print("y_train.shape", y_train.shape, "y_train", y_train[0])
  20. # 建立一个model
  21. model = Sequential()
  22. # 添加第一层卷积层
  23. model.add(Convolution2D(
  24. batch_input_shape=(None, 28, 28, 1), # 输入源的shape
  25. filters=32, # 过滤器的数量(卷积核)
  26. kernel_size=5, # 过滤器的大小
  27. strides=1, # 过滤器移动的步长
  28. padding='same', # Padding的方法
  29. ))
  30. print(model.output)
  31. # 给model添加一个激励函数
  32. model.add(Activation('relu'))
  33. # 添加一个(max pooling) output shape (32, 14, 14)
  34. model.add(MaxPooling2D(
  35. pool_size=2, # 池化层的大小
  36. strides=2, # 池化移动的步长
  37. padding='same', # Padding的方法
  38. ))
  39. print(model.output)
  40. # 添加第二层卷积层 output shape (64, 14, 14)
  41. model.add(Convolution2D(
  42. filters=64,
  43. kernel_size=5,
  44. strides=1,
  45. padding='same'
  46. ))
  47. print(model.output)
  48. # 给model添加一个激励函数
  49. model.add(Activation('relu'))
  50. # # 添加一个(max pooling) output shape (64, 7, 7)
  51. model.add(MaxPooling2D(
  52. pool_size=2,
  53. strides=2,
  54. padding='same',
  55. ))
  56. print(model.output)
  57. # 设置第一个全连接层
  58. model.add(Flatten()) # Flatten层用来将输入“压平”
  59. print(model.output)
  60. model.add(Dense(1024)) # 全连接层
  61. model.add(Activation('relu')) # 给model添加一个激励函数
  62. # 设置第二个全连接层
  63. model.add(Dense(10))
  64. model.add(Activation('softmax'))
  65. # 定义一个优化器,设置一个学习效率
  66. adam = Adam(lr=1e-4)
  67. # 编译模型指定优化器,损失函数及评价指标
  68. model.compile(optimizer=adam,
  69. loss='categorical_crossentropy',
  70. metrics=['accuracy'])
  71. print('Training ------------')
  72. model.fit(X_train, y_train, epochs=5, batch_size=64)
  73. print('\nTesting ------------')
  74. loss, accuracy = model.evaluate(X_test, y_test)
  75. print('\ntest loss: ', loss)
  76. print('\ntest accuracy: ', accuracy)
  77. models.save_model(model, 'mnist_cnn_keras.h5')