当前位置:   article > 正文

TensorFlow(7)卷积神经网络实战(1)(可视化)_tensorflow 卷积层中的滤波器可视化

tensorflow 卷积层中的滤波器可视化

目录

基础理论 

卷积 

卷积核与过滤器的区别

一、获取数据集

二、设定数据集大小、归一化

三、构建卷积神经网络

四、编译&&训练

五、模型评估 

六、可视化

1、创建plt图 

2、获取各卷积层

3、观察卷积层

总代码

卷积神经网络 

可视化


基础理论 

        在实际应用中,摄像头捕捉到的图片,主物品往往会偏于一侧的位置,甚至有角度的旋转,这时神经网络模型对这些图片的分类就会不准。这时我们引入:卷积神经网络(CNN)

        通过卷积操作缩小了图像的内容,将模型注意力集中在图像特定的、明显的特征上。

        这种计算对于计算机视觉来说是非常理想的,因为通常情况下,能够像这样被突出显示的特征才是区分一个物品和另一个物品的关键

卷积 

不同的过滤器有不同的效果:

 竖直过滤器(留下竖直线):

 水平过滤器(留下水平线):

卷积核与过滤器的区别

卷积核是二维的,滤波器是三维的(高维,也可能是四维的)

  • 卷积核就是由长和宽来指定的,是一个二维的概念。
  • 而过滤器是是由长、宽和深度指定的,是一个三维的概念。
  • 过滤器可以看做是卷积核的集合
  • 过滤器比卷积核高一个维度——深度。

一、获取数据集

  1. # 1、获取数据集
  2. mnist = tf.keras.datasets.fashion_mnist
  3. (training_images, training_labels), (test_images, test_labels) = mnist.load_data()

二、设定数据集大小、归一化

卷积期望一个包含所有数据单一张量,所以要把训练数据设置为60000x28x28x1的一个4D列表。(如果不这样做,会在训练时得到一个错误,因为卷积操作将不能识别数据形状。) 

  1. # 2、设定数据集大小、归一化
  2. training_images=training_images.reshape(60000, 28, 28, 1)
  3. training_images=training_images / 255.0
  4. test_images = test_images.reshape(10000, 28, 28, 1)
  5. test_images=test_images/255.0

三、构建卷积神经网络

  1. # 3、构建卷积神经网络
  2. model = tf.keras.models.Sequential([
  3. tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
  4. # Conv2D:卷积层 64:卷积过滤器数量 (3,3):卷积核大小
  5. tf.keras.layers.MaxPooling2D(2, 2),
  6. # 池化层
  7. tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
  8. tf.keras.layers.MaxPooling2D(2,2),
  9. tf.keras.layers.Flatten(),
  10. tf.keras.layers.Dense(128, activation='relu'),
  11. tf.keras.layers.Dense(10, activation='softmax')
  12. ])

四、编译&&训练

  1. # 4、编译&&训练
  2. model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  3. model.fit(training_images, training_labels, epochs=5)
  4. # 输出模型各层的影响
  5. model.summary()

五、模型评估 

  1. # 5、模型评估
  2. test_loss = model.evaluate(test_images, test_labels)

 可以发现卷积神经网络比起前面的DNN神经网络效果好了不少,但是相应的,时间会比较慢。

六、可视化

1、创建plt图 

  1. import matplotlib.pyplot as plt
  2. # plt图
  3. f, a = plt.subplots(3, 4)
  4. # f:子图像 a:array列表 3:行 4:列

2、获取各卷积层

  1. # 各卷积层
  2. from tensorflow.keras import models
  3. layer_outputs = [layer.output for layer in model.layers]
  4. print(layer_outputs)
  5. activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
  6. # 输入层 输出层

3、观察卷积层

  1. # 抽3个图片(FIRST、SECOND、THIRD),观察神经网络的前四层(正好对应四个卷积层)(神经网络共7层)
  2. # test_images[...]:第几张图片 x:第几层
  3. # 第一张图片卷积神经网络处理情况
  4. f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  5. a[0,x].imshow(f1[0, : , :, 1]) #1:下标为1的卷积核(第2个卷积核)
  6. # 第二张图片卷积神经网络处理情况
  7. f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  8. a[1,x].imshow(f2[0, : , :, 1])
  9. # 第三张图片卷积神经网络处理情况
  10. f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  11. a[2,x].imshow(f3[0, : , :, 1])

总代码

卷积神经网络 

  1. import tensorflow as tf
  2. print(tf.__version__)
  3. # 1、获取数据集
  4. mnist = tf.keras.datasets.fashion_mnist
  5. (training_images, training_labels), (test_images, test_labels) = mnist.load_data()
  6. # 特征训练集 目标训练集 特征测试集 目标测试集
  7. # 2、设定数据集大小、归一化
  8. training_images=training_images.reshape(60000, 28, 28, 1)
  9. training_images=training_images / 255.0
  10. test_images = test_images.reshape(10000, 28, 28, 1)
  11. test_images=test_images/255.0
  12. # 3、构建卷积神经网络
  13. model = tf.keras.models.Sequential([
  14. tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
  15. # Conv2D:卷积层 64:卷积过滤器数量 (3,3):卷积核大小
  16. tf.keras.layers.MaxPooling2D(2, 2),
  17. # 池化层
  18. tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
  19. tf.keras.layers.MaxPooling2D(2,2),
  20. tf.keras.layers.Flatten(),
  21. tf.keras.layers.Dense(128, activation='relu'),
  22. tf.keras.layers.Dense(10, activation='softmax')
  23. ])
  24. # 4、编译&&运行
  25. model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  26. model.fit(training_images, training_labels, epochs=5)
  27. # 输出模型各层的影响
  28. model.summary()
  29. # 5、模型评估
  30. test_loss = model.evaluate(test_images, test_labels)

可视化

  1. # 卷积、池化过程可视化
  2. import matplotlib.pyplot as plt
  3. # plt图
  4. f, a = plt.subplots(3, 4)
  5. # f:子图像 a:array列表 3:行 4:列
  6. # 随机选取可视化的图片
  7. FIRST_IMAGE=0
  8. SECOND_IMAGE=7
  9. THIRD_IMAGE=26
  10. # 各卷积层
  11. from tensorflow.keras import models
  12. layer_outputs = [layer.output for layer in model.layers]
  13. print(layer_outputs)
  14. activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
  15. # 输入层 输出层
  16. # 按行可视化
  17. for x in range(0,4):
  18. # 观察卷积层(7个层输出,这里只取了四个卷积层)
  19. f = activation_model.predict(test_images[0].reshape(1, 28, 28, 1))
  20. print(len(f))
  21. # 抽3个图片(FIRST、SECOND、THIRD),观察神经网络的前四层(正好对应四个卷积层)(神经网络共7层)
  22. # test_images[...]:第几张图片 x:第几层
  23. # 第一张图片卷积神经网络处理情况
  24. f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  25. a[0,x].imshow(f1[0, : , :, 1]) #1:下标为1的卷积核(第2个卷积核)
  26. # 第二张图片卷积神经网络处理情况
  27. f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  28. a[1,x].imshow(f2[0, : , :, 1])
  29. # 第三张图片卷积神经网络处理情况
  30. f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  31. a[2,x].imshow(f3[0, : , :, 1])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/121896
推荐阅读
相关标签
  

闽ICP备14008679号