tricks in R

R语言中的全局变量与环境管理
本文探讨了R语言中使用全局变量的潜在风险,介绍了如何安全地使用全局赋值操作符<<-,并通过一个计算Fibonacci数的函数示例,展示了局部全局变量的使用方法。同时,文章强调了environment在R面向对象系统中的重要作用。

函数中给全局变量赋值

R里可以用<<-来进行全局赋值,比如我在解Project Euler 15题时,就用了<<-,这个最好还是不要用,用全局赋值可能会给你surprise,会给出惊喜的代码不是好代码。

当然所谓的全局和局部,都是相对的,主要看内存管理的实现方式,内存堆栈,在R里通过environment来实现,S中称之为frames。所谓的全局变量就是位于.GlobalEnv中而已。

所以如果要用<<-来进行全局赋值的话,安全的做法是使用局部的全局变量。如果要做个类比的话,这有点像C/C++里的静态变量。

比如下面这段计算fibonacci数的函数:

fibonacci <- local({
   memo <- c(1, 1, rep(NA, 20))
   f <- function(x) {
       if(x == 0) return(0)
       if(x < 0) return(NA)
       if(x > length(memo))
           stop("''x'' too big for implementation")
       if(!is.na(memo[x])) return(memo[x])
       ans <- f(x-2) + f(x-1)
       memo[x] <<- ans
       ans
   }
})

 

> fibonacci(15)
[1] 610
> get("memo", envir=environment(fibonacci))
 [1]   1   1   2   3   5   8  13  21  34  55  89 144 233 377 610
[16]  NA  NA  NA  NA  NA  NA  NA

environment是个好东西,我很惊讶于我看过的书里基本都没讲到。R的面向对象系统R5,就目前来看,是纯R实现的,用的就是S4和environment。

PS:S3面向对象就是加个class属性,通常用list来存储数据。我一直觉得,把数据存在封闭的environment里,再加个class属性,基本上就可以当成是个简易版的S4了,当然S4怎么实现,我并不清楚。

 

### Mask R-CNN 中 Stride Tricks 的使用方法及作用 在处理图像特征提取过程中,Mask R-CNN 利用了 stride tricks 来提高模型效率并保持精度。Stride tricks 主要用于卷积神经网络中的滑动窗口操作,通过调整步幅(stride)来控制感受野的移动方式。 #### 1. Stride Tricks 的定义与实现原理 当应用卷积核遍历输入张量时,可以通过设定不同的 strides 参数改变每次跳跃的距离。较小的 stride 值意味着更密集地采样局部区域的信息;而较大的 stride 可以减少计算成本,但可能会损失一些细节[^1]。 对于 Mask R-CNN 而言,在 ROIAlign 层之后会继续采用特定设计好的 striding 方案来进行后续的操作: - **降低分辨率**:为了加速推理过程以及减小内存占用,通常会在 backbone 后面增加下采样的层数(比如 ResNet 中每经过一次残差块就会缩小一半的空间维度)。此时如果仍然希望获得较高分辨率的结果,则可以在检测分支处适当放大输出尺度。 - **多尺度融合**:有时也会结合 FPN (Feature Pyramid Network) 结构,从多个层次抽取特征,并利用不同级别的 stride 设置让各部分更好地匹配目标物体的实际大小分布情况。 ```python import torch.nn as nn class DetectionHead(nn.Module): def __init__(self, in_channels=256, num_classes=80, feat_strides=[4, 8, 16]): super(DetectionHead, self).__init__() # 定义分类和回归子网... self.cls_subnet = ... self.reg_subnet = ... # 不同级别特征图对应的stride参数配置 self.feat_strides = feat_strides def forward(self, feats): cls_scores = [] bbox_preds = [] for i, feature_map in enumerate(feats): stride = self.feat_strides[i] # 应用相应strided convolution或其他变换... score = self.cls_subnet(feature_map) pred = self.reg_subnet(feature_map) cls_scores.append(score) bbox_preds.append(pred * stride) # 这里乘以当前层的stride return tuple(cls_scores), tuple(bbox_preds) ``` 上述代码片段展示了如何在一个简单的检测头模块中根据不同层级特征图设置相应的 stride 参数。注意最后一步对边界框预测结果进行了缩放补偿,这是因为原始坐标系是以最高分辨率为准的。 #### 2. 关键点检测中的应用 正如所提到的那样,Mask R-CNN 对于姿态估计任务也表现出色。在这个场景下,除了常规的目标定位外还需要精确捕捉人体关节位置。因此,在生成 mask 输出时同样考虑到了合适的 stride 配置,确保每个关键部位都能被准确定位而不受其他因素干扰。 综上所述,合理运用 stride tricks 不仅有助于提升 Mask R-CNN 性能表现,还能有效应对复杂多样化的视觉识别挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值