查找关于输入的Caffe转换滤波器的梯度

查找关于输入的Caffe转换滤波器的梯度,第1张

查找关于输入的Caffe转换滤波器的梯度

Caffe网玩杂了两个“数字流”。
第一个是数据“流”:通过网络推送的图像和标签。当这些输入通过网络进行时,它们将转换为高级表示,并最终转换为类概率向量(在分类任务中)。
第二个“流”保存不同层的参数,卷积的权重,偏差等。在网络的训练阶段更改并获知这些数字/权重。

尽管这两个“流”扮演的角色根本不同,但是caffe使用相同的数据结构

blob
来存储和管理它们。
但是,对于每一层,有两个 不同的 斑点矢量,每个流一个。

我希望可以阐明以下示例:

import caffesolver = caffe.SGDSolver( PATH_TO_SOLVER_PROTOTXT )net = solver.net

如果你现在看

net.blobs

您将看到一个字典,该字典为网络中的每一层存储一个“ caffe blob”对象。每个Blob都有用于数据和梯度的存储空间

net.blobs['data'].data.shape    # >> (32, 3, 224, 224)net.blobs['data'].diff.shape    # >> (32, 3, 224, 224)

对于卷积层:

net.blobs['conv1/7x7_s2'].data.shape    # >> (32, 64, 112, 112)net.blobs['conv1/7x7_s2'].diff.shape    # >> (32, 64, 112, 112)

net.blobs
保持第一个数据流,它的形状与输入图像的形状匹配,直到生成的类概率向量。

另一方面,您可以看到

net

net.layers

这是一个存储不同层参数的Caffe向量。
看第一层(

'data'
layer):

len(net.layers[0].blobs)    # >> 0

没有要为输入层存储的参数。
另一方面,对于第一卷积层

len(net.layers[1].blobs)    # >> 2

网络存储一个Blob用于滤波器权重,另一个Blob用于恒定偏差。他们来了

net.layers[1].blobs[0].data.shape  # >> (64, 3, 7, 7)net.layers[1].blobs[1].data.shape  # >> (64,)

如您所见,该层在3通道输入图像上执行7x7卷积,并具有64个这样的滤镜。

现在,如何获得渐变?好,正如您所指出的

diffs = net.backward(diffs=['data','conv1/7x7_s2'])

返回 数据 流的梯度。我们可以通过验证

np.all( diffs['data'] == net.blobs['data'].diff )  # >> Truenp.all( diffs['conv1/7x7_s2'] == net.blobs['conv1/7x7_s2'].diff )  # >> True

TL; DR )您想要参数的梯度,这些

net.layers
与参数一起存储在中:

net.layers[1].blobs[0].diff.shape # >> (64, 3, 7, 7)net.layers[1].blobs[1].diff.shape # >> (64,)

为了帮助您在图层名称及其索引之间映射到

net.layers
矢量,可以使用
net._layer_names


更新 关于使用梯度来可视化滤波器响应:
梯度通常用于定义 标量 函数。损失是一个标量,因此您可以说像素/滤镜权重相对于标量损失的梯度。该梯度是每个像素/滤镜权重的一个数字。
如果要获得最大程度激活 特定
内部隐藏节点的输入,则需要一个“辅助”网,其损失恰好是要可视化特定隐藏节点的激活的量度。一旦有了该辅助网,就可以从任意输入开始,并根据辅助损耗到输入层的梯度来更改此输入:

update = prev_in + lr * net.blobs['data'].diff


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5639704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存