1樓:
建議使用hook,在不改變網路forward函式的基礎上提取所需的特徵或者梯度,在呼叫階段對module使用即可獲得所需梯度或者特徵。
inter_feature={}
inter_gradient={}
defmake_hook
(name
,flag
):if
flag
=='forward'
:def
hook(m
,input
,output
):inter_feature
[name]=
input
return
hook
elif
flag
=='backward'
:def
hook(m
,input
,output
):inter_gradient
[name]=
output
return
hook
else
:assert
Falsem.
register_forward_hook
(make_hook
(name
,'forward'))m
.register_backward_hook
(make_hook
(name
,'backward'
))在前向計算和反向計算的時候即可達到類似鉤子的作用,中間變數已經被放置於inter_feature 和 inter_gradient。
output = model(input) # achieve intermediate feature
loss = criterion(output, target)
loss.backwardachieve backward intermediate gradients
最後可根據需求是否釋放hook。
hook.remove()
2樓:範汝超
中間層特徵的話就在forward上儲存變數比較方便。要提梯度的話就得hook了。仔細看看nn.
sequential類就會發現他的init函式裡是add_module().你用nn.functional肯定就加不進去了啊。
net.children()不會有pooling和relu。
3樓:nicolas gp
貌似確實是個問題。兩點:
(1)一般我都採用註冊好class。load預訓練好的模型(state_dict方式儲存),首先自己定義好自己的forward,並且保證自己的forward和訓練用的模型一致。
(2)提取中間特徵採用register hook, 舉個例子:
step1 : define hooks
def hook_net(net):
feature_mapshooks =
keys_list_0 = net._modules.keys()
for k0 in keys_list_0:
m = net._modules.get(k0)
# return layers, feature_maps, hooks
return feature_maps, hooks
forward data and get features stored in a list
dataset_features, hooks = hook_net(model)
for i, (inputs, labels) in enumerate(data_loader):
# forward data
model(inputs)
4樓:
提取中間特徵是指把中間的weights給提出來嗎?這樣不是直接訪問那個矩陣不就好了嗎? pytorch在存引數的時候, 其實就是給所有的weights bias之類的起個名字然後存在了乙個字典裡面.
不然你看看state_dict.keys(), 找到相對應的key拿出來就好了.
然後你說的慎用也是乙個很奇怪的問題啊..
就算用modules下面的class, 你存模型的時候因為你的activation function上面本身沒有引數, 所以也不會被存進去. 不然你可以試試在Sequential裡面把relu換成sigmoid, 你還是可以把之前存的state_dict給load回去.
不能說是慎用functional吧, 我覺得其他的設定是應該分開也存乙份的(假設你把這些當做超參的話)
利益相關: 給pytorch提過PR
pytorch中binary cross entropy損失函式中weight引數是如何設定的?
趙彤 首先我們看下BCEloss的計算公式 假設input x,target y,batch size N BCELoss x,y 其中M表示input中元素的個數,如果是二維影象,M height width 表示元素i求loss時所佔的比重。nn.BCELoss 函式中weight預設為None...
有用pytorch復現efficientDet的嗎
Zylo117 我.我根據官方的repository畫素級移植到了pytorch,有差異是正常的,畢竟底層實現不一樣,但op是完全一樣的.準確率什麼的也幾乎一樣,而且我的速度比tf原版快多了.想看中文解釋 吐槽 的,也可以看我的文章 Zylo Cheung 全網第一SoTA成績卻樸實無華的pytor...
TensorRT加速pytorch模型
唐悄悄 我個人是藝考生,按道理成績很差,事實原來也這樣,平時月考周考也才380分左右,全校兩百多名,但是,重點來了,我高考考了508,比本省二本線高了50多分。藝考回來後天天都在刷高考題,學校也天天做題考試,從乙個月一考到一月兩考,到一周一考,一周兩考,直到高考。所以呢,我的秘訣是 放平心態,多刷全...