关于可视化神经网络中间层的详细说明

关于可视化神经网络中间层的详细说明

一、对一些处理的意义的说明

activation_model = models.Model(inputs=model.input, outputs=layer_outputs)
#此处的inputs是之前导入的模型,model = load_model('...(解释:自己的模型)')

 # 特征图的形状(1,宽,高,n_features)
size = layer_activation.shape[1]


#  n_cols定义一个图像输出格式即一行几个图,一共有几行 把特征图平铺在这个上面
n_cols = n_features / images_per_row
display_grid = np.zeros((size * n_cols, images_per_row * size))

如:
在这里插入图片描述
一行十六个图片,一共两行

display_grid = np.zeros((size * n_cols, images_per_row * size))
#print("不明;", display_grid)
"""[[0. 0. 0. ... 0. 0. 0.]

[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]

[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]]"""
#制造一个特征图的载体,即后续图像会被存在到这个框架中

二、代码

import os
#os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
"""可视化中间层,有助于理解变换"""
from keras.models import load_model
model = load_model('cats_and_dogs_small_2.h5')
img_path = r'J:\PyCharm项目\学习进行中\keras深度学习\data\train\train\cat.1700.jpg'

# 我们将图像预处理为4D张量:即样本数,图片
from keras.preprocessing import image
import numpy as np

img = image.load_img(img_path, target_size=(150, 150))

i mg_tensor = image.img_to_array(img)

img_tensor = np.expand_dims(img_tensor, axis=0)
"""理解为增加一个括号!11"""
print("扩展:",img_tensor.shape)
# 请记住,模型是通过以下方式对输入进行训练的即图片格式化:
img_tensor /= 255.
# Its shape is (1, 150, 150, 3)


"""图片可视化"""
import matplotlib.pyplot as plt

plt.imshow(img_tensor[0])
plt.show()


from keras import models




"""提取所有的输出图片"""
import keras

# 这些是图层的名称
layer_names = []
for layer in model.layers[:8]:
	layer_names.append(layer.name)

images_per_row = 16#绘图时将16张图放在一行

# 现在让我们显示特征图
for layer_name, layer_activation in zip(layer_names, activations):
	#这是要素图中的要素数量,是每一层有多少特征图
	n_features = layer_activation.shape[-1]


 # 特征图具有形状(1,宽,高,n_features)
	size = layer_activation.shape[1]
	print("特征大小:", size)

	# 定义一个图像输出背景即一行几个图,一共有几行 把特征图平铺在这个上面
	n_cols = n_features // images_per_row
	#print("图的格子即有多少行;",n_cols)
	display_grid = np.zeros((size * n_cols, images_per_row * size))

 """[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]"""
#制造一个特征图的载体

# 我们将每个滤镜平铺到这个大的图像输出格式中
for col in range(n_cols):#每一列
    for row in range(images_per_row):#每一行
        channel_image = layer_activation[0,:, :,col * images_per_row + row]
        # 对特征进行后处理,注意此处输出的是变化后的张量,因而对之进行预处理
        channel_image -= channel_image.mean()#均值化
        channel_image /= channel_image.std()#标准差
        #图片复原,即从预处理的特征缩放为0,1之间的数据复原
        channel_image *= 64
        channel_image += 128
        #由张量向图片格式转化
        channel_image = np.clip(channel_image, 0, 255).astype('uint8')#数据裁剪到0到255内,8位图像节省内存空间
        # 将每一个特征图加载到可视化的对象中去,行列对象位置
        display_grid[col * size: (col + 1) * size, row * size: (row + 1) * size] = channel_image

# 显示所有图片
scale = 1. / size
plt.figure(figsize=(scale * display_grid.shape[1],
                    scale * display_grid.shape[0]))
plt.title(layer_name)
plt.grid(False)
plt.imshow(display_grid, aspect='auto', cmap='viridis')

plt.show()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值