pytorch - PyTorch loss() 和反向传播是否理解 lambda 层?
问题描述
我一直在使用此处提供的代码中的 resnet56 模型:https ://github.com/akamaster/pytorch_resnet_cifar10/blob/master/resnet.py 。
我注意到该实现与许多其他在线可用的 ResNet 示例不同,我想知道 PyTorch 使用 loss() 的反向传播算法是否可以解释提供的代码中的 lambda 层和快捷方式。
如果是这种情况,谁能提供有关 PyTorch 如何解释 lambda 层以进行反向传播的见解(即 PyTorch 如何知道如何区分层的操作)?
PS我还必须修改代码以适合我自己的用例,而且似乎我自己使用选项 == 'A' 的实现并没有产生很好的结果。这可能仅仅是因为 option == 'B' 使用卷积层而不是填充,更适合我的数据。
self.shortcut = nn.Sequential()
if stride != 1 or in_planes != planes:
if option == 'A':
top = (int) ((self.expansion*planes - in_planes) / 2)
bot = (self.expansion*planes - in_planes) - top
self.shortcut = LambdaLayer(lambda x:
F.pad(x[:, :, ::stride, ::stride], (0, 0, 0, 0, top, bot), "constant", 0))
解决方案
“我想知道 PyTorch 使用 loss() 的反向传播算法是否可以解释提供的代码中的 lambda 层和快捷方式。”
PyTorch 通过 lambda 函数进行反向传播没有问题。您的 LambdaLayer 只是将模块的前向传递定义为对 lambda 函数的评估,因此您的问题归结为 PyTorch 是否可以通过 lambda 函数反向传播。
“如果是这样的话,任何人都可以深入了解 PyTorch 如何解释 lambda 层以进行反向传播(即 PyTorch 如何知道如何区分层的操作)?”
lambda 函数在 x 上执行 torch.nn.functional.Pad 函数,我们可以通过它进行打包传播,因为它有一个定义的 backwards() 函数。
PyTorch 处理 lambda 函数的方式与 PyTorch 等 autodiff 工具处理任何函数的方式相同:它将其分解为原始操作,并使用每个原始操作的微分规则来构建整个计算的导数。
推荐阅读
- r - 不同的结果应用 geom_tile 而不是 heatmap
- php - SQLSTATE [23000]:完整性约束违规:1052 使用 laravel 连接
- bash - 使用 sed 检查和替换字母数字模式
- excel - Excel - 从基于非唯一条件的范围内返回多个唯一查询,即相似排名
- python - NLP ML 如何知道文本分类器中使用的词的权重?
- c# - 内联初始化多个实例#
- php - PHP中的目录列表
- angular - *ngIf 为 false 时组件不会被销毁
- reactjs - 渲染反应状态时将img src包装在“”中
- sql-server - 使用序列根据条件增加计数器