当前位置:   article > 正文

卷积神经网络特征图可视化(自定义网络和VGG网络)_自定义网络特征图可视化

自定义网络特征图可视化

 

借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么。

 

自定义网络特征可视化

 

代码:

  1. # coding: utf-8
  2. from keras.models import Model
  3. import cv2
  4. import matplotlib.pyplot as plt
  5. from keras.models import Sequential
  6. from keras.layers.convolutional import Convolution2D, MaxPooling2D
  7. from keras.layers import Activation
  8. from pylab import *
  9. import keras
  10. def get_row_col(num_pic):
  11. squr = num_pic ** 0.5
  12. row = round(squr)
  13. col = row + 1 if squr - row > 0 else row
  14. return row, col
  15. def visualize_feature_map(img_batch):
  16. feature_map = np.squeeze(img_batch, axis=0)
  17. print(feature_map.shape)
  18. feature_map_combination = []
  19. plt.figure()
  20. num_pic = feature_map.shape[2]
  21. row, col = get_row_col(num_pic)
  22. for i in range(0, num_pic):
  23. feature_map_split = feature_map[:, :, i]
  24. feature_map_combination.append(feature_map_split)
  25. plt.subplot(row, col, i + 1)
  26. plt.imshow(feature_map_split)
  27. axis('off')
  28. title('feature_map_{}'.format(i))
  29. plt.savefig('feature_map.png')
  30. plt.show()
  31. # 各个特征图按1:1 叠加
  32. feature_map_sum = sum(ele for ele in feature_map_combination)
  33. plt.imshow(feature_map_sum)
  34. plt.savefig("feature_map_sum.png")
  35. def create_model():
  36. model = Sequential()
  37. # 第一层CNN
  38. # 第一个参数是卷积核的数量,第二三个参数是卷积核的大小
  39. model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
  40. model.add(Activation('relu'))
  41. model.add(MaxPooling2D(pool_size=(4, 4)))
  42. # 第二层CNN
  43. model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
  44. model.add(Activation('relu'))
  45. model.add(MaxPooling2D(pool_size=(3, 3)))
  46. # 第三层CNN
  47. model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
  48. model.add(Activation('relu'))
  49. model.add(MaxPooling2D(pool_size=(2, 2)))
  50. # 第四层CNN
  51. model.add(Convolution2D(9, 3, 3, input_shape=img.shape))
  52. model.add(Activation('relu'))
  53. # model.add(MaxPooling2D(pool_size=(2, 2)))
  54. return model
  55. if __name__ == "__main__":
  56. img = cv2.imread('001.jpg')
  57. model = create_model()
  58. img_batch = np.expand_dims(img, axis=0)
  59. conv_img = model.predict(img_batch) # conv_img 卷积结果
  60. visualize_feature_map(conv_img)

这里定义了一个4层的卷积,每个卷积层分别包含9个卷积、Relu激活函数和尺度不等的池化操作,系数全部是随机初始化。
输入的原图如下:

 

第一层卷积后可视化的特征图:

 

所有第一层特征图1:1融合后整体的特征图:

 

第二层卷积后可视化的特征图:

 

所有第二层特征图1:1融合后整体的特征图:

 

第三层卷积后可视化的特征图:

 

所有第三层特征图1:1融合后整体的特征图:

 

第四层卷积后可视化的特征图:

 

所有第四层特征图1:1融合后整体的特征图:

从不同层可视化出来的特征图大概可以总结出一点规律:

  • 1. 浅层网络提取的是纹理、细节特征
  • 2. 深层网络提取的是轮廓、形状、最强特征(如猫的眼睛区域)
  • 3. 浅层网络包含更多的特征,也具备提取关键特征(如第一组特征图里的第4张特征图,提取出的是猫眼睛特征)的能力
  • 4. 相对而言,层数越深,提取的特征越具有代表性
  • 5. 图像的分辨率是越来越小的

 

 

VGG19网络特征可视化

 

代码:

  1. # coding: utf-8
  2. from keras.applications.vgg19 import VGG19
  3. from keras.preprocessing import image
  4. from keras.applications.vgg19 import preprocess_input
  5. from keras.models import Model
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. from pylab import *
  9. def get_row_col(num_pic):
  10. squr = num_pic ** 0.5
  11. row = round(squr)
  12. col = row + 1 if squr - row > 0 else row
  13. return row, col
  14. def visualize_feature_map(img_batch):
  15. feature_map = img_batch
  16. print(feature_map.shape)
  17. feature_map_combination = []
  18. plt.figure()
  19. num_pic = feature_map.shape[2]
  20. row, col = get_row_col(num_pic)
  21. for i in range(0, num_pic):
  22. feature_map_split = feature_map[:, :, i]
  23. feature_map_combination.append(feature_map_split)
  24. plt.subplot(row, col, i + 1)
  25. plt.imshow(feature_map_split)
  26. axis('off')
  27. plt.savefig('feature_map.png')
  28. plt.show()
  29. # 各个特征图按1:1 叠加
  30. feature_map_sum = sum(ele for ele in feature_map_combination)
  31. plt.imshow(feature_map_sum)
  32. plt.savefig("feature_map_sum.png")
  33. if __name__ == "__main__":
  34. base_model = VGG19(weights='imagenet', include_top=False)
  35. # model = Model(inputs=base_model.input, outputs=base_model.get_layer('block1_pool').output)
  36. # model = Model(inputs=base_model.input, outputs=base_model.get_layer('block2_pool').output)
  37. # model = Model(inputs=base_model.input, outputs=base_model.get_layer('block3_pool').output)
  38. # model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)
  39. model = Model(inputs=base_model.input, outputs=base_model.get_layer('block5_pool').output)
  40. img_path = '001.jpg'
  41. img = image.load_img(img_path)
  42. x = image.img_to_array(img)
  43. x = np.expand_dims(x, axis=0)
  44. x = preprocess_input(x)
  45. block_pool_features = model.predict(x)
  46. print(block_pool_features.shape)
  47. feature = block_pool_features.reshape(block_pool_features.shape[1:])
  48. visualize_feature_map(feature)

 

从第一到第五层的特征图分别如下:

 

从第一层到第五层各特征图按1:1比例融合后特征依次为:

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

闽ICP备14008679号