神经网络截取中间层

在预测的过程中,想要将神经网络模型的中间层结果获取到,并进行可视化。

训练过程中搭建的模型代码如下:

class_num = 3
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,include_top=False,weights="imagenet")
base_model.trainable = False
model = tf.keras.models.Sequential([tf.keras.layers.experimental.preprocessing.Rescaling(1. / 127.5, offset=-1, input_shape=IMG_SHAPE),base_model,tf.keras.layers.Dense(512, activation="relu"),tf.keras.layers.Dropout(0.2),tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(class_num, activation='softmax'),
])
model.compile(optimizer=tf.optimizers.Adam(0.001),loss=tf.keras.losses.CategoricalCrossentropy(),metrics=['binary_crossentropy', 'accuracy'])
history = model.fit(train_ds, validation_data=val_ds, epochs=10)
model.save("./models/model.h5")

实现中间层获取的思路如下:

首先在预测之前读取保存的模型文件

model = tf.keras.models.load_model(model_path)

然后构建一个新的模型,结构为读取的原model的一部分,对于正常搭建的神经网络,直接使用 model.layers[m:n] 就可以截取到m到n-1层的网络;
但是在本次实验中,使用了keras中的mobilenetv2作为本次网络搭建中的base_model,虽然base_model有155层,但是将训练完成后保存的模型,在预测时进行读取后,这155层都将被视为一层,该层名称为:mobilenetv2_1.00_224 ,下图为读取model的summary:

也就是说,将155层的mobilenet在此压缩为了1层,在这1层的内部又包含了155层,所以在此处截取网络时,就需要采取一些操作。

首先介绍keras中搭建模型的两个主要方式:序列式和函数式。

1)序列式:像搭积木一样,将所有的层在Sequential中进行依次搭建

model = keras.Sequential([keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'),  keras.layers.Dense(10, activation='softmax')
])

2)函数式:将网络的先后逻辑在代码中写好,将整个网络的输入和输出赋值给Model函数

inputs = keras.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)model = keras.Model(inputs, outputs)

Keras中的 MobileNetV2 函数生成的是函数式的模型,因此无法直接在序列式中搭建,直接采用下面的方式会出现错误:

new_model = tf.keras.Sequential([model.layers[0],model.layers[1].layers[0:5],
])

因此采取的截取解决方案如下:

解决方案一

# 获取 model.layers[1]的 0到4层
# 其中f为第0层,m为1到3层, l为第4层
f, *m, l=model.layers[1].layers[0:5]# 将 model.layers[0](rescaling预处理层) 与 截取的f,*m,l拼接在一起
model_1 = tf.keras.Sequential([model.layers[0],f,*m,l
])

在上面代码中,model.layers[1]mobilenetv2_1.00_224model.layers[0]rescaling预处理层。
思想就是将函数式模型mobilenetv2_1.00_224中的层直接取出来,赋值给f,*m,l 变量,这些变量表示的就是某些具体的层,可以将变量通过Sequential进行组合,搭建出一个子网络。
这个方案有一种缺陷,就是只能根据索引来获取某些层。

解决方案二:

model_slice = tf.keras.models.Model(inputs=model.get_layer("mobilenetv2_1.00_224").input,outputs=model.get_layer("mobilenetv2_1.00_224").get_layer("Conv1").output,name="model_slice")
model_2 = tf.keras.Sequential([model.get_layer("rescaling"),model_slice
])

采用函数式模型,获取mobilenetv2_1.00_224的输入和某一层的输出,组成model_slice,将其作为Sequential的一个元素即可。

可视化

# 打开并读取图片
img_init = cv2.imread(img_path)
img_init = cv2.resize(img_init, (224, 224))
img = np.asarray(img_init)# 将图片通过子模型,得到中间层输出model_slice_feature
model_slice_feature = model_2.predict(img.reshape(1, 224, 224, 3))# 将model_slice_feature传入可视化函数中进行可视化
visualize_feature_map(model_slice_feature)# 将图片通过原model,得到预测结果
outputs = model.predict(img.reshape(1, 224, 224, 3))
predict_index = np.argmax(outputs)
predict_label = class_names[predict_index]

可视化函数的代码:

def get_row_col(num_pic):squr = num_pic ** 0.5row = round(squr)col = row + 1 if squr - row > 0 else rowreturn row, coldef visualize_feature_map(img_batch):feature_map = np.squeeze(img_batch, axis=0)print(feature_map.shape)feature_map_combination = []plt.figure(figsize=(6, 6.5))plt.suptitle("Hidden layer feature map")num_pic = feature_map.shape[2]row, col = get_row_col(num_pic)for i in range(0, num_pic):feature_map_split = feature_map[:, :, i]feature_map_combination.append(feature_map_split)plt.subplot(row, col, i + 1)plt.imshow(feature_map_split, cmap="gray")plt.axis('off')plt.title('feature_map_{}'.format(i), fontdict={'size':6})plt.savefig('feature_map.png')plt.show()# 各个特征图按1:1 叠加feature_map_sum = sum(ele for ele in feature_map_combination)plt.imshow(feature_map_sum)

效果展示:

参考

https://blog.csdn.net/guolindonggld/article/details/106459317

【TensorFlow】神经网络中间层截取、可视化中间层结果相关推荐

  1. Pytorch输出网络中间层特征可视化

    Pytorch输出网络中间层特征可视化 本文主要介绍了如何提取特定层的特征,然后对它进行可视化.最后给出了不同网络的应用案例. 推荐一个GITHUN实现可视化的工具地址 整体步骤 加载已经预训练好的模 ...

  2. Tensorflow神经网络框架 小例子 三层神经网络 卷积神经网络 循环神经网络 神经网络可视化

    Tensorflow神经网络框架 以前我们讲了神经网络基础,但是如果从头开始实现,那将是一个庞大且费时的工作,所以我们选择一条捷径---神经网络框架.我理解的神经网络框架就相当于一个工具包.就比如我们 ...

  3. Python Tensorflow神经网络实现股票预测

    神经网络(NN)它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型.这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的.在提供数据量足够大情 ...

  4. TF之DNN:对DNN神经网络进行Tensorboard可视化(得到events.out.tfevents本地服务器输出到网页可视化)

    TF之DNN:对DNN神经网络进行Tensorboard可视化(得到events.out.tfevents本地服务器输出到网页可视化) 目录 输出结果 代码设计 输出结果 代码设计 import te ...

  5. 神经网络基础之可视化和交互式指南

    1.动机 2015年11月谷歌开源TensorFlow的时候,我非常兴奋,知道是时候开始学习了.听起来不太戏剧化,但对我来说,这实际上有点像普罗米修斯从机器学习的奥林匹斯山把火传给人类.在我的脑海里浮 ...

  6. TensorFlow神经网络实现股票预测

    目录 1.数据来源 2.数据可视化 3.神经网络设计 神经网络(NeuralNetworks)是一种用训练数据拟合目标函数的黑箱模型,只要数据量足够大,它可以拟合出输入到输出之间的任意函数关系. 本篇 ...

  7. Tensorflow命名空间与计算图可视化

    Tensorflow命名空间与计算图可视化 觉得有用的话,欢迎一起讨论相互学习~ 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 pyt ...

  8. TensorFlow神经网络集成方案

    TensorFlow神经网络集成方案 创造张力流create_tensorflow_neuropod 将TensorFlow模型打包为neuropod包. create_tensorflow_neur ...

  9. 神经网络注意力机制可视化,人工神经网络可视化

    直接用神经网络工具箱构建bp神经网络,希望能给个例子说明,有注解最好,本人matlab新手,谢谢 10 BP(BackPropagation)神经网络是1986年由Rumelhart和McCellan ...

最新文章

  1. Spring Boot 2.0 常见问题总结(一)
  2. c语言图形界面设定,「分享」C语言如何编写图形界面
  3. EXTJS学习系列提高篇:第二十五篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--右键菜单篇...
  4. Node.js 在本地生成日志文件
  5. 音视频开发相关工具整理
  6. Android 应用开发(34)---反编译APK获取代码资源
  7. 雷达导论PART-III.8 雷达接收机与数字化
  8. 视频教程-【企业定制课】AI软件illustratorCC应用与平面印刷视频教程-UI
  9. 给买车的来点干货——汽车品牌分析
  10. 基于CNN的SEEG/EEG脑电数据处理分析
  11. 脸谱网下载_脸谱网对AR眼镜大胆愿景的最大障碍是信任
  12. SqlServer使用top 100 PERCENT 无法排序的问题
  13. 获取ccid的标准方法
  14. Bert预训练新法则
  15. MAC 网桥-交换机
  16. 如何生成android的BKS证书
  17. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
  18. 基于VGG的猫狗识别
  19. Linux CPU软中断案例一则
  20. 台湾大学神经网络架构设计

热门文章

  1. 四川大学c语言实验报告,四川大学-C语言程序设计精品课程申报网站
  2. Photoshop——矫正变形图像
  3. javaweb 分页代码
  4. 即将举行的Live From Redmond免费网络广播讲座
  5. 关于AI+医疗的调研
  6. 接受了微软丹棱君的专访!
  7. python多线程下载视频_python 实现多线程下载m3u8格式视频并使用fmmpeg合并
  8. 印度区块链项目Matic Network的应用场景分析
  9. 削皮刀的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. 摄影入门-之一-什么是单反