本文介绍了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
|
my_transform = Transform(enc=(enc_str,enc_int))
|
- 子类化:
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
2
|
@MyTransform
def encodes(self, x: float): return f"float: {x}"
|
应用价值
- 图像处理:可视化模型输入/输出
- 文本处理:逆向标记化
- 时间序列:窗口重构
- 多模态数据:保持转换同步
安装方式:
1
|
pip install fasttransform
|