当前位置:   article > 正文

Tensorflow加载训练模型可视化网络结构特征图_tensorflow自定义模型并可视化模型结构

tensorflow自定义模型并可视化模型结构

在深度学习研究中,我们对于网络模型的学习过程的认识,大多是以一个黑盒的形式呈现出来的。网络结构中卷积层通过训练数据学习到怎样的特征,特征图是什么样的,对我们而言是隐晦难懂的,为此我们可以通过可视化特征图的方法,以图片的形式将网络结构中某一层特征图显示出来,直观的展现的我们面前,以便后续深入了解这复杂的网路模型。

环境:Tensorflow1.X

需要的包:import matplotlib as plt       from pylab import *

过程,首先将网络中需要可视化网络层张量返回到加载模型的验证过程的文件中,然后将运行该张量,得到numpy数组,从而显示,具体方法如下:

1.模型文件model.py

  1. class vgg16:
  2. def __init__(self, imgs):
  3. self.imgs = imgs
  4. self.convlayers()
  5. self.fc_layers()
  6. self.c3_3 = self.conv3_3
  7. def saver(self):
  8. return tf.train.Saver()
  9. def maxpool(self, name, input_data):
  10. out = tf.nn.max_pool(input_data,[1,2,2,1],[1,2,2,1],padding="SAME",name=name)
  11. return out
  12. def conv(self,name,input_data,out_channel):
  13. in_channel = input_data.get_shape()[-1]
  14. with tf.variable_scope(name):
  15. kernel = tf.get_variable("weights",[3, 3, in_channel,out_channel],dtype=tf.float32)
  16. biases = tf.get_variable("biases",[out_channel],dtype=tf.float32)
  17. conv_res = tf.nn.conv2d(input_data, kernel, [1,1,1,1], padding="SAME")
  18. res = tf.nn.bias_add(conv_res,biases)
  19. out = tf.nn.leaky_relu(res, name=name)
  20. return out
  1. def convlayers(self):
  2. self.conv1_1 = self.conv("conv1re_1",self.imgs,64)
  3. self.conv1_2 = self.conv("conv1_2",self.conv1_1,64)
  4. ·
  5. ·
  6. ·
  7. self.conv3_2 = self.conv("convrwe3_2", self.conv3_1,256)
  8. self.conv3_3 = self.conv("convrew3_3", self.conv3_2,256)#假设需要显示该层卷积层
  9. self.pool3 = self.maxpool("poolre3",self.conv3_3)

2加载训练模型文件Predict.py

  1. import tensorflow as tf
  2. import numpy as np
  3. import VGG16_Model as model
  4. import os
  5. import cv2
  6. import matplotlib as plt
  7. from pylab import *
  8. from scipy import misc
  9. #####################################
  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. def visualize_feature_map_sum(feature_batch):
  32. '''
  33. 将每张子图进行相加
  34. :param feature_batch:
  35. :return:
  36. '''
  37. feature_map = np.squeeze(feature_batch, axis=0)
  38. feature_map_combination = []
  39. # 取出 featurn map 的数量
  40. num_pic = feature_map.shape[2]
  41. # 将 每一层卷积的特征图,拼接层 5 × 5
  42. for i in range(0, num_pic):
  43. feature_map_split = feature_map[:, :, i]#设置需要叠加的特征图索引位置,比如在512个特征图中将100,200中
  44. #特征图叠加feature_map[100:200, :, i]
  45. feature_map_combination.append(feature_map_split)
  46. # 按照特征图 进行 叠加代码
  47. feature_map_sum = sum(one for one in feature_map_combination)
  48. plt.imshow(feature_map_sum)
  49. plt.show()
  50. ################################################
  51. pic_width,pic_height = 64,128
  52. x = tf.placeholder(tf.float32,[None,scale_pic_height,scale_pic_width,3])
  53. sess =tf.Session()
  54. vgg = model.vgg16(x)
  55. ConVis = vgg.c3_3
  56. fc8_finetuining = vgg.probs
  57. saver = tf.train.Saver()
  58. print("model restoring")
  59. #saver=tf.train.import_meta_graph('./model/epoch000601.ckpt.meta')
  60. saver.restore(sess,"./modeldir/epoch000602.ckpt")#重点,加载模型训练文件
  61. image_contents = tf.read_file('C:/Users/featuremap/1_3385.png')#重点,读入需要可视化显示的图片
  62. image = tf.image.decode_jpeg(image_contents, channels=3)
  63. image = tf.cast(image, tf.float32)
  64. image.set_shape((scale_pic_height, scale_pic_width, 3))
  65. image = sess.run(image)#将image的tensorr结构转化为numpy中list数据结构,需要之后喂入网络
  66. prob=sess.run([fc8_finetuining], feed_dict = {x:[image]})#与可视化无关,显示图片预测结果
  67. ConVis=sess.run([ConVis], feed_dict={x:[image]})#重点,运行需要可视化的某一层网络层的tensor
  68. visualize_feature_map(ConVis)#将每个特征图单独显示
  69. visualize_feature_map_sum(ConVis)#将特征图叠加显示
  70. max_index = np.argmax(prob)
  71. print("Pred:",max_index)#输出预测结构

3 总结

只需要将网络模型中需要可视化操作的某一层网络结构tensor返回,之后sess.run(),得到特征图数据,最后函数visualize_feature_map(ConVis)与 visualize_feature_map_sum(ConVis)显示。

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

闽ICP备14008679号