Kaggle树叶分类Leaves Classify总结

if __name__ == '__main__':

# 启动 visdom

     visdom = Visdom()

     # 创建一个 (0, 0) 作为起点, window id 作为 'train_loss' ,标题为 train loss 的窗口

     visdom.line(Y=[0], X=[0], win='train_loss', opts=dict(title='train loss'))

     # 创建一个 (0, 0) 作为起点, window id 作为 'accuracy' ,标题为 accuracy 的窗口

     visdom.line(Y=[0], X=[0], win='accuracy',  opts=dict(title='accuracy', legend=['train accuracy', 'valid accuracy']))

######################################################################

# 不使用迁移学习,

     isPreTrained = False

     net = resnest50(pretrain=isPreTrained)

     if isPreTrained:

         net.load_state_dict(torch.load('ModelPath'))

         # 冻结所有层的梯度计算

         for name, parameter in net.named_parameters():

         parameter.requires_grad = False

         # 重定义全连接层后 requires_grad 自动为 True

         net.fc = nn.Linear(net.fc.in_features, nClass)

######################################################################

     trainTransform = transforms.Compose([

         # 随机拉伸并裁切 224x224 大小的图片

         transforms.RandomResizedCrop(size=224, scale=[0.64, 1.0], ratio=[1.0, 1.0]),

         # 随机水平翻转

         transforms.RandomHorizontalFlip(p=0.5),

         # 随机垂直翻转

         transforms.RandomVerticalFlip(p=0.5),

         # # 随机锐化

         # transforms.RandomAdjustSharpness(sharpness_factor=10),

         # # 随机曝光

         # transforms.RandomSolarize(threshold=0.3),

         # # 随机更改亮度,对比度和饱和度

         # transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4),

         # 随机应用下列 transform

         transforms.RandomApply([

            transforms.RandomRotation([-45,45], fill=[255, 255, 255]),

             # 仿射变换

            transforms.RandomAffine(degrees=[-30,30], translate=[0, 0.2], scale=[0.8, 1], fill=[255, 255, 255]),

         ]),   

         transforms.ToTensor(),

         # 标准化图像的每个通道

         transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225]),

         transforms.RandomErasing(),

     ])

     validTestTransform = transforms.Compose([

         transforms.Resize(256),

         # 从图像中心裁切 224x224 大小的图片

         transforms.CenterCrop(224),

         transforms.ToTensor(),

         transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225])

     ])

######################################################################

     # 建立自己的训练集,验证集和测试集

     trainData = CLeavesData(filePath + 'train.csv', filePath, mode='train', transform=trainTransform)

     validData = CLeavesData(filePath + 'train.csv', filePath, mode='valid', transform=validTestTransform)

     testData = CLeavesData(filePath + 'test.csv', filePath, mode='test', transform=validTestTransform)

     # 将训练集进行 CutMix 处理

     trainAData = CutMix(dataset=trainData, num_class=176, beta=1.0, prob=0.5, num_mix=2)

     trainDataLoader = DataLoader(

             dataset=trainAData,

             batch_size=batchSize,

             shuffle=False, # 外汇跟单gendan5.com 是否随机打乱顺序

             num_workers=3, # CPU 核心分配数

             # 固定 CPU 核心分配则在切换读取训练集和验证集二者之间多线程不用重新分配核心,节省训练时间

             persistent_workers=True,  # 固定处理数据集的 CPU 核心

         )

     validDataLoader = DataLoader(

             dataset=validData,

             batch_size=batchSize,

             shuffle=False,

             num_workers=3,

             persistent_workers=True,

         )

     testDataLoader =DataLoader(

             dataset=testData,

             batch_size=batchSize,

             shuffle=False,

             num_workers=6,

         )

######################################################################

     learningRate = 1e-4

     numEpochs = 100

     weightDecay = 1e-3

     # 开始训练

     train(net, trainDataLoader, validDataLoader, numEpochs, learningRate, weightDecay, d2l.try_gpu())


请使用浏览器的分享功能分享到微信等