Точка 1.
НЕ вызывайте VGGLayers.predict()
, который не предназначен для вычисления backprop.
НЕ используйте VGGLayers.extract()
вместо.
Точка 2.
НЕ применяйте np.square()
и np.sum()
непосредственно к chainer.Variable
.
НЕ используйте F.square()
и F.sum()
вместо chainer.Variable
.
Точка 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