• (五)fastai应用


    目前:fastai lesson8~lesson11的部分都重构了

    • mnist数据集比较简单、28×28的像素,都是一样的。背景也比较干净,同时是分类任务,用简单的网络就可以处理的。        
      • 由于数据集过于简单,没办法看到一些基本操作的效果,改为后面的Imagenette的数据集

    1. 使用线性模型

    pytorch中的参数初始化方法总结_ys1305的博客-CSDN博客_reset_parameters

    model = nn.Sequential(nn.Linear(), nn.ReLU(), nn.Linear())

    •  pytorch的默认初始化,在各个层的reset_parameters()方法中。

    1. # 在这里对mnist数据集进行分类处理,实现acc的提升
    2. from exp.nb_09c import *
    3. """ 0.数据准备
    4. 没有用自己写的DataBunch,ItemList等接口。ImageList的get是要去open的
    5. mnist走的还是pytorch的Dataloader的接口
    6. """
    7. x_train,y_train,x_valid,y_valid = get_data() # 这个函数在nb_02.py中定义
    8. x_train,x_valid = normalize_to(x_train,x_valid) # nb_05.py中
    9. n,m = x_train.shape
    10. c = y_train.max().item() + 1
    11. bs = 512
    12. # 使用Dataset来管理batch数据: nb_03.py
    13. train_ds,valid_ds = Dataset(x_train, y_train),Dataset(x_valid, y_valid)
    14. # nb_08.py get_dls在nb_03.py,使用的是Dataloader
    15. data = DataBunch(*get_dls(train_ds, valid_ds, bs), c)
    16. loss_func = F.cross_entropy
    17. """ 1. 线性模型(50,10),使用pytorch的nn.Module基类,不重构了
    18. """
    19. nh = 50
    20. def init_linear_(m, f):
    21. if isinstance(m, nn.Linear):
    22. f(m.weight, a=0.1)
    23. if getattr(m, 'bias', None) is not None: m.bias.data.zero_()
    24. for l in m.children(): init_linear_(l, f)
    25. def init_linear(m, uniform=False):
    26. f = init.kaiming_uniform_ if uniform else init.kaiming_normal_
    27. init_linear_(m, f)
    28. # ① model,由于是自定义的线性模型,没有初始化
    29. model = nn.Sequential(nn.Linear(m, nh), nn.ReLU(), nn.Linear(nh, c))
    30. lr = 0.5
    31. # get_runner nb_06.py 由于不是CNN网络,所以不是get_cnn_runner
    32. # 使用get_runner而不是get_learner
    33. # device = torch.device('cuda', 0)
    34. # torch.cuda.set_device(device)
    35. cbfs = [partial(AvgStatsCallback, accuracy), CudaCallback, Recorder, ProgressCallback]
    36. phases = combine_scheds([0.3, 0.7], cos_1cycle_anneal(0.2, 0.6, 0.2))
    37. sched = ParamScheduler('lr', phases)
    38. # Learner在nb_09b.py 线性模型、交叉熵loss、lr、cbfs、opt 在Learner.fit中有opt的初始化函数的。
    39. # ② 优化器 nb_09b.py 简单的sgd梯度下降,weight_decay是l2正则化
    40. learn = Learner(model=model, data=data, loss_func=loss_func, lr=lr, cb_funcs=cbfs)
    41. # 可以在fit的时候添加一个cbs
    42. # sgd: p = p - lr*p.grad
    43. # weight_decay: p = p * ( 1 - lr*wd)
    44. def append_stats(hook, mod, inp, outp):
    45. if not hasattr(hook,'stats'): hook.stats = ([],[],[])
    46. means,stds,hists = hook.stats
    47. means.append(outp.data.mean().cpu()) # 激活元的值
    48. stds .append(outp.data.std().cpu())
    49. hists.append(outp.data.cpu().histc(40,0,10)) #histc isn't implemented on the GPU
    50. def get_hist(h):
    51. return torch.stack(h.stats[2]).t().float().log1p() # h.stats[2]为直方图
    52. with Hooks(model, append_stats) as hooks:
    53. learn.fit(1) # pytorch_init + sgd
    54. fig, [ax0, ax1] = plt.subplots(1,2, figsize=(10,4))
    55. for h in hooks:
    56. ms, ss, hi = h.stats
    57. ax0.plot(ms), ax0.set_title("act_means", loc='center'), ax0.set_xlabel('batches')
    58. ax0.legend(range(3))
    59. ax1.plot(ss), ax1.set_title("act_stds", loc='center'), ax1.set_xlabel('batches')
    60. ax1.legend(range(3))
    61. fig,axes = plt.subplots(2,2, figsize=(15,6))
    62. for ax,h in zip(axes.flatten(), hooks[:3]):
    63. ax.imshow(get_hist(h), origin='lower'), ax.set_title("acts_hist", loc='center'), ax.set_xlabel('activiations')
    64. ax.axis('off')
    65. plt.tight_layout()
    66. def get_min(h): # 将直方图的前两个数加起来
    67. h1 = torch.stack(h.stats[2]).t().float()
    68. return h1[:2].sum(0)/h1.sum(0)
    69. fig,axes = plt.subplots(2,2, figsize=(15,6))
    70. for ax,h in zip(axes.flatten(), hooks[:3]):
    71. ax.plot(get_min(h)), ax.set_title("hist[:2] zero ratio", loc='center'), plt.xlabel('batches')
    72. ax.set_ylim(0,1)
    73. plt.tight_layout()

     

     ① Linear的模型,需要自己写一个。Learner在nb_09b.py中,opt是在fit的时候才去构建了Opt的对象。

    ② opt如果是sgd,就是默认的。不写就可以了。

    ③ 如果cuda启动不起来,电脑需要重启。

    2. Imagenette数据集调试记录


    Pytorch 调试常用

    代码仓库:Dive-into-DL-PyTorch/2.2_tensor.md at master · ShusenTang/Dive-into-DL-PyTorch · GitHub

    李沐的《动手学深度学习》原书中MXNet代码实现改为PyTorch实现。本项目面向对深度学习感兴趣,尤其是想使用PyTorch进行深度学习的童鞋。本项目并不要求你有任何深度学习或者机器学习的背景知识,你只需了解基础的数学和编程,如基础的线性代数、微分和概率,以及基础的Python编程。

    目录如下所示:

    1. Tensor的使用

     

  • 相关阅读:
    阿里菜鸟面经 Java后端开发 社招三年
    深度网络架构的设计技巧(二)之BoT:Bottleneck Transformers for Visual Recognition
    C语言学习之路(基础篇)—— 指针(下)
    docker bash: vi: command not found 修改文件无法使用 vi yum的方法
    11.1Spring基础(核心概念,创建和使用,简单读取)
    softmax 与 sigmoid 关系测试
    wx.getLocation() 频繁调用会增加电量损耗及频率限制的替换解决方案
    点云处理简介
    【正点原子STM32连载】第二十三章 OLED显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    【wpf】Bingding的方向和触发的时机
  • 原文地址:https://blog.csdn.net/haronchou/article/details/126031631