李沐——动手学深度学习课后作业

二、预备知识

2.2 数据预处理

创建包含更多行和列的原始数据集。

  1. 删除缺失值最多的列。
  2. 将预处理后的数据集转换为张量格式。
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)

2.3 线性代数

  1. 运行A/A.sum(axis=1),看看会发生什么。你能分析原因吗?
  2. 考虑一个具有形状 (2,3,4) 的张量,在轴0、1、2上的求和输出是什么形状?
  3. 为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时按行相加。

2.4 微积分

在这里插入图片描述

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()

在这里插入图片描述

2.5 自动微分

  1. 为什么计算二阶导数比一阶导数的开销要更大?
  2. 在运行反向传播函数之后,立即再次运行它,看看会发生什么。
  3. 在控制流的例子中,我们计算d关于a的导数,如果我们将变量a更改为随机向量或矩阵,会发生什么?
  4. 重新设计一个求控制流梯度的例子,运行并分析结果。
  5. 使 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()

在这里插入图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一——一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值