ValueError: array split does not result in an equal division, during training model

I am attempting to training model using VIT to classify some images. During training the script stuck and I don't know where is my error. The classification features by some images with only two target 0 and 1 (false and true). The batch size is 32 and epochs are only 3.

Below I put the script for training model:

import torch.utils.data as data from torch.autograd import Variable import numpy as np train_loader = data.DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True, num_workers=2) test_loader = data.DataLoader(test_ds, batch_size=BATCH_SIZE, shuffle=True, num_workers=2) # Train the model for epoch in range(EPOCHS): for step, (x, y) in enumerate(train_loader): # Change input array into list with each batch being one element x = np.split(np.squeeze(np.array(x)), BATCH_SIZE) # Remove unecessary dimension for index, array in enumerate(x): x[index] = np.squeeze(array) # Apply feature extractor, stack back into 1 tensor and then convert to tensor x = torch.tensor(np.stack(feature_extractor(x)['pixel_values'], axis=0)) # Send to GPU if available x = x.to(device) y = y.to(device) b_x = Variable(x) # batch x (image) b_y = Variable(y) # batch y (target) # Feed through model output = model(b_x, None) loss = output[0] # Calculate loss if loss is None: loss = loss_func(output, b_y) optimizer.zero_grad() loss.backward() optimizer.step() if step % 50 == 0: # Get the next batch for testing purposes test = next(iter(test_loader)) test_x = test[0] # Reshape and get feature matrices as needed test_x = np.split(np.squeeze(np.array(test_x)), BATCH_SIZE) for index, array in enumerate(test_x): test_x[index] = np.squeeze(array) test_x = torch.tensor(np.stack(feature_extractor(test_x)['pixel_values'], axis=0)) # Send to appropirate computing device test_x = test_x.to(device) test_y = test[1].to(device) # Get output (+ respective class) and compare to target test_output, loss = model(test_x, test_y) test_output = test_output.argmax(1) # Calculate Accuracy accuracy = (test_output == test_y).sum().item() / BATCH_SIZE print('Epoch: ', epoch, '| train loss: %.4f' % loss, '| test accuracy: %.2f' % accuracy) 

The error message is this: ValueError: array split does not result in an equal division. And it highlights the comand x = np.split(np.squeeze(np.array(x)), BATCH_SIZE).

1 Answer

I recently came across the same error. Check with the length of the train_ds. and change the BATCH_SIZE so that when you divide the len(train_ds) by BATCH_SIZE the reminder is zero.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like