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.
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)