如何可视化 Caffe 参数?
How to visualize Caffe parameters?
我一直在寻找一种在转换网络后在 Caffe 中可视化参数的方法,我找到了 this link。它发送参数转置
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
我不明白为什么要转置数据?并在 vis_square 中使用此代码:
data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])
太压缩了,看不懂,如有解释,将不胜感激。然后当我更改代码以获取 conv2 而不是 conv1:
filters = net.params['conv2'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
我明白了
TypeError: Invalid dimensions for image data
, conv1 和 conv2 之间有什么不同导致这个错误吗?我们如何更改代码来修复它并使其适用于所有层?
一些调试数据:
net.params['conv1'][0].data.shape : (96, 3, 11, 11)
net.params['conv1'][1].data.shape : (96,)
net.params['conv2'][0].data.shape : (256, 48, 5, 5)
net.params['conv2'][1].data.shape : (256,)
net.params['conv3'][0].data.shape : (384, 256, 3, 3)
net.params['conv3'][1].data.shape : (384,)
for conv2:
data.shape[0] : 256
np.sqrt(data.shape[0]) : 16.0
np.ceil(np.sqrt(data.shape[0])) : 16.0
data.shape[0] : 256
data.shape[0:] : (256, 6, 6, 48)
data.shape[1] : 6
data.shape[1:] : (6, 6, 48)
data.ndim : 4
range(4, data.ndim + 1)) : [4]
tuple(range(4, data.ndim + 1)) : (4,)
之后:
data = np.pad(data, padding, mode='constant', constant_values=1)
对于 conv2:
data.shape : (10, 12, 10, 12, 3)
及
之后
data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
数据变为:
data.shape : (120, 120, 3)
您检查的代码用于可视化(即转换为 RGB 图像)卷积滤波器。
conv1
过滤器的形状(在你的例子中)是 (96, 3, 11, 11)
这意味着
- 96
:您的网络 conv1
中有 96 个过滤器(即 num_output: 96
),因此您希望查看 96 个不同的过滤器。
- 3
: 每个过滤器的输入维度是 3,因为你的网络中 conv1
的输入是一个具有三个通道的 RGB 图像。
- 11, 11
:在您的案例中,每个 kernel/filter 的空间大小为 11x11(即 kernel_size: 11
)。
因此,将 96 个滤镜可视化为 11x11x3 的缩略图。
但是,当尝试可视化 conv2
(或任何其他更深层)时,您遇到了问题。不再有 RGB 含义来过滤维度。 conv2
的过滤器作用于 conv1
的输出特征(在您的例子中是 96 维 space)。迄今为止,据我所知,没有直接的方法将 96 维数据转换为简单的 3D RGB 表示。
因此,您不能使用相同的代码来可视化 conv2
过滤器。您必须使用其他方法进行可视化。
我一直在寻找一种在转换网络后在 Caffe 中可视化参数的方法,我找到了 this link。它发送参数转置
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
我不明白为什么要转置数据?并在 vis_square 中使用此代码:
data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])
太压缩了,看不懂,如有解释,将不胜感激。然后当我更改代码以获取 conv2 而不是 conv1:
filters = net.params['conv2'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
我明白了
TypeError: Invalid dimensions for image data
, conv1 和 conv2 之间有什么不同导致这个错误吗?我们如何更改代码来修复它并使其适用于所有层?
一些调试数据:
net.params['conv1'][0].data.shape : (96, 3, 11, 11)
net.params['conv1'][1].data.shape : (96,)
net.params['conv2'][0].data.shape : (256, 48, 5, 5)
net.params['conv2'][1].data.shape : (256,)
net.params['conv3'][0].data.shape : (384, 256, 3, 3)
net.params['conv3'][1].data.shape : (384,)
for conv2:
data.shape[0] : 256
np.sqrt(data.shape[0]) : 16.0
np.ceil(np.sqrt(data.shape[0])) : 16.0
data.shape[0] : 256
data.shape[0:] : (256, 6, 6, 48)
data.shape[1] : 6
data.shape[1:] : (6, 6, 48)
data.ndim : 4
range(4, data.ndim + 1)) : [4]
tuple(range(4, data.ndim + 1)) : (4,)
之后:
data = np.pad(data, padding, mode='constant', constant_values=1)
对于 conv2:
data.shape : (10, 12, 10, 12, 3)
及
之后data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
数据变为:
data.shape : (120, 120, 3)
您检查的代码用于可视化(即转换为 RGB 图像)卷积滤波器。
conv1
过滤器的形状(在你的例子中)是 (96, 3, 11, 11)
这意味着
- 96
:您的网络 conv1
中有 96 个过滤器(即 num_output: 96
),因此您希望查看 96 个不同的过滤器。
- 3
: 每个过滤器的输入维度是 3,因为你的网络中 conv1
的输入是一个具有三个通道的 RGB 图像。
- 11, 11
:在您的案例中,每个 kernel/filter 的空间大小为 11x11(即 kernel_size: 11
)。
因此,将 96 个滤镜可视化为 11x11x3 的缩略图。
但是,当尝试可视化 conv2
(或任何其他更深层)时,您遇到了问题。不再有 RGB 含义来过滤维度。 conv2
的过滤器作用于 conv1
的输出特征(在您的例子中是 96 维 space)。迄今为止,据我所知,没有直接的方法将 96 维数据转换为简单的 3D RGB 表示。
因此,您不能使用相同的代码来可视化 conv2
过滤器。您必须使用其他方法进行可视化。