• 零基础看深度学习python代码的基本方法


    0.背景

    很多同学在深度学习的学习过程中,最头疼的就是看代码,觉得自己看一句不会一句,容易陷入恶性循环。
    本教程旨在为大家总结一套基本的代码阅读方法和技巧,帮助大家能够顺利地把代码读通顺。

    提前罗列一下方法:
    总结一下,方法按照使用顺序包括:

    1. 翻译法(推断法)
    2. 百度法(检索法)
    3. 打印测试法(核心🌟)
    4. 代码拆解法(核心🌟)
    5. 进入类里观察法
    6. B站视频法

    1.前提准备

    阅读代码之前,你需要准备好一个流行的代码编译器例如pycharm,相信看代码的你,这个已经装好了,如果没装好的话可以看我的其他博文。
    如果条件允许,再安装一个jupyter就再好不过了,它能够帮助你快速分析,不必像pycharm那样从头运行代码。

    2.🌟一个例子,把方法说清楚

    我们拿动手学深度学习(李沐)书上的一段代码,来做例子,讲解python深度学习的基本知识和代码阅读流程:

    import d2l
    import torch
    
    n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
    true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
    train_data = d2l.synthetic_data(true_w, true_b, n_train)
    train_iter = d2l.load_array(train_data, batch_size)
    test_data = d2l.synthetic_data(true_w, true_b, n_test)
    test_iter = d2l.load_array(test_data, batch_size, is_train=False)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.1 第一步:代码来了,啥也不懂就先运行试试

    首先,我们把这段代码放到pycharm中运行,看看结果?

    在这里插入图片描述

    在这里插入图片描述
    我们会发现,从开始就出问题了?报了一堆红色的错误!那怎么办呢?
    翻译+百度。

    方法1:遇到报错先翻译

    翻译:d2l这个模型里没有synthetic_data属性?

    注意了,这里补充一个知识点,python中import后面的内容是导入的包(也叫类),包(类)的下面通常有很多方法,通过"包名.方法"的方式,我们可以调用方法下面的方法,方法有时候也称作属性

    通过翻译,我们知道d2l下面,没有synthetic_data这个方法,这说明这个包倒入错误!!

    方法2:遇到报错“复制后百度”

    然后我们去百度检索到底应该用哪个包!
    首先,我们复制AttributeError: module 'd2l' has no attribute 'synthetic_data'这段错误到百度中直接搜索,看看会不会有一些解决方案。
    在这里插入图片描述
    大量的方案,告诉我们,就是包里没有这个方法,我们就考虑难道是导入错了?
    于是,我们直接去李沐课程官网,找原代码。
    在这里插入图片描述
    确实导入错了,于是我们改写代码,重新运行。

    在这里插入图片描述

    在这里插入图片描述
    显示process finished with exit code 代表我们的代码没有问题啦,跑通了。

    2.2 第二步:跑通代码后,逐句写注释

    import math #这一句导入math这个包
    import torch # 这一句导入torch包
    from d2l import torch as d2l #这一句导入d2l中的torch包,并命名为d2l
    
    # 这一句看不懂了?啥意思啊,几个数,几个点?
    n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    方法3:通过打印就知道在干什么了!!

    当遇到看不懂的句子的时候,你需要把他们打印出来看看,是什么,这时候最简单的方法使用jupyter notebook!将代码放入jupyter里,并通过打印看看,每个变量是什么?
    在这里插入图片描述
    print()是一个是一个打印方法,可以帮助我们查看变量,从此我们就学会了,如何查看变量了,就是打印,用jupyter notebook运行后打印,这是一个很重要的代码学习方法,一定要记住,当你不知道代码干了什么的时候,你就打印出来过看,然后你就学会了!!!!

    方法4:代码拆解观察,逐步看懂整个句子

    import math #这一句导入math这个包
    import torch # 这一句导入torch包
    from d2l import torch as d2l #这一句导入d2l中的torch包,并命名为d2l
    
    # 这一句代表,为四个变量赋值四个数字,含义就是英语单词的含义
    n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5 
    
    #这一句又看不懂了!!什么乱七八糟的啊? torch.ones()是什么?torch.ones(())是什么? 
    #torch.ones((num_inputs,1))是什么?torch.ones((num_inputs,1))*0.01是什么? 
    #到底这都是什么啊? 深度学习好难啊!!!! 要疯掉了!!!
    #啥也不会怎么学啊?????
    true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    每个0基础的代码学习者,都会遇到上面一堆困难,一堆问题。

    1. 首先,通过提问题的方式对代码进行拆解,上面已经通过大量的疑问句把这个代码拆解成了很多小段了?
    2. 拆解完成之后就是利用上面讲过的方法2:百度和方法3:打印观察来分析每一个小东西是什么,最后弄明白整行代码!

    方法2:百度,先去百度torch.ones(())是在干什么?然后你就懂了,他是在生成一个全为1的矩阵。但是这个百度的方法,有时候需要耗费精力。那么你就用方法3:打印

    方法3:打印观察
    在这里插入图片描述
    我们发现,torch.ones((2,1))是在生成一个2*1的矩阵,矩阵内容全部是浮点数字1,那么torch.ones((num_inputs,1))就是在生成一个num_inputs行,1列的全为1的矩阵。
    torch.ones((num_inputs, 1)) * 0.01是什么意思呢?
    我们继续用方法3:打印测试

    在这里插入图片描述
    我们发现,就是对矩阵里所有的数字进行了乘法操作白~

    true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05这一整句话是什么意思呢?
    继续使用方法3:打印测试
    在这里插入图片描述
    通过方法4*拆解方法3:打印测试,我们一下子就明白了,这句话就是生成一个大小为2*1的值全为0.01矩阵和一个数字0.05,并把矩阵和这个数字分别赋值给true_w,和ture_b。 意思是真实的w和真实的b

    方法5:进入类里,逐句看方法

    import math #这一句导入math这个包
    import torch # 这一句导入torch包
    from d2l import torch as d2l #这一句导入d2l中的torch包,并命名为d2l
    
    # 这一句代表,为四个变量赋值四个数字,含义就是英语单词的含义
    n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5 
    
    #生成矩阵true_w和数字b
    true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
    # 这一句又看不懂了,啥啊,synthetic_data到底是在干什么? 是什么啊?
    # 真的无语了?哪里来的synthetic_data啊?
    train_data = d2l.synthetic_data(true_w, true_b, n_train)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们在前面普及过了,类里会有很多方法,而d2l就是一个类,synthetic_data就是类里的方法,通过翻译我们知道这个方法名为“人造数据”,我们很容易猜出来,这个方法是用来生成数据的。 但是,我们怎么知道,它到底怎么做的呢?
    这个时候,我们需要进去看看,我们通过键盘上的ctrl键+鼠标左键放置在synthetic_data这方法上单击一下,
    在这里插入图片描述
    在这里插入图片描述
    你会发现,你可以看到方法的全貌了,这样,你就可以把方法摘出来,一句一句分析了。

    # 一个方法,输入了3个变量,分别是w,b,num_examples
    def synthetic_data(w, b, num_examples):
    # 对方法的解释,翻译为:产生 y= Xw+ b + noise
        """Generate y = Xw + b + noise.
        Defined in :numref:`sec_linear_scratch`"""
        # 这句看不懂
        X = d2l.normal(0, 1, (num_examples, len(w)))
        # 这句看不懂
        y = d2l.matmul(X, w) + b
        # 这句看不懂
        y += d2l.normal(0, 0.01, y.shape)
        # 这个是返回了X,d2l.reshape(y,(-1,1))
        return X, d2l.reshape(y, (-1, 1))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    你会发现,你看不懂,这里我们仍然采取方法2:百度和方法3:打印测试
    通过方法5:进入类里和方法3:百度,我知道饿了d2l.normal是生成符合某种分布的随机数。
    然后,也可以直接用我最喜欢的方法3:打印测试,这样就不必百度学方法具体的使用了,我就想知道它到底干了什么就行!
    在这里插入图片描述
    我发现,这句话就是生成尺寸为num_examples*len(true_w)的,0为均值,1为方差的随机数嘛,太简单了
    在这里插入图片描述

    # 一个方法,输入了3个变量,分别是w,b,num_examples
    def synthetic_data(w, b, num_examples):
    # 对方法的解释,翻译为:产生 y= Xw+ b + noise
        """Generate y = Xw + b + noise.
        Defined in :numref:`sec_linear_scratch`"""
        # 生成尺寸为(num_examples, len(w))的随机矩阵
        X = d2l.normal(0, 1, (num_examples, len(w)))
        # 这句看不懂? 测试法:矩阵乘法+常数b
        y = d2l.matmul(X, w) + b
        # 这句看不懂? 测试法:生成均值为0,方差为0.01的和y尺寸相同的随机数矩阵,然后加到y上,其实就是实现了y= Xw+ b + noise
        y += d2l.normal(0, 0.01, y.shape)
        # 这个是返回了X,d2l.reshape(y,(-1,1))
        # d2l.reshape(y,(-1,1))是什么意思呢? 测试法!!!
        # 通过测试可知,返回num_examples*len(w)尺寸的特征矩阵和num_examples*1的标签矩阵
        return X, d2l.reshape(y, (-1, 1))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    y = d2l.matmul(X, w) + b
    在这里插入图片描述
    y += d2l.normal(0, 0.01, y.shape)
    在这里插入图片描述
    d2l.reshape(y, (-1, 1))

    在这里插入图片描述
    上图发现,没有变化啊
    我们再改造一下
    在这里插入图片描述
    哦~ 懂了,就是reshape重塑的意思,按照行数随意(-1)代表随意,列数为1,对矩阵重新改造形状。

    方法6:B站视频法

    对于很多不懂的知识,除了百度法之外,如果不喜欢文字类解释,还可以去B站找视频学习,有很多创作者上传了各种知识的不同讲解,多看几个,你就会总结出自己的见解啦.
    https://www.bilibili.com/

    3.总结

    方法讲完了,剩下这几句就不管了。

    train_iter = d2l.load_array(train_data, batch_size)
    test_data = d2l.synthetic_data(true_w, true_b, n_test)
    test_iter = d2l.load_array(test_data, batch_size, is_train=False)
    
    • 1
    • 2
    • 3

    总结一下,方法按照使用顺序包括:

    1. 翻译法(推断法)

    2. 百度法(检索法)

    3. 打印测试法(核心🌟)

    4. 代码拆解法(核心🌟)

    5. 进入类里观察法

    6. B站视频法

  • 相关阅读:
    Promise封装Ajax请求
    SpringBoot+Mybaits搭建通用管理系统实例三:数据库处理Dao层功能实现
    linux驱动调试之Debugfs
    鸿蒙OS应用开发之显示图片组件6
    物联网网关
    【计算机网络】运输层:可靠传输的工作原理(1)停止等待协议
    IDEA中debug启动报错Method breakpoints may dramatically slow down debugging
    Harbor密码丢失,如何处理?
    Node.js | 数据加密 —— 内置模块 crypto 的应用
    【 Linux】Linux调试器 - gdb
  • 原文地址:https://blog.csdn.net/adreammaker/article/details/126486656