2022.10.6 李沐花书:3 线性神经模型:代码部分(上)
保姆试批注
3.1.2 矢量化加速
目的就是产品,数据矢量化计算,比用循环,运行效率大大提高·
%matplotlib inline
# 这个是matplotlib在jupyter用的插件
import math
import time
import numpy as np
import torch
# 这个包是李沐老师自己的包
from d2l import torch as d2l
n = 10000
# 一万个数,我们将a,b分别变成1万个1的张量
a = torch.ones(n)
b = torch.ones(n)
print("a",a)
a.type()
a tensor([1., 1., 1., …, 1., 1., 1.])
‘torch.FloatTensor’
# 定义一个计时器Timer:
# 注释#@save是一个特殊的标记,会将对应的函数、类或语句保存在d2l包中。 因此,以后无须重新定义就可以直接调用它们(例如,d2l.use_svg_display())
class Timer: #@save
"""记录多次运行时间"""
#Timer函数 定义了 两个内容:一个是记录时间的 列表;一个start函数
def __init__(self):
self.times = []
self.start()
# start函数:调用了时间函数time(),记录开始的时间
def start(self):
"""启动计时器"""
self.tik = time.time()
# 调用时间函数,减去开始时间,并记录在列列表中
def stop(self):
"""停止计时器并将时间记录在列表中"""
self.times.append(time.time() - self.tik)
return self.times[-1]
def avg(self):
"""返回平均时间"""
return sum(self.times) / len(self.times)
def sum(self):
"""返回时间总和"""
return sum(self.times)
def cumsum(self):
"""返回累计时间"""
return np.array(self.times).cumsum().tolist()
https://blog.csdn.net/Acrab_Chogori/article/details/125786517
# n=10000个0的张量
# 用for循环 计算 两个10000维张量的相加的时间
c = torch.zeros(n)
timer = Timer()
for i in range(n):
c[i] = a[i] + b[i]
f'{
timer.stop():.5f} sec'
‘0.11368 sec’
# 直接矢量化计算
timer.start()
d = a + b
print(d)
f'{
timer.stop():.5f} sec'
tensor([2., 2., 2., …, 2., 2., 2.])
‘0.00104 sec’
3.1.3 正态分布实现和可视化
本部分内容就是让读者了解一下 正态分布,可视化咋实现的 了解一下即可
# 正态分布函数:输入x ,mu是均值,sigma是方差 输出就是来率密度函数
def normal(x, mu, sigma):
p = 1 / math.sqrt(2 * math.pi * sigma**2)
return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)
# 再次使用numpy进行可视化
# 这个就是想取值 从-7到7每0.01取一个值
x = np.arange(-7, 7, 0.01)
# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
# d2l.plot()描绘了图像:xlabel:x轴叫啥名; figsize是图像尺寸;legend是标签 左上角那块白的
# mean 是均值 std是方差
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',
ylabel='p(x)', figsize