Dataloader读取文件夹图片,创建字典,train和val

1.创建transform的字典

1.输入为PIL的图像(array也行),转换为Tensor (0—255的[H,W,C] —> 0~1 的 [C,H,W])
2. compose将多个变换组合起来
3.

data_transforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(input_size),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(input_size),
        transforms.CenterCrop(input_size),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

2.读取文件夹路径

image_datasets是一个字典

root
里面使用了ImageFolder类,这个里面还有transform方法

实例化对象

第一个参数为“root
第二个为"transform"

data_dir = "./data/hymenoptera_data"

# Create training and validation datasets
# ImageFoler类的构造函数,先有文件名读取,再进行transform操作,前面定义过data_transforms
"""A generic data loader where the images are arranged in this way """
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}
# Create training and validation dataloaders
dataloaders_dict = {
    x: DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=0) for x in
    ['train', 'val']}

# Send the model to GPU

3.训练

  1. 因为在封装的函数中,传递的实参dataloader[phase] ,这里是一个字典
  2. 这个len ,len(dataloaders[phase].dataset) 这里的参数
  3. 注意如何保存训练过程中的最佳参数列表
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()  # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, labels in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)

                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                # ()参数为True则打开梯度,为False则关闭梯度
                with torch.set_grad_enabled(phase == 'train'):
	                if is_inception and phase == 'train':
	                    outputs, aux_outputs = model(inputs)
	                    loss1 = criterion(outputs, labels)
	                    loss2 = criterion(aux_outputs, labels)
	                    loss = loss1 + 0.4 * loss2
	                else:
	                    outputs = model(inputs)
	                    loss = criterion(outputs, labels)
	                    
	                _, preds = torch.max(outputs, 1)
	
	                if phase == 'train':
	                    loss.backward()
	                    optimizer.step()

                # statistics
	            running_loss += loss.item() * inputs.size(0)
	            running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / len(dataloaders[phase].dataset)
            epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)

            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))

            # deep copy the model
            if phase == 'val' and epoch_acc > best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
            if phase == 'val':
                val_acc_history.append(epoch_acc)

        print()

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))

    # load best model weights
    model.load_state_dict(best_model_wts)
             

4. 加载预训练模型后再更改输出层

	model_ft = None
    input_size = 0

    if model_name == "resnet":
        """ Resnet18
        已经把参数导入了,相当于直接保存
        """
        model_ft = models.resnet18(pretrained=use_pretrained)
        """下面的函数,是在上面声明了的,直接冻结所有的变量梯度"""
        set_parameter_requires_grad(model_ft, feature_extract)
        """ 更改输出层 """
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要训练 Tiny ImageNet 数据集,需要使用 DataLoader 读取图片集并训练网络。下面是一个示例代码,可以作为参考: ```python import torch import torchvision import torchvision.transforms as transforms # 定义数据转换 transform_train = transforms.Compose([ transforms.RandomResizedCrop(size=64, scale=(0.8, 1.0)), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) transform_test = transforms.Compose([ transforms.Resize(size=64), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 使用 DataLoader 加载数据集 trainset = torchvision.datasets.ImageFolder(root='./tiny-imagenet-200/train', transform=transform_train) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=4) testset = torchvision.datasets.ImageFolder(root='./tiny-imagenet-200/val', transform=transform_test) testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=4) # 定义模型 model = YourModel() # 定义损失函数和优化器 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(num_epochs): for i, (images, labels) in enumerate(trainloader): # 前向传播 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(trainloader), loss.item())) # 测试模型 model.eval() with torch.no_grad(): correct = 0 total = 0 for images, labels in testloader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the test images: {} %'.format(100 * correct / total)) ``` 在上面的示例代码中,我们使用了两个数据转换:一个用于训练集,一个用于测试集。训练集的数据转换包括随机裁剪、随机翻转和颜色抖动等增强操作,测试集的数据转换只包括调整大小和归一化操作。 接着,我们使用 DataLoader 加载 Tiny ImageNet 数据集,并定义了模型、损失函数和优化器。在训练循环中,我们首先进行前向传播和计算损失,在反向传播和优化之后,每 100 个批次打印一次损失。在测试循环中,我们使用训练好的模型对测试集进行预测,并计算模型的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值