Compose函数作用

一:使用compose函数简化写法

function compose() {
    for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
        funcs[_key] = arguments[_key];
    }

    if (funcs.length === 0) {
        return function(arg) {
            return arg;
        };
    }

    if (funcs.length === 1) {
        return funcs[0];
    }

    return funcs.reduce(function(a, b) {
        console.log(a,b)
        return function() {
            return a(b.apply(undefined, arguments));
        };
    });
}

function func1(num) {
  console.log('func1 获得参数 ' + num);
  return num + 1;
}

function func2(num) {
  console.log('func2 获得参数 ' + num);
  return num + 2;
}

function func3(num) {
  console.log('func3 获得参数 ' + num);
  return num + 3;
}

var re1 = func3(func2(func1(0)));
console.log('re1:' + re1);

var re2 = compose(func3, func2, func1)(0);
console.log('re2:' + re2);
复制代码

二:使用compose函数生成闭包,实现中间件功能

function compose() {
    for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
        funcs[_key] = arguments[_key];
    }

    if (funcs.length === 0) {
        return function(arg) {
            return arg;
        };
    }

    if (funcs.length === 1) {
        return funcs[0];
    }

    return funcs.reduce(function(a, b) {
        console.log(a,'----',b)
        console.log('------')
        return function() {
            return a(b.apply(undefined, arguments));
        };
    });
}

let say = function(){
    console.log(0000)
}

function func1(func) {
  return function(){
      console.log(1111)
      func()
      console.log(1111)
  }
}

function func2(func) {
  return function(){
      console.log(2222)
      func()
      console.log(2222)
  }
}

function func3(func) {
  return function(){
      console.log(3333)
      func()
      console.log(3333)
  }
}

// var re1 = func3(func2(func1(0)));
// console.log('re1:' + re1);

var strongSay = compose(func3, func2, func1)(say);
strongSay()
复制代码

实际上就是做了这么一件事: func1,func2,func3都接收func这个形参,而func这个参数由于会被使用,所以会一直以闭包的形式保存在内存中,也就是说func1,func2,func3会一直存在在内存中,func1接收到的是say,func2接收到的是func1,func3接收到的是func2。

### torchvision库中Compose函数的用法 `torchvision.transforms.Compose` 是一个非常重要的类,它允许用户将多个图像转换操作组合在一起形成一个流水线。通过这种方式,可以在数据预处理阶段轻松应用一系列复杂的变换操作。 #### Compose函数作用 `Compose` 接受一个由各种 `Transform` 对象组成的列表作为参数,并依次执行这些变换操作[^1]。最终返回经过所有指定变换后的结果。 #### 使用场景 在机器学习特别是深度学习领域,为了提高模型泛化能力或解决过拟合问题,经常会对训练样本做增强(augmentation),比如调整亮度、对比度、饱和度、色调等属性;又或者是几何上的改变如翻转、缩放和平移等等。而 `Compose` 正是用来串联起这些独立却又相互关联的操作的理想工具之一[^3]。 下面给出几个具体例子展示如何利用 `transforms.Compose()` 来创建自定义的数据预处理器: --- ### 示例代码 #### 基础示例:标准化与张量化 最简单的案例就是把一张普通的 PIL 图片转化为适合送入神经网络计算的形式(即 PyTorch Tensor),同时还对其进行全局均值方差归一化处理。 ```python from torchvision import transforms data_transform = transforms.Compose([ transforms.ToTensor(), # 转换为tensor类型 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 标准化 ]) ``` 在这个例子里面我们首先调用了 `ToTensor`, 这一步会自动将范围处于 `[0-255]` 的 uint8 数组映射到浮点数区间 `[0.-1.]`; 随后借助 `Normalize` 方法完成颜色通道级别的中心化和尺度缩小工作以便后续优化器更快收敛[^2]. --- #### 复杂一点的例子:随机水平翻转 + 缩放裁切 + 张量化 当面对更加棘手的任务时,可能就需要更精细的设计方案了。例如我们可以设置一定的几率让每幅图都有机会被左右颠倒显示出来从而增加多样性; 同样也可以规定好固定的尺寸大小再从中截取出感兴趣的部分区域最后才交给 GPU 计算单元继续下一步骤: ```python random_horizontal_flip_and_resize_crop = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转,概率设为0.5 transforms.Resize((256, 256)), # 改变分辨率至固定宽高256x256像素 transforms.CenterCrop(224), # 从中间位置切割出边长等于224px的小正方形框 transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225]), ]) ``` 在这里除了前面提到过的两个基本组件之外新增加了一个叫做 `RandomHorizontalFlip` 的成员负责控制是否应该按照给定的比例尝试镜像反射原图内容。紧接着又是另一个叫作 `Resize` 的家伙出场亮相啦~ 它的主要职责便是重新规划整个画面布局使其满足特定的要求规格。紧随其后的则是大家熟悉的面孔 —— `CenterCrop`. 当然还有其他类似的替代品可供选择比如说 RandomResizedCrop 等等都可以达到类似的效果只不过实现细节略有区别罢了[^3]. --- ### 更高级的应用实例:链式调用多种复杂变换 有时候单单依靠上面介绍的内容还不够充分表达我们的想法怎么办呢?没关系!只要合理安排顺序再加上一点点创造力就能创造出无限的可能性咯~ ```python complex_augmentations_pipeline = transforms.Compose([ transforms.ColorJitter(brightness=.5,hue=.3), transforms.RandomAffine(degrees=(-15,+15)), transforms.GaussianBlur(kernel_size=(5,9),sigma=(0.1,.5)), transforms.RandomPerspective(distortion_scale=0.6,p=0.5), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225]), ]) ``` 这段脚本展示了四种全新的技巧分别是调节色彩鲜艳程度(Color Jittering); 施行仿射变形(Random Affine Transformation); 添加模糊效果(Gaussian Blurring)以及模拟透视投影变化(Random Perspective Warping)[^2]. --- ### 注意事项 虽然说有了这么强大的武器可以帮助我们更好地准备实验材料但是也要注意不要滥用哦! 因为过度依赖人工干预反而可能导致原本应有的统计规律遭到破坏进而影响到最后预测性能的好坏优劣。因此建议始终遵循最小必要原则谨慎挑选那些真正有助于提升表现力的关键要素即可[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值