web-dev-qa-db-fra.com

Recherche de la moyenne et de l'écart type sur les canaux d'image PyTorch

Disons que j'ai un lot d'images sous la forme de tenseurs de dimensions (B x C x L x H) où B est la taille du lot, C est le nombre de canaux dans l'image, et W et H sont la largeur et la hauteur de l'image respectivement. Je cherche à utiliser la fonction transforms.Normalize() pour normaliser mes images par rapport à la moyenne et à l'écart type de l'ensemble de données sur les canaux d'image C , ce qui signifie que je veux un tenseur résultant sous la forme 1 x C. Existe-t-il un moyen simple de le faire?

J'ai essayé torch.view(C, -1).mean(1) et torch.view(C, -1).std(1) mais j'obtiens l'erreur:

view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

Modifier

Après avoir examiné comment view() fonctionne dans PyTorch, je sais pourquoi mon approche ne fonctionne pas; cependant, je n'arrive toujours pas à comprendre comment obtenir la moyenne et l'écart type par canal.

6
ch1maera

Notez que les écarts s'ajoutent, pas les écarts types. Voir l'explication détaillée ici: https://apcentral.collegeboard.org/courses/ap-statistics/classroom-resources/why-variances-add-and-why-it-matters

Voici le code modifié:

nimages = 0
mean = 0.0
var = 0.0
for i_batch, batch_target in enumerate(trainloader):
    batch = batch_target[0]
    # Rearrange batch to be the shape of [B, C, W * H]
    batch = batch.view(batch.size(0), batch.size(1), -1)
    # Update total number of images
    nimages += batch.size(0)
    # Compute mean and std here
    mean += batch.mean(2).sum(0) 
    var += batch.var(2).sum(0)

mean /= nimages
var /= nimages
std = torch.sqrt(var)

print(mean)
print(std)
3
debadeepta