神经网络学习小记录7——利用Keras进行CNN网络构建

超、凢脫俗 2023-10-11 10:19 165阅读 0赞

神经网络学习小记录7——利用Keras进行CNN网络构建

  • 学习前言
  • Keras中构建CNN的重要函数
    • 1、Conv2D
    • 2、MaxPooling2D
    • 3、Flatten
  • 全部代码

学习前言

利用Keras构建完普通BP神经网络后,还要会构建CNN。
在这里插入图片描述

Keras中构建CNN的重要函数

1、Conv2D

Conv2D用于在CNN中构建卷积层,在使用它之前需要在库函数处import它。

  1. from keras.layers import Conv2D

在实际使用时,需要用到几个参数。

  1. Conv2D(
  2. nb_filter = 32,
  3. nb_row = 5,
  4. nb_col = 5,
  5. border_mode = 'same',
  6. input_shape = (28,28,1)
  7. )

其中,nb_filter代表卷积层的输出有多少个channel,卷积之后图像会越来越厚,这就是卷积后图像的厚度。nb_row和nb_col的组合就是卷积器的大小,这里卷积器是(5,5)的大小。border_mode代表着padding的方式,same表示卷积前后图像的shape不变。input_shape代表输入的shape。

2、MaxPooling2D

MaxPooling2D指的是池化层,在使用它之前需要在库函数处import它。

  1. from keras.layers import MaxPooling2D

在实际使用时,需要用到几个参数。

  1. MaxPooling2D(
  2. pool_size = (2,2),
  3. strides = (2,2),
  4. border_mode = 'same'
  5. )

其中,pool_size表示池化器的大小,在这里,池化器的shape是(2,2)。strides是池化器的步长,这里在X和Y方向上都是2,池化后,输出比输入的shape小了1/2。border_mode代表着padding的方式。

3、Flatten

Flatten用于将卷积池化后最后的输出变为一维向量,这样才可以和全连接层连接,用于计算。在使用前需要用import导入。

  1. from keras.layers import Flatten

在实际使用时,在最后一个池化层后直接添加层即可

  1. model.add(Flatten())

全部代码

这是一个卷积神经网络的例子,用于识别手写体,其神经网络结构如下:
卷积层1->池化层1->卷积层2->池化层2->flatten->全连接层1->全连接层2->全连接层3。
单个样本的shape如下:
(28,28,1)->(28,28,32)->(14,14,32)->(14,14,64)->(7,7,64)->(3136)->(1024)->(256)

  1. import numpy as np
  2. from keras.models import Sequential
  3. from keras.layers import Dense,Activation,Conv2D,MaxPooling2D,Flatten ## 全连接层
  4. from keras.datasets import mnist
  5. from keras.utils import np_utils
  6. from keras.optimizers import Adam
  7. (X_train,Y_train),(X_test,Y_test) = mnist.load_data()
  8. X_train = X_train.reshape(-1,28,28,1)
  9. X_test = X_test.reshape(-1,28,28,1)
  10. Y_train = np_utils.to_categorical(Y_train,num_classes= 10)
  11. Y_test = np_utils.to_categorical(Y_test,num_classes= 10)
  12. model = Sequential()
  13. # conv1
  14. model.add(
  15. Conv2D(
  16. nb_filter = 32,
  17. nb_row = 5,
  18. nb_col = 5,
  19. border_mode = 'same',
  20. input_shape = (28,28,1)
  21. )
  22. )
  23. model.add(Activation("relu"))
  24. # pool1
  25. model.add(
  26. MaxPooling2D(
  27. pool_size = (2,2),
  28. strides = (2,2),
  29. border_mode = 'same'
  30. )
  31. )
  32. # conv2
  33. model.add(
  34. Conv2D(
  35. nb_filter = 64,
  36. nb_row = 5,
  37. nb_col = 5,
  38. border_mode = 'same'
  39. )
  40. )
  41. model.add(Activation("relu"))
  42. # pool2
  43. model.add(
  44. MaxPooling2D(
  45. pool_size = (2,2),
  46. strides = (2,2),
  47. border_mode = 'same'
  48. )
  49. )
  50. # 全连接层
  51. model.add(Flatten())
  52. model.add(Dense(1024))
  53. model.add(Activation("relu"))
  54. model.add(Dense(256))
  55. model.add(Activation("relu"))
  56. model.add(Dense(10))
  57. model.add(Activation("softmax"))
  58. adam = Adam(lr = 1e-4)
  59. ## compile
  60. model.compile(loss = 'categorical_crossentropy',optimizer = adam,metrics = ['accuracy'])
  61. ## tarin
  62. print("\ntraining")
  63. cost = model.fit(X_train,Y_train,nb_epoch = 2,batch_size = 32)
  64. print("\nTest")
  65. ## acc
  66. cost,accuracy = model.evaluate(X_test,Y_test)
  67. ## W,b = model.layers[0].get_weights()
  68. print("accuracy:",accuracy)

实验结果为:

  1. Epoch 1/2
  2. 60000/60000 [==============================] - 64s 1ms/step - loss: 0.7664 - acc: 0.9224
  3. Epoch 2/2
  4. 60000/60000 [==============================] - 62s 1ms/step - loss: 0.0473 - acc: 0.9858
  5. Test
  6. 10000/10000 [==============================] - 2s 169us/step
  7. accuracy: 0.9856

有不懂的朋友可以评论询问噢。

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读