动手学深度学习pytorch版练习解答——3-2线性回归的从零开始实现

练习

  1. 如果我们将权重初始化为零,会发⽣什么。算法仍然有效吗?

\qquad 解:全0初始化也是常用的一个选择,跟正态分布初始化相比可能会走向不同的局部最优点,算法还是有效的。

  1. 假设你是乔治·西蒙·欧姆,试图为电压和电流的关系建⽴⼀个模型。你能使⽤⾃动微分来学习模型的参数吗?

\qquad 解:题例中电流当做features,电压当做labels,描点绘图后发现二者呈线性关系,再用书上的代码走一遍即可。

  1. 您能基于普朗克定律使⽤光谱能量密度来确定物体的温度吗?

\qquad 解:能量密度频谱u关于波长的函数是:

动手学深度学习pytorch版练习解答——3-2线性回归的从零开始实现_第1张图片

\qquad 写成温度关于能量密度的函数,即:

动手学深度学习pytorch版练习解答——3-2线性回归的从零开始实现_第2张图片

  1. 如果你想计算⼆阶导数可能会遇到什么问题?你会如何解决这些问题?

\qquad 解:遇到的问题应该是一阶导函数计算式无法直接获取。解决方法:求一阶导数保存计算图。具体方法见后面代码。

  1. 为什么在squared_loss函数中需要使⽤reshape函数?

\qquad 解: y ^ \hat{y} y^是列向量, y y y是行向量

  1. 尝试使⽤不同的学习率,观察损失函数值下降的快慢。

\qquad 解:这个没有统一的答案,跑模型时自己记录下当前学习率和训练时间再比较即可。

  1. 如果样本个数不能被批量⼤小整除,data_iter函数的⾏为会有什么变化?

\qquad 解:执行到最后所剩样本数不能被整除,会报错

第四问代码学习,参考pytorch autograd计算标量函数二阶导数
动手学深度学习pytorch版练习解答——3-2线性回归的从零开始实现_第3张图片

#第4问求二阶导数:f(x)=x^2+sinx→f'(x)=2x+cosx→f''(x)=2-sinx
#这里取x=π/2,π
import math
import torch
import numpy as np

x = torch.tensor([math.pi/2,math.pi],requires_grad=True)
y = x**2 + torch.sin(x)

#和真实值比较
true_dy = 2*x+torch.cos(x)#这个结果有两个量,一个是张量另一个是梯度类型
true_d2y = 2 - torch.sin(x)

#求出一阶导,保存计算图后再去求二阶导
dy = torch.autograd.grad(y,x,
                         grad_outputs=torch.ones(x.shape),#这个参数要人为指定好
                         create_graph=True,
                         retain_graph=True#保存计算图
                        )
#在张量后加上.detach().numpy()可以仅输出张量数值
print("一阶导真实值:{} \n一阶导计算值:{}".format(true_dy.detach().numpy(),dy[0].detach().numpy()))

#求二阶导。上面的dy的第一个元素是一阶导数值
d2y = torch.autograd.grad(dy[0],x,
                         grad_outputs=torch.ones(x.shape),
                         create_graph=False#不再弄计算图,销毁前面的计算图
                         )
print("\n二阶导真实值:{} \n二阶导计算值:{}".format(true_d2y.detach().numpy(),d2y[0].detach().numpy()))

你可能感兴趣的:(pytorch,深度学习,线性回归)