基于Pytorch的正态分布数据变换裁剪

2024-10-03 19:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我运行了一个图像无监督学习模型。在图像开始学习之前,我正在执行各种数据增强,例如旋转、随机擦除、翻转等。但是,我也想根据图像的正态/高斯分布来裁剪图像。我还使用了名为Augmentator的外部库,它也没有基于正态分布的裁剪。它基本上只是随机中心或者只是随机的。你知道吗

我所有的转换都会进入这样一个列表:

transforms_ = [
transforms.Grayscale(num_output_channels=1),
# transforms.Resize(int(img_height * 1.12), Image.BICUBIC),
transforms.RandomCrop(img_height, img_width), #this has to be based on normal distribution of the image
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
# transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
# transforms.Normalize((0.5,), (0.5,)), # greyscale normalisation 
]

非常感谢您的帮助。我发现没有外部库可以这样做,如果我必须自己实现它,我需要一种方法来集成到Pytorch中,这样任何指导都会有所帮助。你知道吗


Tags: 数据模型图像列表imgoutput中心num
1条回答
网友
1楼 · 发布于 2024-10-03 19:24:22

是的,我也认为torchvision增强器不好,我正在考虑写我自己的什么操作torch张量。原因是,增广不能是纯随机的,而是均匀分布的。意思是,像在每一个时代,所有的图像都在某个小角度上旋转,然后再旋转,等等,同样的镜像,移动和添加镜像。除rotate之外的所有方法都很容易实现,在rotate期间,您可以计算一个位置并将其应用于所有数据集。 我现在用的是简单的移位法,比如:

def shift_2d_last(self, tensor, distanc_forlast, distance_last):

if distanc_forlast == 0 and distance_last == 0:
    return tensor

moved_tensor = torch.zeros_like(tensor)

last_dim_size = tensor.size(-1)
forlast_dim_size = tensor.size(-2)

begin_to1, end_to1, begin_from1, end_from1 = self.shift_bounds(distance_last, last_dim_size) 

begin_to2, end_to2, begin_from2, end_from2 = self.shift_bounds(distanc_forlast, forlast_dim_size) 


moved_tensor[:,:, begin_to2:end_to2, begin_to1:end_to1] = tensor[: ,: ,begin_from2:end_from2,begin_from1: end_from1 ]


return   moved_tensor  

在哪里

    def shift_bounds(self, distance, last_size):
    if distance < 0:
        return 0, last_size + distance , -distance, last_size

    return distance, last_size , 0, last_size -distance

用Pytork flip进行镜像: https://pytorch.org/docs/stable/torch.html?highlight=flip#torch.flip

并使用以下内容洗牌数据集:

rnd_indexes = torch.randperm(x_train.size(0),device=device )

x_train = x_train[rnd_indexes] 

添加micronoice只是x_train + randn(...) * 0.001或者别的什么

太软了,还不能旋转。你知道吗

相关问题 更多 >