[Python] How can l solve the input data size problem of vcc16

Discussão em 'Python' iniciado por Stack, Março 30, 2025.

  1. Stack

    Stack Membro Participativo

    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

    Continue reading...

Compartilhe esta Página