写代码的感受和体验

2023-3-18

  • 训练集进行了Normalize,测试集也要进行相同的normalize,否则在测试集上的准确率会很低。

2023-3-17 在别人代码的基础上加自己的代码不知道从何下笔?

  • 以自己的代码为主体框架,然后从那个地方开始下笔。

2022-11-29

  • 我今天体会到了learning rate对实验结果的巨大影响。


    数据集均为1000个CIFAR-100样本, 第一个训练设定的初始lr为0.002,第二个训练设定的初始lr为0.1。最后,第一个得到的test_acc为0.45, 第二个得到的test_acc为0.55, 相差10个点!

2022-11-28

记录一下一个看似很难的bug的解决过程。

背景介绍:
我保存了使用DataParallel封装的模型。现在我需要加载模型,出现错误Errors in loading state_dict for DataParallel in loading state_dict. 我昨晚在晚上搜索了很多答案,答案有以下几种:

  • 需要先加载模型在调用nn.DataParallel.
  • 需要先调用nn.DataParallel再加载模型

我两种方案都试了都不行。昨晚,我想了好久,也得不到答案,最后快到了睡觉时间,于是我想着先放一放,今天早晨再来研究。

我今天早上又开始搜,搜到了pytorch官方论坛上的一个帖子,最终找到了问题的本质在于load_state_dict加载的东西是orderedDict, 所以要看自己创建的模型的state_dict()和加载OrderedStatedict的keys是否匹配。

以下是我摘录的帖子上的重要信息:

If you have saved with the pretrained model that is wrapped with nn.DataParallel(), it will have all the state_dict() keys prepended with module… In this case, while loading the saved state_dict() to a new model, you have to make sure that the new model is wrapped with nn.DataParallel() before calling model.load_state_dict().

这导致了创建的模型的state_dict()和加载的OrderedStatedict的keys不同,于是就报错了。因此才有前述csdn文章提出要remove 加载的state_dict的keys。

所以我可以先把今天难以解决的难题放到第二天早晨再来解决,或许第二天早晨就可以解出来了。

2022-11-17

写代码的时候可以摇头晃脑,感觉好像在跳舞,同时保护颈椎。

2022-11-10

  • 对于训练时间比较长的实验结果,可以中途将模型存下来,这样有利于重新加载模型,继续训练。
  • 写代码的时候把原来代码注释掉, 然后写新的代码的好处是:如果新的代码还没有原来的代码效率高,还可以很快的改回原来的代码。

2022-11-8

  • cuda out of memory可以通过将batch_size调小的方式来解决,之前是128,我调成32就好了
  • missing keys in state_dict 。如果训练网络的是时候使用了DataParallel,那么重新加载模型之前,也需要先将net进行dataparallel.
    参考:https://blog.csdn.net/Mr_WHITE2/article/details/108955177

2022-11-7

  • 先易后难

2022-11-3

  • 今天写代码又在重复造轮子。在clothing1M数据集上的实验写了这几天了,没有太大进展呀。重新造轮子意味着很多框架性的东西,思路性的东西全部要推导重来,要写的不仅仅是一个数据集的问题了。

2022-11-2

  • CIFAR10和CIFAR100是高度相似的数据集,对于不是很相似的数据集,例如Clothing1M, Webvision这些数据集和CIFAR不是一个系列的,需要很多预处理,训练的方式也可能不同的。

2022-10-31

  • gpustat命令可以用来查看当前gpu的使用情况,包括用户名,每个用户所占用的gpu的显存等情况

参考文献
[1]https://blog.csdn.net/nkhgl/article/details/83957020

2022-10-27

  • 今天我发现对于python parser中的store_action参数调用的时候,如果只输入子串也可以使得相应的参数为true:
    具体地,假如我们的代码中有这样一行

          parser.add_argument('--continue_train',action='store_true')
    

    现在在命令行输入的参数为:–continue, 则args.continue_train仍然为true

2022-10-25

  • 面向对象有助于理清思路。

2022-10-24

  • parser的默认参数可以留意的设置一下。如果后续需要复现之前的实验而没有设置相关的参数的话,程序会调用默认参数,实现向后兼容。

2022-10-11

  • pycharm 对单个文件进行split可以进行文件的参考编辑。

    • 例如参考某个文件的一个旧函数书写一个新的函数。

2022-9-22

  • 突然发现resnet18, alexnet这些模型在pytorch框架中都已经封装好了。

2022-9-20

  • 今天遇到一个数据处理过程过慢的问题,最后还是解决了,可能是因为显存不够。

2022-9-18

  • 我今天把pycharm的菜单栏字体调大了,并无意间修改了菜单栏的字体样式。当我看字的时候,我感觉好舒服,很幸福。

  • 在写代码的时候,看到别人写的代码用到了一些自己之前没有见到的数据结构
  • 我今天把jupyter的kernel关闭了,之前的结果需要重新运行才可以。

2022-9-17

  • 写代码的好处是有很大的自由,可以任意写,试错的机会很多。修改代码不会对任何其他的东西产生影响。

2022-9-7

  • 天下武功,唯快不破。写代码就写代码,别犹豫。代码世界,错了完全可以重来,就怕犹犹豫豫,几天一事无成。

2022-9-5

  • 有的时候一点点代码,写几天都写不完,其实是自己不想去写完,因为写完了还有新的代码。拖延浪费时间和 自己主动写完然后去做自己喜欢的事情是两码事情。
  • 对CIFAR10数据集的复杂预处理会花费比较多的时间。如果只是简单的预处理,一个epoch只需要7秒所有的时间。如果有复杂的transform,则可能有17秒所有的时间。

2022-9-4

  • 我现在越来越喜欢写代码了。通过写代码,我可以实现我的一些想法,感到成就感和获得感。

2022-9-3

  • 写代码的时候,如果一遇到自己的实验结果不好,就去全盘修改自己的代码,全盘审查自己的代码,就会很慌张。如果是慢慢地去修改,然后再去看实验结果,根据实验结果的反馈进一步调整就会越来越有自信。

2022-9-2

  • torch.utils.data.DataSet在继承的过程中最好能够重载所有的方法,漏掉一些方法很可能就会出现bug. 我可以靠自己debug,解决代码问题。

如何找bug?

  • 可以通过注释掉某一行的办法来锁定问题的关键所在,可以通过推理类比等多种办法来解决问题。

2022-8-31

  • 写代码能够写出人生感悟出来。最近在使用Jupyter就是自己配置的,自己摸索的。之前看各种各样的教程,总是觉得jupyter很复杂,导致自己不敢去尝试,不敢去使用。真正地去使用之后,也没有觉得那么复杂。当然前提是我身边已经有一个人在这么使用了。如果说我身边没有这么一个人在使用,其实我也是可以自己去尝试和探索的。
  • 有时候代码看不懂,其实是被代码的表面给吓到了,其实深入进去之后,逐个击破,将大问题划分为一个一个的小问题,最后发现也是可以攻克的,并且也没有当初想象的那么困难。

2022-8-12

  • 如果需要使用别人的方法,首先将别人的方法全部复制到一个文件(记作原文件)里来(一步一步地复制), 然后新建一个文件开始将别人的方法进行整合。如果遇到衔接不上的,可以运行原文件进行debug查看数据维度。
  • 父类定义接口,属性,子类进行实现
  • 写代码出的bug越多,自己对框架的了解会越清晰。
  • pytorch的Subset功能比较好用。使用方法是在原始数据集上返回idx。 这样就可以一直记录选取的数据在原始数据集中的位置。

2022-8-11

  • 炼丹本质上炼的是一种优化策略。
  • pytorch框架提供的target_transform可以用于当需要对target label进行变换时使用。还挺不错的。
  • 代码中的函数还是不要使用外部的变量,尤其是那些需要复用的函数。
  • 如果是复现别人的算法,首先将别人的算法集中到一个py文件里,然后尽可能少(几乎)就不改动别人的代码,通过新添加自己的数据集定义方式来整合别人的方法。

2022-8-10

  • 写代码归根到底是数据的问题。要搞清楚数据的输入是什么,输出是什么。

2022-8-9

  • 代码变量命名尽量简洁,有的时候写的过于详细冗长反而不便于理解。
  • 别人的数据处理部分的代码是非常值得学习的。
  • 写代码是一种艺术。
  • 多看代码和实验,学习别人是怎么做实验的,是怎么写代码的。写代码这个东西是只要勤于学习,就会成为自己熟练的东西。归根到底是看下自己到底有什么专业技能,你说自己会pytorch,然后你就可以解决问题。你说你会推导公式,会很多的证明技巧,这些也是专业技能。你说你有把握客观世界的能力,这更是最根本的价值。

2022-8-8

  • 编程是一种能力,是一种技术,用编程解决问题。
  • 做实验是为了提升自己的代码能力。不要想着一个方法直接就效果好,需要各种各样的进行实验才能效果好。
  • 自己实现代码有助于自己理解算法,会畏惧,接纳感受,然后行动!

2022-8-7

  • 善用pycharm的navigate功能,极大提升编程效率。可以在不同文件之间,同一个文件中进行来回跳转!

2022-8-6

  • 写代码别迟疑。越不想写,越写不出来。do it badly! 然后再重构。

2022-8-5

  • pycharm的split功能有利于写代码。

    上面是参考的代码,下面是自己写代码。之所以采用这种方式而不是复制粘贴,是因为这种方式有利于减少bug.

  • 代码能力已经是现如今最基本的能力了。编程能力犹如一个基本的能力。只有每天敲,每天打,才能熟练,这是一技之长,是可以用来吃饭的本事。

2022-8-1

  • 今天发现在onenote上素颜写代码(即没有代码提示,抄写pycharm中的代码进行理解)的时候,我也挺快乐的,并且理解了代码之后会很有成就感。
  • 依据别人的代码写自己的代码时,不要对原有的代码修改过多,而是尽量向下兼容,即要保证原有的代码仍然可以运行,又能添加自己的新功能。有利于快速定位bug.

2022-7-31

  • 代码这个东西,昨天下午看到一半,然后今天接着看,发现思路就忘记了。可以通过写todo来记录昨天看的位置。
  • 我比较喜欢跑一些很快就能看到结果的实验,因为这有利于检验我的代码是不是写错了。

2022-7-29

  • 突然发现jupyter在学习新东西的时候非常好,可以随时将自己的感想写在markdown上,并且可以粘贴图片到markdown,就可以对一个东西有更加深刻的理解。

2022-1-15

  • 整理代码的时候不要以为返回结果没有被使用就删除掉这行代码,因为这行代码所调用的函数中可能进行了一些操作。

2022-1-11

  • 其实有的时候,如果自己觉得别人可能也不知道某个问题的情况下就不要轻易问别人了吧。因为问了别人,别人如果不知道的话,别人会有些尴尬。或者说别人会给出一些建议,但是这些建议我想你应该已经想到过了。而且如果你的嗓子还不舒服的话。

2021-11-11

  • 现在看来把模型存起来真的很有用。否则调参真的很不好调。

2021-11-8

  • 设置一个参数叫做debug还挺好的。凡是debug为True的全部删除就好了。放在args的最前面。

2021-11-7

  • 我觉得还是使用nohop命令比较好。screen需要到每个screen中查看结果。就很麻烦。如果使用nohup直接到文件里查看就好了。简单快捷。

2021-11-6

  • 以后做实验,变量尽量放在最后,这样有利于使用tensorboard进行展现。

2021-11-3

  • 写代码时一定要注意学习率函数。这些东西如果稍有错误,就会导致实验结果是无效的。

2021-10-31

  • Pycharm的Kiteautocomplete插件挺不错的。可以进行args.提示

2021-10-28

  • 凡是计算模型输出的时候一定要注意是model.train()还是model.eval(). 不要不写。一定要写这两句话!!!!!
  • 先设置了train mode, 然后又在调用的函数中设置了eval() mode, 这时如果又需要进行训练,就需要在设置成train mode. 所以但凡调用model一定要注意当前是train还是eval mode.

2021-10-27

  • Logger, file, tbwriter最后一定要close().记住了。
  • tensorboard write scalar的时候变量名可以写三个竖线 acc/test_acc/epoch。 第一个表明是acc, 第二个表明纵轴是什么, 第三个表明横坐标是什么。这样的命名方式显得很清晰。

2021-10-25

  • 最开始写程序的时候总喜欢关注各种概念,例如,numpy的array为什么叫做ndarray。现在还会关注吗?所以有的时候不要太在意一些细节。尤其是在起步的时候,这这会浪费很多时间在一些细节上。
  • 编程拼的就是记忆力。
  • 最后要绘图的数据最好还是存在文件里。存在文件里。tensorboard只是起一个临时的作用。这在进展实验的时候是有用的。但是对于要绘制图像的数据,还是建议存在txt文件里比较好。因为到了最后你都不知道你存了哪些数据。所以还是存在txt文件里比较好,这样你能够清楚的看到,摸到。
  • python的vars方法可以将namespace object转换成字典。这个是真的厉害呀。

2021-10-23

  • 保存模型,优化器的时候一定要写state_dict()的。不写到时候无法加载。

2021-10-22

  • parser, args除非是肯定不会修改的,否则一般不要设置默认参数。否则很容易出错程序。
  • 传输的参数除非是分支结构,否则一定不要写魔法值。还是从parser中传。

2021-10-19

  • 实验的框架是不变的,变的东西有数据集,模型,局部方法。这些到底是写在分支结构里呢,还是另起一个文件重新写?

2021-10-18

  • 计算accuracy的时候overrall_size最好是在计算的过程中记录,因为不同的数据采样,这样那样,还存在drop_out = True之类的情形,是真的不知道最后的overall_size到底是多少

2021-10-17

  • 于我,程序真的是适合白天写,然后晚上运行了。晚上运行不用去一直想着看结果。真的是省了好多时间。哈

2021-10-14

  • 不会实现的东西就去网上搜。网上一搜就知道有可能别人就已经实现了。
  • 终于直到为什么别人喜欢把数据集放在项目外边了。因为这样数据集会自动存到服务器上的项目外文件夹。这样保证了项目文件夹中只有代码。这样下载项目文件的时候就只会下载代码文件。大的数据就会始终保存在服务器。

2021-10-6

  • 写代码其实是个体力活,写的多经验就多,写的少经验就少。

2021-10-5

  • 今天遇到了一个重大的bug. 我在使用dataloader遍历数据,然后使用acc = len(correct)/len(dataloader.dataset). 这样做看似没有任何问题,但是要注意,如果使用了自定义的sampler, 这里的实例总数就不是len(dataloader.dataset),而是len(dataloader.sampler). 此外,如果使用了drop_last = True, 就应该是 int(len(dataloader.sampler) / BATCH_SIZE) * BATCH_SIZE. 所以在计算loss和acc时,数据长度这个方面尤其要注意。, 是计算单个的loss, 还是计算总的loss, 每个batch的大小是否相同,最后一个batch的大小和之前的batch大小是否相同,所以最后到底除以多少,这些一定要搞清楚。len(dataloader)是batch的个数。

2021-10-4

  • 先把代码跑通了再说,先开枪,再瞄准。跑通是为了把流程搞清楚,瞄准是为了注意细节。

2021-10-3

  • 重要的数据一定要存在文件里一份。不仅仅是要在tensorboard里存放。
  • 使用tensorboard的summarywriter最后一定要writer.close(),否则的话99%的可能会导致某些量没有存入文件。!!!到时候画出来的图就是残缺不全的。

2021-10-2

  • tensorboard的文件夹名称的时间戳不能仅仅用datetime.datetime.now(),要稍微处理一下,处理代码是: {datetime.datetime.now().strftime(“%b%d_%H-%M-%S”)}

2021-9-30

  • 通过ArgumentParser()输入的路径,即使是使用了引号,创建的文件夹依然会以递进的形式创建。因为’/'就是会在创建文件夹的时候递进创建。
    - 跑实验一定要注意out_dir一定要写正确,否则结果很容易覆盖。文件夹的末尾加上时间, datetime.datetime.now()
  • 该print的多print, 多重记录。

2021-9-29

  • train()函数把迭代步参数等记录性参数也传进去,方便tensorboard记录信息。

  • tensorboard()的tag很关键,一个tag决定了一张图。不同实验的相同tag也会放在一张图上。一个tag就代表了一张图。

2021-9-28

  • out_dir前面加一个runs/,这样所有的实验结果都会存在runs文件夹下。
  • 在一个需要用到flag作为信号控制代码中一些代码片段是否运行的,比如"–flag True"或者"–flag False"。
    但是古怪的是无法传入False,无论传入True还是False,程序里面都是True的参数,所以这个flag并没有生效,也就失去了意义。
    解决方案推荐,当你不输入–flag时,默认为False, 输入–flag时,才会触发True值。看执行结果。
    parser.add_argument(“–flag”,action = “store_true”, help='Run or not")
    这样的话,当你不输入–flag的时候,默认为False; 输入–flag的时候,才会触发True值。也可以指定action为store_false,不输入的时候–flag默认True, 输入–flag触发False.
  • tensorboard对于同一个标签的变量的记录会进行覆盖。
  • 为了保证python文件的独立性,还是要使用一个main标识符,这样可以使得各个文件之间不影响。对于可以让其他文件复用的,可以放在main函数的外面。

2021-9-27

  • 写入文件时,一定要指定输出的文件夹,不要将文件名就误以为是最后的输出路径。with open(filepath,'w) as filewriter中的filepath是路径,不仅仅是文件名,如果仅仅传入了文件名,结果就会仅输入到这个文件里,很容易导致实验结果的覆盖。
  • 要写到论文里的数据就输出到文件里,如果只是看个过程效果,最好使用tensorboard. 不要将过程数据输出到文件里,这样非常不便于查看。
  • 输出模型只需要输出最后一个epoch的模型就可以了,因为中间断掉的话其实不太可能。往往可能因为最后一个epoch之后的结果没有输入到文件里导致断掉。

2021-9-26

使用 tensorboard记录过程能够很好的反映是过拟合了还是欠拟合了。代码这东西真的是打的越多越有经验。

  • 一个文件的布局通常是:

    • 导入的包
    • if __name__ == ‘main’:
    • 本文件用到的常量
    • parser
    • args进行解析
    • 设定结果输出文件夹
    • 设定随机(之所以放到后面,是因为需要用到args.seed.
      # training settings
      random.seed(args.seed)
      torch.manual_seed(args.seed)
      np.random.seed(args.seed)
      torch.cuda.manual_seed_all(args.seed)
      torch.backends.cudnn.deterministic = False
      torch.backends.cudnn.benchmark = True
    • 函数要到使用了再定义。
    • 整个做科研的过程就是面向过程的代码
  • save_checkpoint时不要只存模型,要把optimizer也存进去。

  • 存模型的时候尤其要注意,要先跑小的数据集,防止键的值出问题,导致最后无法输入文件,白跑一趟。

2021-9-25

现在跑的大部分深度学习实验都是需要极强的灵活性,需要随时跑新的实验,本质上是面向过程的,所以就不要涉及太多的面向对象的结构。我们现在做深度学习实验,不是写一个软件工程项目,使用面向对象思想并不会让我们实验做的更快。

configure文件里写的是不变的一些参数,经常变的参数最好还是写在parser里。

  • 能写在一个文件里的函数绝对不在两个文件里写。深度学习代码的复用性太差了。模型的输出不一样就会导致报错。
  • 构造模型之后一定要顺便带一个.cuda(),这样模型里面的参数就会放在gpu里。否则就会导致输入是在gpu,但是模型的权重确是在cpu,导致数据类型不一致。
    RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

变量名尽量符合英语的习惯,尽量简洁

机器学习这一块并不要求编程能力有多强,
主要是能跑出实验结果,能够根据数学公式解决一些具体的问题。所以说代码其实是非常基本的东西。机器学习只需要你会写一些基本的代码,能跑通是最基本的,最主要的,关键是你要有一些好的idea, 能够去实现一些东西。, 能够将头脑中的一些idea实现。

pycharm和vscode混合使用

跑代码使用命令行跑,写代码使用pycharm写。

不要将简单问题复杂化

每次修改参数在结果上一定要有体现

深度学习编程感受和体验相关推荐

  1. manjaro设置java_manjaro 深度学习编程环境搭建

    欢迎来到阿八个人博客网站.本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯. 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke ...

  2. 一种分布式深度学习编程新范式:Global Tensor

    撰文|姚迟.许啸宇.左益豪.程国良 Global Tensor 是指多机多设备执行的 Tensor,它是实现全局视角(Global View)编程的接口. 当前的并行程序,大都采用单程序多数据(SPM ...

  3. 吴恩达深度学习编程作业汇总

    以下列表为吴恩达的深度学习课程所对应的编程作业列表,都直接指向了github的连接地址:这些作业也是我在网上购买,可能与官方的内容有所出入:同时由于有的训练集和测试集以及预训练好的参数过大,不便上传, ...

  4. 吴恩达 深度学习 编程作业(2-2)- Optimization Methods

    吴恩达Coursera课程 DeepLearning.ai 编程作业系列,本文为<改善深层神经网络:超参数调试.正则化以及优化 >部分的第二周"优化算法"的课程作业,同 ...

  5. 吴恩达深度学习编程作业报错解决方法汇总

    概述及资源分享 大二结束后的暑假,学习吴恩达深度学习([双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili)的课程,在做编程作业的时候总是遇到一些报错,尤其是导入所需要 ...

  6. 吴恩达深度学习编程作业 part 2-2

    本章节学习神经网络中的正则化 import numpy as np import matplotlib.pyplot as plt import sklearn import sklearn.data ...

  7. pytorch l2正则化_吴恩达深度学习 编程作业六 正则化(2)

    推荐守门员应该将球踢到哪个位置,才能让自己的队员用头击中. 1.无正则化模型 判别是否有正则化与调用其他计算函数. 准确率:0.948/0.915 明显过拟合overfiting了. 2.L2正则化 ...

  8. 神经网络与深度学习编程练习(coursera 吴恩达 )(3)

    完整实现多层神经网络识别图片中的猫 原coursera课程主页,在网易云课堂中也有课程资源不过没有编程练习. 本次编程利用上次作业中完成的各个函数,完整实现一个多层神经网络,进过训练来识别图片中是否有 ...

  9. 吴恩达深度学习编程题——0402(Keras-Tutorial-Happy House )遇到问题及解决方法

    1.引用模块问题 ImportError: cannot import name 'plot_model' from 'keras.utils' 解决方法: 确定路径命名没有问题,发现是版本更新后的问 ...

最新文章

  1. (转载)C++之tinyXML使用
  2. jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览
  3. 图片格式转换 - .webp 转格式为 .png / .jpg
  4. ajax获取的json作用域,ajax;jsonp;箭头函数;let关键字;const关键字
  5. CSS相关知识点:6种清除浮动和BFC
  6. java在数组中放入随机数_如何在Java中随机播放数组
  7. pages与页面配置
  8. qdir 类似工具_Qdir中文版|多窗口资源管理器下载_最火软件站
  9. react18新特性
  10. 信息学奥赛一本通 1296:开餐馆(evd)
  11. 计算机视觉 — Harris角点检测
  12. 微软服务器登录不上,微软账号无法登录怎么办
  13. 自己整理的英语一最终作文模板
  14. input:-webkit-autofill
  15. Oracle 12C In-Memory特性研究
  16. HBuilder的安装及用法
  17. 网站性能优化解决方案
  18. 虚拟机下克隆CentOS后更改MAC地址
  19. Hadoop大数据从入门到精通-任亮-专题视频课程
  20. Appnuim作业题

热门文章

  1. 三星给Galaxy Z Fold5上了IP58级别防护:还没摸到旗舰防护级别
  2. 中小型数据库 RMAN CATALOG 备份恢复方案(一)
  3. 前端手机本地调试小技巧
  4. f协议 openmessage_Openflow协议规范
  5. vue修改滚动条样式的方法
  6. 优秀的项目经理是怎样练成的?看完这9条自我修养,你也可以变优秀
  7. vue 跳转至当前路由,并刷新页面
  8. 基于jQuery实现的腾讯互动娱乐网站特效
  9. ubuntu查看内存占用
  10. 检索框/输入框测测试用例