博主之前一直是用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才可以正常操作。 PyTorch學習總結 一 檢視模型中間結果
這裡我們以pytorch自帶的預訓練模型為例來講解 load the pretrained model alexnet models.alexnet pretrained true cuda print alexnet alexnet features sequential 0 conv2d 3,6...
js 中介軟體的洋蔥模型
var express require express console.log a middleware1 開始 next console.log b middleware1 結束 console.log c middleware2 開始 next console.log d middleware2...
檢視caffe模型的引數
1.訓練模型的引數 solver caffe.sgdsolver str solver path for name,blob in solver.net.blobs,items 網路中的資料,blobs是乙個字典 print name str blob.data.shape blob是blob的類物...