0

我运行了一个关于图像无监督学习的模型。在图像进入学习之前,我正在执行各种数据增强,例如旋转、随机擦除、翻转等。但是,我还想根据它们的正态/高斯分布裁剪我的图像。我还在使用名为 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 的方法,所以任何指导都会有所帮助。

4

1 回答 1

0

是的,我也认为 torchvision 增强器很糟糕,我正在考虑编写我自己的操作火炬张量的东西。原因是,增强不能是纯随机的,而是均匀分布的。意味着,就像在每个时期一样,所有图像都以某个小角度旋转,然后再等等,也同样镜像、移动和添加微噪声。除了旋转之外的所有东西都非常容易实现,并且在旋转时,您可以计算位置并将其应用于所有数据集。我现在使用的是简单的移位方法,例如:

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

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

并使用 shuffle 数据集:

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

x_train = x_train[rnd_indexes] 

只是添加微音x_train + randn(...) * 0.001或其他东西

还懒得实施轮换。

于 2019-08-03T13:54:17.440 回答