I'm trying to train pcam dataset in vcc 16 model, but I keep getting this error:
RuntimeError: Given groups=1, weight of size [96, 3, 3, 3], expected
input[256, 96, 3, 96] to have 3 channels, but got 96 channels instead.
I tried to change the amount of in channels into 3 to 96 becuase error messeage and chat gpt said that he number of channels in the input image had to be equal to the number of channels in the convolution layer, but it doesn't work.
import os
import torchvision.transforms as transforms
# Define the transform
transform = transforms.Compose([
transforms.ToTensor(), # Convert PIL image to PyTorch tensor
# Add other transforms as needed, like normalization
])
class HDF5Dataset(Dataset):
def __init__(self, image_h5_path, label_h5_path, transform=None):
self.image_h5_path = image_h5_path
self.label_h5_path = label_h5_path
self.transform = transform
# opening h5py file
with h5py.File(self.image_h5_path, "r") as img_file, h5py.File(self.label_h5_path,
"r") as lbl_file:
self.images = img_file["x"][:] # 이미지 데이터 로드
self.labels = lbl_file["y"][:] # 레이블 데이터 로드
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
image = self.images[idx]
label = self.labels[idx]
# (N, 32, 32, 3) -> (3, 32, 32) 변환
image = np.transpose(image, (2, 0, 1))
if self.transform:
image = self.transform(image)
return image, label
# defining dataset pathway
data_dir = "/root/.cache/kagglehub/datasets/andrewmvd/metastatic-tissue-classification-
patchcamelyon/versions/9"
image_dir = os.path.join(data_dir, "pcam")
label_dir = os.path.join(data_dir, "Labels", "Labels") # Labels/Labels로 수정
# loading train dataset
train_dataset = HDF5Dataset(
image_h5_path=os.path.join(image_dir, "training_split.h5"),
label_h5_path=os.path.join(label_dir, "camelyonpatch_level_2_split_train_y.h5"), # 수정
된 레이블 경로
transform=transform
)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
# loading validate dataset
val_dataset = HDF5Dataset(
image_h5_path=os.path.join(image_dir, "validation_split.h5"),
label_h5_path=os.path.join(label_dir, "camelyonpatch_level_2_split_valid_y.h5"), # 수정
된 레이블 경로 transform=transform ) val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False)
# loading test dataset
test_dataset = HDF5Dataset(
image_h5_path=os.path.join(image_dir, "test_split.h5"),
label_h5_path=os.path.join(label_dir, "camelyonpatch_level_2_split_test_y.h5"), # 수정
된 레이블 경로
transform=transform
)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# data size check
print(f"Train dataset size: {len(train_dataset)}")
print(f"Validation dataset size: {len(val_dataset)}")
print(f"Test dataset size: {len(test_dataset)}")
#train fuction
def train(net, partition, optimizer, criterion, args, device):
trainloader = torch.utils.data.DataLoader(partition['train'],
batch_size=args.train_batch_size,
shuffle=True, num_workers=2)
net.train()
correct = 0
total = 0
train_loss = 0.0
for i, data in enumerate(trainloader, 0):
optimizer.zero_grad()
# get the inputs and move to device
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device) # device로 이동
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
train_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
train_loss = train_loss / len(trainloader)
train_acc = 100 * correct / total
return net, train_loss, train_accenter code here
#validate function
def validate(net, partition, criterion, args, device):
valloader = torch.utils.data.DataLoader(partition['val'],
batch_size=args.test_batch_size,
shuffle=False, num_workers=2)
net.eval()
correct = 0
total = 0
val_loss = 0
with torch.no_grad():
for data in valloader:
images, labels = data
images, labels = images.to(device), labels.to(device) # device로 이동
outputs = net(images)
loss = criterion(outputs, labels)
val_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
val_loss = val_loss / len(valloader)
val_acc = 100 * correct / total
return val_loss, val_acc
#test function
def test(net, partition, args, device):
testloader = torch.utils.data.DataLoader(partition['test'],
batch_size=args.test_batch_size,
shuffle=False, num_workers=2)
net.eval()
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
images, labels = images.to(device), labels.to(device) # device로 이동
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
test_acc = 100 * correct / total
return test_acc
#experiment functon
def experiment(partition, args, device):
# 모델을 device로 이동
net = CNN(
in_channels = args.in_channels,
model_code=args.model_code,
hid_dim = args.hid_dim,
out_dim = args.out_dim,
act = args.act,
use_bn = args.use_bn).to(device) # 모델을 device로 이동
criterion = nn.CrossEntropyLoss()
if args.optim == 'SGD':
optimizer = optim.SGD(net.parameters(), lr=args.lr, weight_decay=args.l2)
elif args.optim == 'RMSprop':
optimizer = optim.RMSprop(net.parameters(), lr=args.lr, weight_decay=args.l2)
elif args.optim == 'Adam':
optimizer = optim.Adam(net.parameters(), lr=args.lr, weight_decay=args.l2)
else:
raise ValueError('In-valid optimizer choice')
train_losses = []
val_losses = []
train_accs = []
val_accs = []
for epoch in range(args.epoch): # loop over the dataset multiple times
ts = time.time()
# Train 단계에서 데이터를 device로 이동
net, train_loss, train_acc = train(net, partition, optimizer, criterion, args,
device)
# Validation 단계에서 데이터를 device로 이동
val_loss, val_acc = validate(net, partition, criterion, args, device)
te = time.time()
train_losses.append(train_loss)
val_losses.append(val_loss)
train_accs.append(train_acc)
val_accs.append(val_acc)
print('Epoch {}, Acc(train/val): {:2.2f}/{:2.2f}, Loss(train/val) {:2.2f}/{:2.2f}.
Took {:2.2f} sec'.format(epoch, train_acc, val_acc, train_loss, val_loss, te-ts))
test_acc = test(net, partition, args, device)
result = {}
result['train_losses'] = train_losses
result['val_losses'] = val_losses
result['train_accs'] = train_accs
result['val_accs'] = val_accs
result['train_acc'] = train_acc
result['val_acc'] = val_acc
result['test_acc'] = test_acc
return vars(args), result
# save files
import hashlib
import json
from os import listdir
from os.path import isfile, join
import pandas as pd
def save_exp_result(setting, result):
exp_name = setting['exp_name']
del setting['epoch']
del setting['test_batch_size']
hash_key = hashlib.sha1(str(setting).encode()).hexdigest()[:6]
filename = './results/{}-{}.json'.format(exp_name, hash_key)
result.update(setting)
with open(filename, 'w') as f:
json.dump(result, f)
def load_exp_result(exp_name):
dir_path = './results'
filenames = [f for f in listdir(dir_path) if isfile(join(dir_path, f)) if '.json' in f]
list_result = []
for filename in filenames:
if exp_name in filename:
with open(join(dir_path, filename), 'r') as infile:
results = json.load(infile)
list_result.append(results)
df = pd.DataFrame(list_result) # .drop(columns=[])
return df
seed = 123
np.random.seed(seed)
torch.manual_seed(seed)
# ====== Device setting ====== #
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
parser = argparse.ArgumentParser()
args = parser.parse_args("")
args.exp_name = "exp1_lr_model_code"
# ====== Model ====== #
args.in_channels = 3
args.out_dim = 10
args.hid_dim = 3
args.act = 'relu'
args.model_code = 'VGG16' # Add model_code to args
# ====== Regularization ======= #
args.l2 = 0.00001
args.use_bn = True
# ====== Optimizer & Training ====== #
args.optim='RMSprop' # 'RMSprop', 'SGD', 'ADAM', etc.
args.lr = 0.0015
args.epoch = 2
args.train_batch_size = 256
args.test_batch_size = 512
# ====== Experiment Variable ====== #
name_var1 = 'lr'
name_var2 = 'optim'
list_var1 = [0.0001, 0.00001]
list_var2 = ['SGD', 'ADAM']
partition = {
'train': train_dataset, # Replace with your actual training dataset
'val': val_dataset, # Replace with your actual validation dataset
'test': test_dataset # Replace with your actual testing dataset
}
# Experiment 반복문
for var1 in list_var1:
for var2 in list_var2:
setattr(args, name_var1, var1)
setattr(args, name_var2, var2)
print(args)
# experiment 함수 호출 시 device를 전달
setting, result = experiment(partition, deepcopy(args), device)
save_exp_result(setting, result)
The problem was in this last part of the code