Deep learning Pytoch CIFAR-10与Kaggle CIFAR-10:对于CIFAR-10上完全相同的体系结构,结果完全不同
我已经学习PyTorch几个星期了。当我练习使用PyTorch数据集的CIFAR-10数据集时,我还想到了使用ImageFolder类,因此我找到了Kaggle的CIFAR-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.45Deep 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附近,而后一个
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尝试这两种方法。然后我们就会知道,它是否会产生影响。