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())