• Datawhale 学CV--task2 模型数据读取和增广代码理解


    Baseline的数据读取和增广理解:

    0、数据读取的流程:data--datalist--dataset--dataloader

    为什么这样呢?可以看参考文献1.

    【若要加速data的 IO 过程,即CPU处理部分减少,GPU部分增加,可以看参考文献2(tf.data+estimator)】

    1、取jason文件中的label

    train_label = [train_json[x]['label'] for x in train_json]

     

    2、不计算梯度,常用在测试

    with torch.no_grad():

    3、取模型结果

    model_conv = nn.Sequential(*list(model_conv.children())[:-1])  # sequential  不能用list类型数据,用*list

    4、图像预处理,常写在compose内,成为一组操作

    transforms.Compose([... ])

    5、因为model继承了nn.Module,所以必须写super

    super(SVHN_Model1, self).__init__()

    6. 梯度计算,梯度回传

    optimizer.zero_grad() #开始新的一轮batch的参数更新(参数-梯度),先清零
    loss.backward()         #梯度回传

    但optimizer.step()的作用是?  #更新参数 (整个过程:每个batch数据:grad清零,梯度计算回传,更新)

    7、网络最后输出5个11类的概率

    output = np.concatenate([ c0.data.numpy(), c1.data.numpy(),...] )  #网络输出的tensor转换numpy,拼接

    打印batch=40 的 c0.shape,c0:【torch.Size([40, 11]) tensor([[ 4.2841, 0.9551, -2.4691, ..., 0.5105, 0.5173, 0.5255],...】

    8.取val的label

    val_label = [''.join(map(str, x)) for x in val_loader.dataset.img_label]

    (为什么train_label不是这样取?train_label = [train_json[x]['label'] for x in train_json])

    【内置函数map()把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果,map对象中每个元素是原序列中元素经过函数func处理后的结果,map()函数不对原序列或迭代器对象做任何修改。】--查可迭代?

    9.将概率转换为分类label

    val_predict_label = np.vstack([ val_predict_label[:, :11].argmax(1),....]) #0-9数字,再加个占位符,一共11类。?argmax(1)中的1表示什么?

    分类label转换为str

    for x in val_predict_label:

      val_label_pred.append(''.join(map(str, x[x!=10])))

    【因为val_predict_label[:, :11].argmax(1), 所以这里的 x 就是这11个位里最大概率的下标索引,如在2位最大,表示这次预测是数字2,如在0位最大,表示这次预测是0,如果是10位最大,表示是填充的--因为onehot编码,预测的数字刚好和onehot的下标对应 】

    【例如:某次结果:x: [ 3 5 10 10 10]  ,所以val_label_pred: ['11', '333', '35'] 】

    10、一旦有一个数字预测错了,整张图acc=0

    val_char_acc = np.mean(np.array(val_label_pred) == np.array(val_label))

    11、test基本与val的过程相同,除了没有loss(需要提交)

    12、注意看数据集的标注格式

    问题:

    1.num_workers 是做什么?#每次提取数据多进进程

    2.feat = feat.view(feat.shape[0], -1)是整理成[5, ?],一定要这样处理么?

    为了适应FC的输入,self.fc1 = nn.Linear(512, 11),但这里是512的输入,11类的输出,feat.shape[0]=512,不是5?【feat是卷积的输出,后接FC layer,整理为FC的输入512,所以512*?,代码最后的输出是5类,但这是5个FC输出的叠加,每个FC输出11】

    3.loss是5层结果累加:

    loss = criterion(c0, target[:, 0]) + criterion(c1, target[:, 1]) +。。。【target的内容是什么,target[0], target[1] 】#target就是label,因为都是一个batch训练的,所以target[:, 0] 的第一维是batch,第二维是图片第一个字符是数字几。例如:target = '133', target[:,0]='1', target[:,1]='3', target[:,2]='3', target[:,3]='*',target[:,4]=*

    参考资料:

    pytorch数据读取流程:

    https://blog.csdn.net/admintan/article/details/91366551

    gpu提高利用率:

    https://zhuanlan.zhihu.com/p/53345706

    torch常用代码段:

    https://bbs.cvmart.net/topics/1472

    torch 的梯度更新:

     https://blog.csdn.net/yangwangnndd/article/details/95622893

    lstm应用:

    https://blog.csdn.net/zwqjoy/article/details/86490098

    验证码:

    https://www.jianshu.com/p/08e9d2669b42

    tensor转换numpy

    https://blog.csdn.net/xiaosongshine/article/details/84955891

    argmax举例:

    https://www.cnblogs.com/bonelee/p/8976380.html

    关于pytorch中使用pretrained的模型,对模型进行调整:

    https://blog.csdn.net/chen_xinjia/article/details/80273592

    super相关:

    https://blog.csdn.net/zz2230633069/article/details/83539941

    多维矩阵

    https://blog.csdn.net/qq575379110/article/details/70538051

    https://www.cnblogs.com/zhouyang209117/p/6512302.html

    读取包的介绍学习笔记

    https://blog.csdn.net/whatiscode/article/details/106301541

  • 相关阅读:
    JS中级二
    JS中级一
    JS入门八
    JS入门七
    JS入门六
    JS入门五
    JS入门四
    JS入门三
    JS入门二
    JS入门1
  • 原文地址:https://www.cnblogs.com/haiyanli/p/12923016.html
Copyright © 2020-2023  润新知