零基础看深度学习python代码的基本方法
- 0.背景
- 1.前提准备
- 2.🌟一个例子,把方法说清楚
- 2.1 第一步:代码来了,啥也不懂就先运行试试
- 方法1:遇到报错先翻译
- 方法2:遇到报错“复制后百度”
- 2.2 第二步:跑通代码后,逐句写注释
- 方法3:通过打印就知道在干什么了!!
- 方法4:代码拆解观察,逐步看懂整个句子
- 方法5:进入类里,逐句看方法
- 方法6:B站视频法
- 3.总结
- 1. 翻译法(推断法)
- 2. 百度法(检索法)
- 3. 打印测试法(核心🌟)
- 4. 代码拆解法(核心🌟)
- 5. 进入类里观察法
- 6. B站视频法
0.背景
很多同学在深度学习的学习过程中,最头疼的就是看代码,觉得自己看一句不会一句,容易陷入恶性循环。
本教程旨在为大家总结一套基本的代码阅读方法和技巧,帮助大家能够顺利地把代码读通顺。
提前罗列一下方法:
总结一下,方法按照使用顺序包括:
- 翻译法(推断法)
- 百度法(检索法)
- 打印测试法(核心🌟)
- 代码拆解法(核心🌟)
- 进入类里观察法
- 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基础的代码学习者,都会遇到上面一堆困难,一堆问题。
- 首先,通过提问题的方式对代码进行拆解,上面已经通过大量的疑问句把这个代码拆解成了很多小段了?
- 拆解完成之后就是利用上面讲过的方法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站视频法