I am trying to evaluate my model and find that I get different results while using bs=1 and bs=2(the length of test set is odd so there shouldn’t be any problem about truncature).
I looked up other topics and still failed to solve my problem.
The dataset is MNIST in csv format, I also uploaded it to OneDrive(15MB)
Here is my code:
import pandas as pd
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torch.nn.functional as F
from sklearn.utils import shuffle
import cv2
import numpy as np
import random
import matplotlib.pyplot as plt

device=torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

#===================Building Model===================
class Flatten(nn.Module):
    def __init__(self):
        super(Flatten, self).__init__()
        
    def forward(self, x):
        return x.view(x.size(0), -1)
    
class Softmax(nn.Module):
    def __init__(self):
        super(Softmax, self).__init__()
        
    def forward(self, x):
        return F.log_softmax(x)

class CNN(nn.Module):
    def __init__(self, sz=28, nf=64):
        super(CNN, self).__init__()
        self.model=nn.Sequential(*[
            nn.Conv2d(1, nf, 4, 2, 1), nn.BatchNorm2d(nf), nn.LeakyReLU(0.2, True),
            nn.Conv2d(nf, nf*2, 4, 2, 1), nn.BatchNorm2d(nf*2), nn.LeakyReLU(0.2, True),
            nn.Conv2d(nf*2, nf*4, 3, 1, 0), nn.BatchNorm2d(nf*4), nn.LeakyReLU(0.2, True),
            Flatten(), nn.Linear(5*5*nf*4, 10), Softmax(),
        ])
        
    def forward(self, x):
        return self.model(x)

model=CNN().to(device)

===================Loading data===================
train_data=pd.read_csv("./data/train.csv")
test_data=pd.read_csv("./data/test.csv")

X_train=train_data.values[:, 1:]
Y_train=train_data.values[:, 0:1]
X_test_all, X_train_all = np.split(X_train, [5000], axis=0)
Y_test_all, Y_train_all = np.split(Y_train, [5000], axis=0)

===================Measuring===================
def measure(model, X_test, Y_test, bs=1):
    model.eval()
    batch_size=bs
    accuracy=0.0
    
    for st in range(0, len(Y_test)//batch_size):
        X_batch, Y_batch=X_test[st:st+batch_size], Y_test[st:st+batch_size]
        model.zero_grad()
        model.eval()
        X_batch=X_batch.reshape([X_batch.shape[0],1]+[28,28])
        X_batch=torch.tensor(X_batch).type(torch.FloatTensor)/255.0
        Y_batch=torch.tensor(Y_batch).type(torch.LongTensor).squeeze(1)
        X_batch, Y_batch=X_batch.to(device), Y_batch.to(device)
        predict=model(X_batch)
        predict=predict.max(1)[1]
        accuracy+=predict.eq(Y_batch).double().sum().item()
    
    return accuracy/len(Y_test)

print(len(Y_test_all))
print(measure(model, X_test_all, Y_test_all, 2))
print("===================================")
print(measure(model, X_test_all, Y_test_all))

And it turns out the accuracy is 0.0636 when batch size is set to 2, and 0.0674 when batch size is set to 1.