为了账号安全,请及时绑定邮箱和手机立即绑定

Chainer 中加载的神经网络层的梯度

Chainer 中加载的神经网络层的梯度

慕莱坞森 2021-08-05 10:33:17
我正在 Chainer 中加载一个预先训练的模型:net=chainer.links.VGG16Layers(pretrained_model='auto')然后,我使用一些数据进行前向传递并添加一个损失层:acts = net.predict([image]).array loss=chainer.Variable(np.array(np.sum(np.square(acts-one_hot))))现在的问题是,如何进行反向传播并获得不同层的梯度?典型的向后方法不起作用。
查看完整描述

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


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号