第 1 点。
不要调用VGGLayers.predict()
,这不是用于反向传播计算的。
请改用VGGLayers.extract()
。
第 2 点。
不要np.square()
直接np.sum()
申请chainer.Variable
。
请使用F.square()
andF.sum()
代替chainer.Variable
.
Point 3.
用于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