轉自:https://www.jianshu.com/p/73686691cf13python
下面是幾種常寫的方式app
normalize = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
transformList = []
transformList.append(transforms.RandomResizedCrop(transCrop))
transformList.append(transforms.RandomHorizontalFlip())
transformList.append(transforms.ToTensor())
transformList.append(normalize)
transformSequence = transforms.Compose(transformList)
train_augmentation = torchvision.transforms.Compose([torchvision.transforms.Resize(256),
torchvision.transforms.RandomCrop(224),
torchvision.transofrms.RandomHorizontalFlip(),
torchvision.transforms.ToTensor(),
torch vision.Normalize([0.485, 0.456, -.406], [0.229, 0.224, 0.225])
])
須要主要的是:dom
resize至關於對原來的圖像進行壓縮,大體的形狀是不發生變化的,也就是說能夠看到圖片的樣子
Crop是對圖片進行隨機的剪切,切出來的多是整個圖片的一部分,其中RandomCrop的操做更經常使用
RandomResizedCrop類也是比較經常使用, 總的來說就是先作crop,再resize到指定尺寸oop
這兩種操做以後,一張圖變成五張,一張圖變成十張,那麼在訓練或者測試的時候怎麼避免和標籤混淆呢
思路是,這多個圖擁有相同的標籤,假如是分類任務,就能夠使用交叉熵進行,而後求10張圖的平均測試
transform = Compose([
TenCrop(size), # this is a list of PIL Images
Lambda(lambda crops: torch.stack([ToTensor()(crop) for crop in crops])) # returns a 4D tensor
])
#In your test loop you can do the following:
input, target = batch # input is a 5d tensor, target is 2d
bs, ncrops, c, h, w = input.size()
result = model(input.view(-1, c, h, w)) # fuse batch size and ncrops
result_avg = result.view(bs, ncrops, -1).mean(1) # avg over crops