如何在TFlearn训练或测试时可视化CNN/池化层输出?
如何在TFlearn中可视化CNN/池化层的输出
当然有办法啦!我之前也踩过类似的session和feeddict的坑,尤其是那个"unhashable numpy.ndarray"错误,大概率是你误把numpy数组当成了feeddict的key导致的。其实结合TFlearn的封装特性和TensorFlow的底层API,就能轻松实现任意层输出的可视化,下面结合你的场景一步步来:
1. 先给目标层加个名字(关键!)
首先确保你在定义模型层的时候,给需要可视化的卷积/池化层加上name参数,这样后续能快速定位到它。比如你的模型结构可以改成这样(对应你已有的训练代码):
# 假设你的输入图像是(高度, 宽度, 通道数),比如MNIST的(28,28,1) net = tflearn.input_data(shape=[None, 28, 28, 1]) # 卷积层加个名字conv1,方便后续获取 net = tflearn.conv_2d(net, 32, 3, activation='relu', name='conv1') # 池化层同样加名字pool1 net = tflearn.max_pool_2d(net, 2, name='pool1') # 后续的全连接层等继续按你的需求定义 net = tflearn.fully_connected(net, 128, activation='relu') net = tflearn.fully_connected(net, 10, activation='softmax') net = tflearn.regression(net) # 创建模型并训练(这部分你已经完成了) model = tflearn.DNN(net) model.fit(X_train, y_train, validation_set=(X_test, y_test), ...)
2. 获取目标层的输出张量
TFlearn的DNN模型已经帮我们维护了TensorFlow的图和session,我们可以直接通过层名获取目标层,再拿到它的输出张量:
# 通过名字获取卷积层,比如刚才定义的conv1 target_layer = model.get_layer_by_name('conv1') # 获取该层的输出张量(这是TensorFlow的张量对象) layer_output_tensor = target_layer.output # 如果你记不清层名,也可以用索引获取,比如取第1个隐藏层(索引从0开始) # target_layer = model.get_layer_by_idx(1)
3. 运行张量得到输出值
这里不用手动创建session,直接用模型自带的model.session来运行,而且feeddict的key必须用TensorFlow的输入张量(也就是模型的输入节点),这就能避免那个"unhashable numpy.ndarray"错误:
import numpy as np # 取一张测试图像,比如X_test里的第一张,注意要扩展batch维度(变成(1, 高度, 宽度, 通道数)) test_image = X_test[0][np.newaxis, ...] # 运行张量获取输出,feeddict的key用model.inputs[0](模型的输入张量) layer_output = model.session.run(layer_output_tensor, feed_dict={model.inputs[0]: test_image})
4. 把输出可视化出来
拿到的layer_output形状是(1, 输出高度, 输出宽度, 滤波器数量),我们可以用Matplotlib把每个滤波器的输出画出来:
import matplotlib.pyplot as plt # 去掉batch维度,得到(输出高度, 输出宽度, 滤波器数量)的数组 output = layer_output[0] num_filters = output.shape[-1] # 计算子图的行数和列数,让布局更美观 rows = int(np.sqrt(num_filters)) cols = num_filters // rows + (1 if num_filters % rows != 0 else 0) plt.figure(figsize=(cols*2, rows*2)) for i in range(num_filters): plt.subplot(rows, cols, i+1) # 如果是灰度图用cmap='gray',彩色图可以用'viridis'等 plt.imshow(output[..., i], cmap='gray') plt.axis('off') # 关掉坐标轴,更专注于特征图 plt.tight_layout() plt.show()
小Tips排查问题
- 还是报"unhashable numpy.ndarray"?检查feeddict里的key是不是
model.inputs[0](TensorFlow张量),而不是你自己的numpy数组! - 维度不匹配?确认测试图像扩展batch维度后和模型输入shape一致,比如模型输入是
[None, 28,28,1],测试图像必须是(1,28,28,1)。 - 找不到层?可以打印
model.layers查看所有层的信息,里面包含每个层的name和索引。
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

