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)

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 

方法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

每个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)

我们在前面普及过了,类里会有很多方法,而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))

你会发现,你看不懂,这里我们仍然采取方法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))

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. 打印测试法(核心🌟)

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

5. 进入类里观察法

6. B站视频法

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐