Or an other idea would be to, at least, round the result when converting it to int. When you do tensor.to(int) or numpy.astype(int), the value is floored, witch can actually be the source of your problem. So I suggest this alternative:
from PIL import Image
from torchvision import transforms
import torch
import numpy as np

std_norm = torch.tensor([0.229, 0.224, 0.225])
mean_norm = torch.tensor([0.485, 0.456, 0.406])

preprocess = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean_norm, std_norm)])

def deprocess(img):
	img = img * std_norm.reshape((1, 3, 1, 1)) + mean_norm.reshape((1, 3, 1, 1))
	return img

import numpy as np
from PIL import Image

img = Image.open("your_image_here.png").convert('RGB')

img_np = np.float32(img)

for i in range(1000):
	img = preprocess(img)
	img = img.unsqueeze(0)
	img = deprocess(img).squeeze(0).permute(1,2,0).numpy()
	img = Image.fromarray(np.round(255.*img).astype(np.uint8))

	img.save("{0}.png".format(i))

Hope that helps!
Thomas