Non-deterministic behaviour during test time

Hi there,

I am running a very simple piece of code that loads an image with OpenCV, does some preprocessing and then applies a pre-trained alexnet. The problem is, that whenever I run that program, the results are significantly different. In the worst case, the wrong class is returned.

Here is the code:

import os
import numpy as np
import cv2

import torch
from torchvision.models.alexnet import alexnet
import torch.nn as nn

MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32)
STD  = np.array([0.229, 0.224, 0.225], dtype=np.float32)

########################################
# Load pytorch model
########################################
torch_model = alexnet(pretrained=True)


########################################
# Load and preprocess image
########################################
img = cv2.imread("PATH_TO_IMAGE.jpg", cv2.IMREAD_COLOR)
img = cv2.resize(img, (227, 227))
#cv2.imshow("image", img)


img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(np.float32) / 255.0
img = (img - MEAN) / STD


########################################
# Make image pytorch compatible
########################################
torch_img = np.transpose(img, [2, 0, 1])[np.newaxis, :, :, :]
torch_tensor = torch.from_numpy(torch_img)

print(torch_tensor.shape)


########################################
# Predict (pytorch)
########################################
torch_prediction = torch_model(torch_tensor)
torch_prediction = torch_prediction.detach().numpy()
print("Result pytorch:")
print("Top 10:", np.argsort(np.squeeze(torch_prediction))[-10:][::-1])
print(torch_prediction.shape)
print(np.squeeze(torch_prediction)[:20])

I can even put a loop around the prediction and get different results every iteration.

What am I missing?

PS: I know that I can do the preprocessing more easily using the torchvision functions :wink:, but I need to load the image in that way for a different purpose.

Never used alexnet but try adding torch_model.eval() before the torch_prediction = torch_model(torch_tensor) line.

That worked, thank you very much!