2 回答

TA贡献1827条经验 获得超9个赞
第 1 点。
不要调用VGGLayers.predict(),这不是用于反向传播计算。
请VGGLayers.extract()改用。
点2
不要申请np.square()和np.sum()直接chainer.Variable。
请使用F.square()andF.sum()代替 for chainer.Variable。
第三点
使用loss.backward(),以获得.grad对学得的参数。(模式1)
使用loss.backward(retain_grad=True),以获得.grad对所有变量。(模式2)
使用chainer.grad(),以获得.grad针对特定变量。(模式 3)
代码:
import chainer
from chainer import functions as F, links as L
from cv2 import imread
net = L.VGG16Layers(pretrained_model='auto')
img = imread("/path/to/img")
prob = net.extract([img], layers=['prob'])['prob'] # NOT predict, which overrides chainer.config['enable_backprop'] as False
intermediate = F.square(prob)
loss = F.sum(intermediate)
# pattern 1:
loss.backward()
print(net.fc8.W.grad) # some ndarray
print(intermediate.grad) # None
###########################################
net.cleargrads()
intermediate.grad = None
prob.grad = None
###########################################
# pattern 2:
loss.backward(retain_grad=True)
print(net.fc8.W.grad) # some ndarray
print(intermediate.grad) # some ndarray
###########################################
net.cleargrads()
intermediate.grad = None
prob.grad = None
###########################################
# pattern 3:
print(chainer.grad([loss], [net.fc8.W])) # some ndarray
print(intermediate.grad) # None
添加回答
举报