实验记录:
1、Resnet18
数据1000,epoch 2,bachsize 40,score 0.57
2、Efficientnet_b0
数据1000,epoch 2,bachsize 40平均acc 61 score 0.51
数据1000,epoch 15,bachsize 40平均acc 64.7 score 0.707
3、Efficientnet_b1
数据1000,epoch 15,bachsize 32平均acc 68 score ?
数据10000,epoch 2,bachsize 32平均acc 78
数据all epoch 5,bachsize 64平均acc 81 socer 0.961
4、Efficientnet_b4
数据1000,epoch 15,bachsize 40平均acc 73 score 0.824
数据1000,epoch 15,bachsize 32平均acc 75 score ?
数据100000 ,epoch 2 ,bachsize50,平均acc77 score 0.939
数据100000 ,epoch 2 ,bachsize32,平均acc79 score
说明bs32的结果优于bs50
数据all epoch 2,bachsize50,平均acc 83.494 score 0.969
best数据all epoch 5,bachsize32,平均acc86.046 score0.978 跑了9h 太久了
遇到的问题:
1、代码中出现top1,什么是top1准确率?
首先准确率acc:就是(真阳+真阴)/样本总数
top1----- 就是你预测的label取最后概率向量里面最大的那一个作为预测结果,如过你的预测结果中概率最大的那个分类正确,则预测正确。否则预测错误
top5----- 就是最后概率向量最大的前五名中,只要出现了正确概率即为预测正确。否则预测错误。
2、Timm是否支持transformer?
支持,有vit模型
3、出现内存溢出错误
用了efficientnet_b4,模型太大,更换为b1就可以跑了
3、output一直转圈圈
kaggle中训练得到的output太大该怎么下载? - Xmasker^_^ - 博客园 (cnblogs.com)
4、怎么把本地的模型放到kaggle上运行?
Kaggle上传自己训练的模型进行比赛提交_kaggle上传模型-CSDN博客
5、怎么加载自己的模型
load_state_dict函数
import timm
model = timm.create_model('efficientnet_b4', pretrained=False, num_classes=2)
save_dir = '/kaggle/input/model-efb4-all-89-26/model_89.26.pt'
model.load_state_dict(torch.load(save_dir))#加载模型参数
model = model.cuda()
6、数据增强会产生新数据吗?
数据增强本身不会永久性地生成新的数据样本,而是动态地对现有数据进行变换。例如,每次从数据集中加载一个图像时,数据增强变换会随机应用到该图像上。这意味着在每个训练迭代中,同一个图像可能会以不同的变换形式出现,从而提高数据的多样性。
代码解析:
def train(train_loader, model, criterion, optimizer, epoch):
batch_time = AverageMeter('Time', ':6.3f')
losses = AverageMeter('Loss', ':.4e')
top1 = AverageMeter('Acc@1', ':6.2f')
progress = ProgressMeter(len(train_loader), batch_time, losses, top1)#len(train_loader)就是train总的批次数
# switch to train mode
model.train()
end = time.time()
for i, (input, target) in enumerate(train_loader): #input和target都是一个批次里的所有数据
input = input.cuda(non_blocking=True)#non_blocking=True表示异步加载数据,加快训练速度
target = target.cuda(non_blocking=True)
# compute output
output = model(input)
loss = criterion(output, target)
# measure accuracy and record loss
losses.update(loss.item(), input.size(0))#input.size(0)表示batch_size
'''acc的计算方法:
output.argmax(1)表示每个样本的预测类别。view(-1)表示将张量展平。
output.argmax(1).view(-1) == target.float().view(-1) 结果例如是 [True, True, True],表示所有预测都正确。
.float() 将布尔张量转换为浮点数 [1.0, 1.0, 1.0]。
.mean() 是求均值 结果是 1.0
乘以 100 后,准确率是 100.0%。
'''
acc = (output.argmax(1).view(-1) == target.float().view(-1)).float().mean() * 100
top1.update(acc, input.size(0))
# compute gradient and do SGD step
optimizer.zero_grad()
loss.backward()
optimizer.step()
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if i % 100 == 0:
progress.pr2int(i)
class ProgressMeter(object):#进度条,用于显示训练到哪一个batch了
def __init__(self, num_batches, *meters):#num_batches是int类型,*meters是可变参数列表
self.batch_fmtstr = self._get_batch_fmtstr(num_batches)
self.meters = meters
self.prefix = "Batch"
def _get_batch_fmtstr(self, num_batches):
num_digits = len(str(num_batches // 1))#num_batches//1是整数除法,取整
fmt = '{:' + str(num_digits) + 'd}'#fmt = '{:2d}'
return '[' + fmt + '/' + fmt.format(num_batches) + ']'# [{:2d}/num_batches]
def pr2int(self, batch):
entries = [self.prefix + self.batch_fmtstr.format(batch)] #entries列表[[batch/num_batches]]
entries += [str(meter) for meter in self.meters]#将meter添加到列表中,entries = ["Batch(5/100)", "Loss: 0.1234", "Accuracy: 95.67%"],调用类方法__str__
print('\t'.join(entries))#'\t'.join(entries) 会将 entries 列表中的所有字符串以制表符 '\t'(空格) 连接在一起,生成一个新的字符串。
# 输出: "Batch (5/100) Loss: 0.1234 Accuracy: 95.67%"