Deep learning Pytoch CIFAR-10与Kaggle CIFAR-10:对于CIFAR-10上完全相同的体系结构,结果完全不同

Deep learning Pytoch CIFAR-10与Kaggle CIFAR-10:对于CIFAR-10上完全相同的体系结构,结果完全不同,deep-learning,computer-vision,pytorch,dataloader,image-classification,Deep Learning,Computer Vision,Pytorch,Dataloader,Image Classification,我已经学习PyTorch几个星期了。当我练习使用PyTorch数据集的CIFAR-10数据集时,我还想到了使用ImageFolder类,因此我找到了Kaggle的CIFAR-10版本,其中的图像是折叠的。(我不记得PyTorch数据集是tar.gz格式的,而不是文件夹结构) 令我大吃一惊的是,尽管使用了相同的损失函数、学习率和体系结构,Kaggle数据集测试集的精度从0.18开始,PyTorch数据集的精度从0.56开始,在第1纪元。 最后,在20个时代之后,一个几乎饱和到0.45附近,而后一个

我已经学习PyTorch几个星期了。当我练习使用PyTorch数据集的CIFAR-10数据集时,我还想到了使用ImageFolder类,因此我找到了KaggleCIFAR-10版本,其中的图像是折叠的。(我不记得PyTorch数据集是tar.gz格式的,而不是文件夹结构)

令我大吃一惊的是,尽管使用了相同的损失函数、学习率和体系结构,Kaggle数据集测试集的精度从0.18开始,PyTorch数据集的精度从0.56开始,在第1纪元。

最后,在20个时代之后,一个几乎饱和到0.45附近,而后一个几乎固定在0.86附近。

我已经检查了一遍又一遍,但没有发现这两个代码有什么大的区别。 我真的很想知道,我是否犯了什么致命的错误,或者这两个数据集有什么根本不同的地方

为了澄清,我用了这个,还有这个。 代码太大,无法在此处提供,因此我为我的笔记本提供了l墨水,欢迎您查看我的全部代码,必要时也可以运行[您只需使用Kaggle API密钥从Kaggle下载数据集,我无法公开我的数据集…很抱歉这样做不方便] 及

我还提供了我认为大部分不同的代码块

Kaggle数据集: 第1纪元得分=0.18 第20纪元得分=0.45

from torch.utils.data import DataLoader

def createVal(train_list, root_folder, classes, valid_split ):
    try:
        os.mkdir(os.path.join(root_folder, 'val'))
    except FileExistsError:
        pass
    for cls in classes:
        try:
            os.mkdir(os.path.join(root_folder, 'val', cls))
        except FileExistsError:
            pass

    np.random.shuffle(train_list)

    valid_len = len(train_list) * valid_split
    for i in tqdm(range(int(valid_len))):
        shutil.move(train_list[i], train_list[i].replace('/train/', '/val/'))
    
valid_split = 0.2
batch_size = 32
num_workers = 4

root_folder = "/content/cifar10/cifar10"
train_folder = os.path.join(root_folder, "train")
test_folder = os.path.join(root_folder, "test")


if valid_split:
  createVal(train_list, root_folder, classes, valid_split = valid_split)

  val_folder = os.path.join(root_folder, "val")

  val_data = datasets.ImageFolder(val_folder, transform = transform)
  val_loader = DataLoader(val_data, batch_size = batch_size, num_workers = num_workers )

train_data = datasets.ImageFolder(train_folder, transform = transform)
train_loader = DataLoader(train_data, shuffle = True, batch_size = batch_size, num_workers = num_workers )

test_data = datasets.ImageFolder(test_folder, transform = transform)
test_loader = DataLoader(test_data, batch_size = batch_size, num_workers = num_workers )
valid_split = 0.2
batch_size = 32
num_workers = 4

if valid_split:
  num_train = len(train_data)
  idx = list(range(num_train))
  np.random.shuffle(idx)
  train_idx = idx[int(valid_split*num_train):]
  val_idx = idx[:int(valid_split*num_train)]

  train_sampler = SubsetRandomSampler(train_idx)
  val_sampler = SubsetRandomSampler(val_idx)

  train_loader = DataLoader(train_data, sampler = train_sampler, batch_size = batch_size, num_workers = num_workers )
  val_loader = DataLoader(train_data, sampler = val_sampler, batch_size = batch_size, num_workers = num_workers )
else:
  train_loader = DataLoader(train_data, batch_size = batch_size, num_workers = num_workers )

test_loader = DataLoader(test_data, batch_size = batch_size, num_workers = num_workers )
Pytorch数据集: 第1纪元得分=0.18 第20纪元得分=0.45

from torch.utils.data import DataLoader

def createVal(train_list, root_folder, classes, valid_split ):
    try:
        os.mkdir(os.path.join(root_folder, 'val'))
    except FileExistsError:
        pass
    for cls in classes:
        try:
            os.mkdir(os.path.join(root_folder, 'val', cls))
        except FileExistsError:
            pass

    np.random.shuffle(train_list)

    valid_len = len(train_list) * valid_split
    for i in tqdm(range(int(valid_len))):
        shutil.move(train_list[i], train_list[i].replace('/train/', '/val/'))
    
valid_split = 0.2
batch_size = 32
num_workers = 4

root_folder = "/content/cifar10/cifar10"
train_folder = os.path.join(root_folder, "train")
test_folder = os.path.join(root_folder, "test")


if valid_split:
  createVal(train_list, root_folder, classes, valid_split = valid_split)

  val_folder = os.path.join(root_folder, "val")

  val_data = datasets.ImageFolder(val_folder, transform = transform)
  val_loader = DataLoader(val_data, batch_size = batch_size, num_workers = num_workers )

train_data = datasets.ImageFolder(train_folder, transform = transform)
train_loader = DataLoader(train_data, shuffle = True, batch_size = batch_size, num_workers = num_workers )

test_data = datasets.ImageFolder(test_folder, transform = transform)
test_loader = DataLoader(test_data, batch_size = batch_size, num_workers = num_workers )
valid_split = 0.2
batch_size = 32
num_workers = 4

if valid_split:
  num_train = len(train_data)
  idx = list(range(num_train))
  np.random.shuffle(idx)
  train_idx = idx[int(valid_split*num_train):]
  val_idx = idx[:int(valid_split*num_train)]

  train_sampler = SubsetRandomSampler(train_idx)
  val_sampler = SubsetRandomSampler(val_idx)

  train_loader = DataLoader(train_data, sampler = train_sampler, batch_size = batch_size, num_workers = num_workers )
  val_loader = DataLoader(train_data, sampler = val_sampler, batch_size = batch_size, num_workers = num_workers )
else:
  train_loader = DataLoader(train_data, batch_size = batch_size, num_workers = num_workers )

test_loader = DataLoader(test_data, batch_size = batch_size, num_workers = num_workers )

我明白了,洗牌训练数据集的方法有所不同。 Kaggle数据集:列车装载机>随机播放=真 Pytorch数据集:火车装载机>无洗牌


当使用shuffle==True时,它将执行RandomSampler函数。

我明白了,对训练数据集进行随机洗牌的方法有所不同。 Kaggle数据集:列车装载机>随机播放=真 Pytorch数据集:火车装载机>无洗牌


当使用shuffle==True时,它将执行RandomSampler函数。

pytorch和kaggle数据集是否都已标准化?或者两者都未规范化?pytorch和kaggle数据集是否都已规范化?或者两者都没有标准化?这真的会使地图得分有那么大的差异吗?我看不到数据集或训练方法有任何差异。使用shuffle==True尝试这两种方法。然后我们就会知道,它是否会产生影响。这真的会使地图得分有那么大的差异吗?我看不到数据集或训练方法有任何差异。使用shuffle==True尝试这两种方法。然后我们就会知道,它是否会产生影响。