torch如何查看模型的中间输出结果
博主之前一直是用tensorflow,但是最近有在接触一点torch,发现torch中有一个地方很不方便就是他定义在网络中间的层的结果我们没法看,因为它没有办法像tensorflow这种可以直接通过名字索引。比如:
self.conv1_1 = self.conv_layer(bgr, 3, 64, "conv1_1")
self.conv1_2 = self.conv_layer(self.conv1_1,64,64, "conv1_2")
self.pool1 = self.max_pool(self.conv1_2, 'pool1')
self.conv2_1 = self.conv_layer(self.pool1,64, 128, "conv2_1")
self.conv2_2 = self.conv_layer(self.conv2_1,128, 128, "conv2_2")
self.pool2 = self.max_pool(self.conv2_2, 'pool2')
self.conv3_1 = self.conv_layer(self.pool2,128, 256, "conv3_1")
self.conv3_2 = self.conv_layer(self.conv3_1,256, 256, "conv3_2")
self.conv3_3 = self.conv_layer(self.conv3_2, 256, 256,"conv3_3")
self.pool3 = self.max_pool(self.conv3_3, 'pool3')
这里我们截取了一段Vgg16中的一段代码,我们想看下第一次池化后的我们的tensor的形状那我们直接下面就可以了,
prin(self.pool1)
如果我们想看下这个tensor运行出来的值是什么就直接:
tf.Session().run(self.pool1)
是不是简单粗暴又自然。
好了下面我们来看下:
fc8r = nn.Linear(base_model.fc_layers_output_size, numClasses):named('fc8r')
model = nn.Sequential():
add(nn.ParallelTable():
add(base_model.conv_layers):
add(RoiReshaper:StoreShape())
):
add(nn.ConcatTable():
add(branch_transform_rois_share_fc_layers(base_model, BoxOriginal)):
add(branch_transform_rois_share_fc_layers(base_model, BoxOriginal_ring)):
add(branch_transform_rois_share_fc_layers(base_model, ContextRegion))
):
add(nn.ConcatTable():
add(nn.Sequential():
add(nn.SelectTable(1)):
add(nn.Linear(base_model.fc_layers_output_size, numClasses):named('fc8c')):
add(RoiReshaper:RestoreShape()):
named('output_fc8c')
):
add(nn.Sequential():
add(nn.ConcatTable():
add(nn.Sequential():
add(nn.SelectTable(2)):
add(share_weight_bias(fc8r)):
named('output_fc8d_origring')
):
add(nn.Sequential():
add(nn.SelectTable(3)):
add(share_weight_bias(fc8r)):
add(nn.MulConstant(-1)):
named('output_fc8d_context')
)
):
add(nn.CAddTable()):
add(RoiReshaper:RestoreShape(4)):
add(cudnn.SpatialSoftMax()):
add(nn.Squeeze(4)):
named('output_softmax')
)
):
add(nn.CMulTable():named('output_prod')):
add(nn.Sum(2))
这个怎么来输出中间的结果呢, 我们就没有办法通过名字检索了,而要通过小标来进行检索,而且我们的模型是层层嵌套的,所以操作起来会比较的麻烦。下面我们来看一下实际的操作,首先我们来看下这个model的结构图:
大家可以看到这个网络结构是很复杂的嵌套了很多的层,我们要得到某一层要一层一层的结构的来剥离:
net1=model.modules[1]--这样得到的是最外层的网络,这个net1里面实际是有很多的网络层的,然后它其实
--是一个网络结构的集合
net2=model.modules[2]
net1_1_1=net1_1.modules[1]--这个是最外层的第一个节点的网络的集合中的第一个,这个针对我们这个
--网络也是一个网络的集合
net1_2=net1.modules[2]
net2_1=net2.modules[1]
net2_1_1=net2_1.modules[1]--好的剥离到这一层我们终于剥到了单层的网络,
F1=net2_1_1.output--然后对于单层的网络我们就可以调用这个.output函数来输出这个tensor的数值了
各位读者是不是觉得这样写比较麻烦我们是不是可以这样写:
net1_1=model.modules[1][1]
net1_1=model.modules[1,1]
然而lua是不支持这样的。只能加上 .modules才可以正常操作。