创建包含更多行和列的原始数据集。
- 删除缺失值最多的列。
- 将预处理后的数据集转换为张量格式。
import numpy as np
import torch
import pandas as pd
df=pd.read_excel('D:/pycharmdata/data/2-2.xlsx')
df.isnull().sum()#计算每列的缺失值
inputs,outputs = df.iloc[:, 0:2],df.iloc[:,2]
null_num=df.isnull().sum(axis=0).tolist()
maxnum=max(null_num)
ind=data.index(maxnum)#找出缺失值最多的列
df.drop(df.columns[1],axis=1)#删除缺失值最多的列
df = pd.get_dummies(df, dummy_na=True)#二元化
df=torch.tensor(df.values)
- 运行A/A.sum(axis=1),看看会发生什么。你能分析原因吗?
- 考虑一个具有形状 (2,3,4) 的张量,在轴0、1、2上的求和输出是什么形状?
- 为linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?
2.3.1
# 1.
import torch
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
A/A.sum(axis=0)
2.3.2
# 2.
import torch
A=torch.arange(24,dtype=torch.float32).reshape(2,3,4)
A
2.3.3
A.sum(axis=0),A.sum(axis=1),A.sum(axis=2)
axis=0时为对应元素相加,axis=1时按列相加,axis=2时按行相加。
import torch
import numpy as np
from matplotlib import pyplot as plt
from IPython import display
from d2l import torch as d2l
def f(x):
return x**3-1/x
x=np.arange(0,3,0.1)
plt.rc('font',size=16)
plt.rc('text',usetex=True)
plt.gcf().set_facecolor(np.ones(3)* 240 / 240) # 生成画布的大小
plt.grid() # 生成网格
plt.plot(x, f(x),label='$f(x)$',linewidth=2)
plt.plot(x,4*x-4,'--',label='$4*x-4$',linewidth=2)
plt.legend()
- 为什么计算二阶导数比一阶导数的开销要更大?
- 在运行反向传播函数之后,立即再次运行它,看看会发生什么。
- 在控制流的例子中,我们计算d关于a的导数,如果我们将变量a更改为随机向量或矩阵,会发生什么?
- 重新设计一个求控制流梯度的例子,运行并分析结果。
- 使 f(x)=sin(x) ,绘制 f(x) 和 df(x)dx 的图像,其中后者不使用 f′(x)=cos(x) 。
2.5.1
二阶导数是在计算一阶导数的基础上进行的,所以开销大
2.5.2
Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved tensors after calling backward.
程序在试图执行backward的时候,发现计算图的缓冲区已经被释放。
2.5.3
def f(a):
b = a * 2
while b.norm() < 1000:
b = b * 2
if b.sum() > 0:
c = b
else:
c = 100 * b
return c
a = torch.arange(25,dtype=torch.float32).reshape(5,5)
d = f(a)
d.backward()
run time error if a is vector or matrix RuntimeError: grad can be implicitly created only for scalar outputs d.sum().backward() #<===== this way it will work
2.5.4
2.5.5
import numpy as np
x = np.linspace(-3*np.pi, 3*np.pi, 100)
x=torch.tensor(x,requires_grad=True)
y=torch.sin(x1)
y.sum().backward()
import matplotlib.pyplot as plt
plt.plot(x.detach().numpy(),np.sin(x.detach().numpy()),label='sin(x)')
plt.plot(x.detach().numpy(),x.grad,label='df')
plt.legend()