fasttransform:可逆数据转换管道技术解析

本文介绍了fasttransform库如何通过多重分派技术实现可逆数据转换管道,解决机器学习中数据预处理和逆向转换的痛点,提升模型调试和数据分析效率。

fasttransform:可逆数据转换管道技术解析

问题1:单向转换困境

传统机器学习管道中的单向转换导致数据调试困难:

1
2
3
4
5
6
7
from torchvision import transforms as T
transforms_pt = T.Compose([
    T.Resize(256),
    T.CenterCrop(224),
    T.ToTensor(),
    T.Normalize(*imagenet_stats)
])

逆向转换需要手动编写解码函数:

1
2
3
4
def decode_pt(tensor, mean, std):
    out = tensor.clone()
    for t, m, s in zip(out, mean, std): t.mul_(s).add_(m)
    return out.mul(255).clamp(0, 255).byte()

解决方案:可逆管道

fasttransform通过Transform类实现双向转换:

1
2
3
4
5
6
7
class Normalize(Transform):
    def __init__(self, mean=None, std=None):
        self.mean = mean
        self.std = std
        
    def encodes(self, x): return (x-self.mean) / self.std
    def decodes(self, x): return x*self.std + self.mean

使用示例:

1
2
3
4
5
6
transforms_ft = Pipeline([
   PILImage.create,
   Resize(256,method="squish"),
   Normalize.from_stats(*imagenet_stats)
])
img_decoded = transforms_ft.decode(img_transformed)

问题2:多类型处理

传统方法需要维护多个独立管道:

1
2
3
4
class CustomImageDataset(Dataset):
    def __init__(self, transform=None, target_transform=None):
        self.transform = transform
        self.target_transform = target_transform

解决方案:多重分派技术

fasttransform通过多重分派实现统一管道:

1
2
3
4
5
6
7
class StrCategorize(Transform):
    def __init__(self, vocab):
        self.vocab = vocab
        self.s2i = {s:i for i,s in enumerate(vocab)}
        
    def encodes(self, s:str): return self.s2i[s]
    def decodes(self, i:int): return self.vocab[i]

图像分割应用示例:

1
2
3
4
5
6
transforms_ft = Pipeline([
   load_img_msk,
   RandomResizedCrop(200),  # 同时应用于图像和掩码
   ToTensor(),              # 同时应用于图像和掩码
   Normalize.from_stats(*imagenet_stats)  # 仅应用于图像
])

技术实现:多重分派

基于plum库实现类型感知路由:

1
2
3
4
5
6
7
from plum import dispatch

@dispatch
def greet(a: Cat, b: Dog): return "Hiss!"

@dispatch
def greet(a: Dog, b: Cat): return "Grrrr..."

Transform类扩展方式:

  1. 直接函数注入:
1
my_transform = Transform(enc=(enc_str,enc_int))
  1. 子类化:
1
2
3
class MyTransform(Transform):
    def encodes(self, x:str): return f"str: {x}"
    def encodes(self, x:int): return f"int: {x}"
  1. 装饰器扩展:
1
2
@MyTransform
def encodes(self, x: float): return f"float: {x}"

应用价值

  • 图像处理:可视化模型输入/输出
  • 文本处理:逆向标记化
  • 时间序列:窗口重构
  • 多模态数据:保持转换同步

安装方式:

1
pip install fasttransform
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计