RuntimeError: Given groups=1, weight of size [64, 3, 7, 7], expected input[64, 500, 1000, 3] to have 3 channels, but got 500 channels instead
Tell me how to rectify the error
Tell me how to rectify the error
Permute your input as it seems you are trying to use a channels-last input image while channels-first is expected.
import torch
import torch.nn as nn
import torchvision.models as models
import torch.optim as optim
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
import os
import numpy as np
from PIL import Image
class ResNet18(nn.Module):
def init(self, num_classes=5):
super(ResNet18, self).init()
self.resnet18 = models.resnet18(pretrained=False)
in_features = self.resnet18.fc.in_features
self.resnet18.fc = nn.Linear(in_features, num_classes)
def forward(self, x):
return self.resnet18(x)
model = ResNet18(num_classes=5)
class CustomDataset(Dataset):
def init(self, root_dir):
self.root_dir = root_dir
self.images =
self.labels =
# Iterate over the folders and load the images and labels
for folder in os.listdir(root_dir):
folder_path = os.path.join(root_dir, folder)
for image_path in os.listdir(folder_path):
image = Image.open(os.path.join(folder_path, image_path))
# Convert to RGB format if necessary
if image.mode != 'RGB':
image = image.convert('RGB')
# Convert to torch tensor and keep only the first three channels
image = torch.from_numpy(np.array(image)[:, :, :3])
label = int(folder)
self.images.append(image)
self.labels.append(label)
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
image = self.images[idx]
return image, self.labels[idx]
dataset = CustomDataset(root_dir=r"C:\Users\KESA VARDHAN\Desktop\Output Folder")
print(“Data is loaded”)
train_size = int(0.8 * len(dataset))
val_size = int(0.1 * len(dataset))
test_size = len(dataset) - train_size - val_size
train_dataset, val_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, val_size, test_size])
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=64, shuffle=False)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
print(“Data is split”)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
for epoch in range(10):
for inputs, labels in train_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
# Update the optimizer parameters
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Evaluate the model on the validation set
with torch.no_grad():
val_loss = 0.0
val_acc = 0.0
for inputs, labels in val_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
val_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
correct = (predicted == labels).sum().item()
val_acc += correct / labels.size(0)
val_loss /= len(val_loader)
val_acc /= len(val_loader)
# Print the training and validation losses and accuracies
print('Epoch {}/{}: Train Loss {}, Val Loss {}, Train Acc {}, Val Acc {}'.format(
epoch + 1, 10, loss.item(), val_loss, val_acc, val_acc
))
with torch.no_grad():
test_loss = 0.0
test_acc = 0.0
for inputs, labels in test_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
test_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
correct = (predicted == labels).sum().item()
test_acc += correct / labels.size(0)
test_loss /= len(test_loader)
test_acc /= len(test_loader)
# Print the test loss and accuracy
print('Test Loss {}, Test Acc {}'.format(test_loss, test_acc))
torch.save(model.state_dict(), “trained_model.pt”)
here is my entire code can you please say what change should make to the code so that the data comes in 3 channel
Change this to:
def __getitem__(self, idx):
image = self.images[idx]
image = image.permute(0, 3, 1, 2)
return image, self.labels[idx]
Your images are of size (batch, height, width, channels) when the Conv2d layers take (batch, channels, height, width) by default. See here:
https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
Thank You I did help me run the code