《动手学深度学习》——第二章习题及自写答案

news2024/10/6 17:48:05

文章目录

  • 2.1 数据操作
    • 练习1
    • 练习2
  • 2.2 数据预处理
    • 练习1
    • 练习2
  • 2.3 线性代数
    • 练习1
    • 练习2
    • 练习3
    • 练习4
    • 练习5
    • 练习6
    • 练习7
    • 练习8
  • 2.4 微积分
    • 练习1
    • 练习2
    • 练习3
    • 练习4
  • 2.5 自动微分
    • 练习1
    • 练习2
    • 练习3
    • 练习4
    • 练习5
  • 2.6 概率
    • 练习1
    • 练习2
    • 练习2
    • 练习2

2.1 数据操作

练习1

运⾏本节中的代码。将本节中的条件语句 X = = Y X == Y X==Y更改为 X < Y X < Y X<Y X > Y X > Y X>Y,然后看看你可以得到什么样的张量。
在这里插入图片描述

练习2

用其他形状(例如三维张量)替换⼴播机制中按元素操作的两个张量。结果是否与预期相同?
在这里插入图片描述

2.2 数据预处理

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

  1. 删除缺失值最多的列。
  2. 将预处理后的数据集转换为张量格式。

练习1

在这里插入图片描述
在这里插入图片描述

练习2

在这里插入图片描述

2.3 线性代数

练习1

证明⼀个矩阵A的转置的转置是A,即(A) = A。
在这里插入图片描述

练习2

给出两个矩阵A和B,证明“它们转置的和”等于“它们和的转置”,即A + B = (A +B)

在这里插入图片描述

练习3

给定任意⽅阵A,A + A总是对称的吗?为什么?
是的。设A是一个n×n的方阵,那么它的转置A也是一个n×n的方阵,满足(A)ij = Aji,其中i,j=1,2,…,n。那么A + A也是一个n×n的方阵,满足(A + A)ij = Aij + (A)ij = Aij + Aji,其中i,j=1,2,…,n。由于(A + A)ij = (A + A)ji对所有的i和j都成立,所以A + A是对称的。

练习4

本节中定义了形状(2, 3, 4)的张量X。len(X)的输出结果是什么?
在这里插入图片描述

练习5

对于任意形状的张量X,len(X)是否总是对应于X特定轴的⻓度?这个轴是什么?

对于高维张量,len()函数只能返回第一维大小,而不能返回其他维度的大小。因此,如果需要获取张量的其他维度大小,需要使用张量对象的shape属性。
在这里插入图片描述

练习6

运⾏A/A.sum(axis=1),看看会发⽣什么。请分析⼀下原因?
在这里插入图片描述
原因:这个错误出现的原因是在执行A/A.sum(axis=1)时,张量A的第一维大小为5,而A.sum(axis=1)返回的张量的第一维大小为4。由于这两个张量在第一维上的大小不同,所以无法进行逐元素的除法运算。
在这里插入图片描述

解决:要解决这个问题,需要将A.sum(axis=1)返回的张量的形状与A相同。可以通过在调用sum函数时指定参数keepdims=True来保持维度不变,然后使用broadcasting机制将A.sum(axis=1)的形状扩展为(5, 1)
在这里插入图片描述

练习7

考虑⼀个具有形状 ( 2 , 3 , 4 ) (2, 3, 4) (2,3,4)的张量,在轴 0 、 1 、 2 0、1、2 012上的求和输出是什么形状?
在这里插入图片描述

练习8

linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?

torch.linalg.norm函数torch.linalg.norm()函数可以用于计算张量的范数。当给定多维张量时,可以通过指定参数dim来计算指定轴上的范数。如果给定了多个轴,则会计算这些轴上的范数并返回一个形状更小的张量。

范数是一个将向量映射到非负值的函数,它度量了向量的大小或长度。在数学中,范数是一个广义的概念,包括了向量空间中的向量大小的不同度量方式。在机器学习和深度学习中,范数通常指的是向量的欧几里德范数(L2范数)和向量的曼哈顿范数(L1范数)。

范数在机器学习和深度学习中有很多应用,其中一些应用包括:

正则化:范数可以用于正则化,通过添加一个范数惩罚项来限制模型的复杂度,以避免过拟合。例如,在逻辑回归和线性回归等模型中,可以通过添加L1或L2范数惩罚项来实现正则化。

相似性度量:范数可以用于计算向量之间的相似性度量。例如,可以使用余弦相似度或欧几里德距离等度量来比较两个向量之间的相似性。

数据预处理:范数可以用于数据预处理,例如对数据进行归一化或标准化。通过将向量除以其范数,可以将向量归一化为单位向量,这有助于处理某些机器学习任务,如聚类和分类。
在这里插入图片描述
错误原因:矩阵内的数值必须为浮点数。
在这里插入图片描述

2.4 微积分

练习1

绘制函数 y = f ( x ) = x 3 − 1 x y = f(x) = x^3 −\frac{1}{x} y=f(x)=x3x1和其在 x = 1 x = 1 x=1处切线的图像。

# 导入模块
import matplotlib.pyplot as plt
import numpy as np

# 定义函数和导数
def f(x):
    return x**3 - 1/x

def f_prime(x):
    return 3*x**2 + 1/x**2

# 生成x值的数组
x = np.linspace(-5, 5, 100)

# 计算y值和切线斜率的数组
y = f(x)
m = f_prime(x)

# 绘制函数曲线
plt.plot(x, y, label="f(x)")

# 绘制切线
# 切点的x坐标
x0 = 1
# 切点的y坐标
y0 = f(x0)
# 切线的斜率
m0 = f_prime(x0)
# 切线的截距
b0 = y0 - m0 * x0
# 切线的方程
def tangent_line(x):
    return m0 * x + b0

# 切线的y值的数组
y_tangent = tangent_line(x)

# 绘制切线
plt.plot(x, y_tangent, label="tangent line")

# 显示图像
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

在这里插入图片描述

练习2

求函数 f ( x ) = 3 x 1 2 + 5 e x 2 f(x) = 3x_1^2 + 5e^{x_2} f(x)=3x12+5ex2的梯度。

梯度为: ( 6 x 1 , 5 e X 2 ) (6x_1, 5e^{X_2}) (6x1,5eX2)

练习3

函数 f ( x ) = ∥ x ∥ 2 f(x) = ∥x∥_2 f(x)=x2的梯度是什么?

范数: ∣ ∣ x ∣ ∣ ||x|| ∣∣x∣∣表示 x x x的范数,也就是 x x x的长度或大小。

∣ ∣ X ∣ ∣ 2 ||X||_2 ∣∣X2为第二范数

在这里插入图片描述

练习4

尝试写出函数 u = f ( x , y , z ) u = f(x, y, z) u=f(x,y,z),其中 x = x ( a , b ) , y = y ( a , b ) , z = z ( a , b ) x = x(a, b),y = y(a, b),z = z(a, b) x=x(a,b)y=y(a,b)z=z(a,b)的链式法则。
在这里插入图片描述

2.5 自动微分

练习1

为什么计算⼆阶导数⽐⼀阶导数的开销要更⼤?

因为计算二阶导数要在一阶导数的基础上再进行求导,这就需要构建新的计算图,保存更多的中间结果,占用更多的内存和计算资源。而计算一阶导数只需要沿着原有的计算图反向传播梯度值,不需要额外的开销。

练习2

在运⾏反向传播函数之后,⽴即再次运⾏它,看看会发⽣什么。
在这里插入图片描述
在这里插入图片描述
这意味着你试图对一个已经释放了计算图的张量进行反向传播,这是不允许的。当你调用.backward()autograd.grad()时,计算图中的中间值会被释放,以节省内存。如果你需要对同一个张量进行第二次反向传播或者在调用.backward()后访问保存的张量,你需要在第一次调用.backward()时指定retain_graph=True参数,以保留计算图。
在这里插入图片描述

练习3

在控制流的例⼦中,我们计算d关于a的导数,如果将变量a更改为随机向量或矩阵,会发⽣什么?
在这里插入图片描述
在调用backward()方法之前,需要确保输出张量是一个标量,否则将会引发与之类似的错误。

在PyTorch中,计算图是动态构建的,即在每次计算中重新构建一次计算图。因此,将张量作为函数的输出时,需要指定一个标量值作为损失函数,以便计算梯度。反向传播的过程是从损失函数开始,逐步向前计算每个计算步骤的梯度,直到达到需要求解的变量为止。因此,反向传播的计算过程必须以标量输出为起点。

在PyTorch中,如果将一个非标量张量作为函数的输出,那么在调用backward()方法时,将会收到一个RuntimeError异常,提示"grad can be implicitly created only for scalar outputs"。这是因为计算梯度需要沿着计算图向后传播,而非标量输出会导致计算图的多个分支汇聚在一起,无法确定要计算哪个分支的梯度,因此无法正确计算梯度。

因此,为了进行反向传播,需要将输出张量降维为标量,以便能够计算梯度。在降维过程中,可以使用一些常见的降维函数,如mean()、sum()等,将张量的所有元素合并为一个标量。
在这里插入图片描述

练习4

重新设计⼀个求控制流梯度的例⼦,运⾏并分析结果。
在这里插入图片描述
这段代码定义了一个函数f(x),它接受一个三行三列的张量x作为输入,然后对x进行三次循环,每次循环都把x乘以2,如果x的元素之和大于10,就把x的每个元素减去1,最后返回x。然后,它创建了一个随机生成的三行三列的张量x,并且设置了requires_grad为True,表示需要计算x的梯度。接着,它调用f(x)得到y,并对y的元素之和求导,得到x的梯度。最后,它打印出x的梯度。

结果显示,x的梯度是一个全为8的三行三列的张量。这是因为y是x的线性函数, y = 8 x − c y = 8x - c y=8xc,其中c是一个常数。因此,y对x的偏导数就是8。当我们对y的元素之和求导时,相当于对每个元素求导再求和,所以结果就是8乘以9(元素个数),即72。由于我们使用了backward()方法,它会自动把72分配给每个元素,所以x的梯度就是全为8的张量。

练习5

使 f ( x ) = s i n ( x ) f(x) = sin(x) f(x)=sin(x),绘制 f ( x ) f(x) f(x) d f ( x ) d x \frac{df(x)}{dx} dxdf(x)的图像,其中后者不使⽤ f ( x ) = c o s ( x ) f(x) = cos(x) f(x)=cos(x)
绘制f(x)的代码
绘制f(x)的图像
绘制f‘(x)的代码
绘制f’(x)的图像

2.6 概率

练习1

进⾏ m = 500 m = 500 m=500组实验,每组抽取 n = 10 n = 10 n=10个样本。改变 m m m n n n,观察和分析实验结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习2

给定两个概率为 P ( A ) P(A) P(A) P ( B ) P(B) P(B)的事件,计算 P ( A ∪ B ) P(A ∪ B) P(AB) P ( A ∩ B ) P(A ∩ B) P(AB)的上限和下限。(提示:使⽤友元图来展示这些情况。)

P ( A ∪ B ) P(A ∪ B) P(AB)的上限以及 P ( A ∩ B ) P(A ∩ B) P(AB)的下限:
在这里插入图片描述
P ( A ∪ B ) P(A ∪ B) P(AB)的下限以及 P ( A ∩ B ) P(A ∩ B) P(AB)的上限:

在这里插入图片描述

练习2

假设我们有⼀系列随机变量,例如 A 、 B A、B AB C C C,其中 B B B只依赖于 A A A,⽽ C C C只依赖于 B B B,能简化联合概率 P ( A , B , C ) P(A, B, C) P(A,B,C)吗?(提⽰:这是⼀个马尔可夫链。)

由于B只依赖于A,可知
P ( B ∣ A , C ) = P ( B ∣ A ) P(B|A, C) = P(B|A) P(BA,C)=P(BA)
由于B只依赖于A,可知
P ( C ∣ A , B ) = P ( C ∣ B ) P(C|A, B) = P(C|B) P(CA,B)=P(CB)
可得:
P ( A , B , C ) = P ( C ∣ A , B ) P ( A , B ) = P ( C ∣ A , B ) P ( B ∣ A ) P ( A ) = P ( C ∣ B ) P ( B ∣ A ) P ( A ) \begin{aligned} P(A, B, C)&= P(C|A, B)P(A, B)\\ &=P(C|A, B)P(B|A)P(A)\\ &=P(C|B)P(B|A)P(A) \end{aligned} P(A,B,C)=P(CA,B)P(A,B)=P(CA,B)P(BA)P(A)=P(CB)P(BA)P(A)

练习2

在 2.6.2节中,第⼀个测试更准确。为什么不运⾏第⼀个测试两次,⽽是同时运⾏第⼀个和第⼆个测试?

现实中我们不会让病人进行两次同种检验,另外如果进行相继两次的第一种测试,得到都为阳性的结果患者得病的概率为 1 − ( 1 − 0.1307 ) 2 = 0.24431751000000002 1-(1-0.1307)^2=0.24431751000000002 1(10.1307)2=0.24431751000000002,更加不现实了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路飞IT黑金实战项目教学

正在代理路飞IT全学科实战项目5年黑金卡 (订阅本专栏即可赠送5年黑金会员卡&#xff0c;订阅前联系博主更有折享优惠&#xff0c;每篇文章下都有联系方式) 包含Python开发、Linux云计算、前端开发、Golang开发、AI & 数据分析、网络安全、技术生涯、C语言、JAVA开发、测试…

elasticsearch查询操作(API方式)

说明&#xff1a;elasticsearch查询操作除了使用DSL语句的方式&#xff08;参考&#xff1a;http://t.csdn.cn/k7IGL&#xff09;&#xff0c;也可以使用API的方式。 准备 使用前需先导入依赖 <!--RestHighLevelClient依赖--><dependency><groupId>org.ela…

GitHub发布Copilot Chat公测版,助力开发者编写代码

近日微软GitHub推出了Copilot Chat 的公开测试版&#xff0c;而这个版本不仅仅局限于“代码缺省补充”与“代码纠错”&#xff0c;还能直接基于上文&#xff0c;自动联想出后文。 据了解&#xff0c;该AI工具主要用来助力开发者编写代码&#xff0c;可直接集成到开发者的桌面 …

如何将ubuntu LTS升级为Pro

LTS支持周期是5年&#xff1b; Pro支持周期是10年。 Ubuntu Pro专业版笔记 步骤&#xff1a; 打开“软件和更新” 可以看到最右侧的标签是Ubuntu Pro。 在没有升级之前&#xff0c;如果使用下面两步&#xff1a; sudo apt updatesudo apt upgrade 出现如下提示&#xff…

Zabbix邮件报警(163网易邮箱)

目录 一、电脑登录网易邮箱配置 二、Server端安装配置邮件服务器 邮箱查看 三、编辑zabbix_server.conf 引用邮件脚本 查看邮件 五、配置zabbix web监控项邮件报警 操作思路 Server.zabbix.com web操作 确认报警媒介信息 配置zabbix中的用户所使用的报警媒介类型以及接收邮…

AI绘画StableDiffusion实操教程:月光下的美人(含高清图片)

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 今天继续分享AI绘画实操教程&#xff0c;如何用lora包生成超真实好看质感超强的人物图片。 放大高清图已放到教程包内&#xff0c;需要的可以自取。 出图效果&#xff1a; 更多图片资源访问查看&#xff1a; 教程整合资源…

【代码随想录day20】合并二叉树

题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠…

Redis在云服务器上的安装与客户端连接配置

文章目录 Redis1.Redis的安装2.设置远程连接3.客户端连接3.1 客户端下载 Redis 1.Redis的安装 yum 安装 redis&#xff0c;使用以下命令&#xff0c;直接将 redis 安装到 linux 服务器&#xff1a; yum -y install redis 启动 redis使用以下命令&#xff0c;以后台运行方式启…

面试之CurrentHashMap的底层原理

首先回答HashMap的底层原理? HashMap是数组链表组成。数字组是HashMap的主体&#xff0c;链表则是主要为了解决哈希冲突而存在的。要将key 存储到&#xff08;put&#xff09;HashMap中&#xff0c;key类型实现必须计算hashcode方法&#xff0c;默认这个方法是对象的地址。接…

git账号修改密码后命令不能拉取代码,报错无权限

解决办法&#xff1a; 1.git命令 查看账号密码&#xff0c;修改密码&#xff0c;如下图 2.设置window git 凭证 3. 完成 &#xff0c;git命令拉去代码成功

九五从零开始的运维之路(其二十五)

文章目录 前言一、概述二、配置环境及搭建服务1.关闭防火墙、网络图形化工具及SElinux2.配置yum源3.测试网络连通性4.分配磁盘容量5.安装targetcli包6.服务器端进行配置7.客户端 总结 前言 本篇将简述的内容&#xff1a;Linux系统下的ISCSI服务 一、概述 iscsi全称&#xff1…

Spring Boot实践一

一、Spring Boot简介 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、方便的方式来创建基于Spring的应用程序&#xff0c;而无需繁琐的配置。Spring Boot通过自动配置和约定大于配置的方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&…

电容笔和触控笔两者有哪些区别?比较好用的电容笔

与最初推出的那些触控笔相比&#xff0c;目前的电容笔更具有一些独特的特性&#xff0c;比如可以防止手在屏幕上误触&#xff0c;以及可以随意调节线条粗细。苹果的原装Pencil的价格目前也非常昂贵。因此&#xff0c;如果你没有足够的预算&#xff0c;那么你最好选择一支平替电…

装修行业专用装修设计施工团队工地进度小程序开发

互联网高速发展带来的就是大家越来越依赖互联网&#xff0c;从衣食住行都在向互联网整合​。传统的装修行业借助互联网也诞生了新的营销引流​方法。 以前装修房子大家都会参考邻居、朋友、亲戚&#xff0c;但现在不同了&#xff0c;互联网帮助很多人在线上了解装修公司、装修…

探讨ChatGPT的强化学习:AI学习与交互的未来

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Vue3学习组合式API(二)

1、计算属性compute <script setup> //导入 import {ref, computed } from vue const state ref(0) //原始数据 const count ref(1); //计算属性 const doubleCount computed(()>count.value*2);//原始数据 const list ref([1,2,3,4,5,6,7,8]); //list属性值 con…

【Linux】详解线程控制 -- 线程用法 | 线程等待 | 线程ID及地址空间布局

OS提供的轻量级进程接口POSIX线程库 线程使用1.如何创建一堆线程2.线程如何终止3.线程如何取消 线程等待线程退出返回值C11的多线程线程ID及地址空间布局线程地址空间布局线程局部存储 分离线程 OS提供的轻量级进程接口 (关于 用户 → 库 → OS :具体可看下面线程地址空间布局)…

好用亦免费的系统镜像备份软件!

​Windows系统现状 Windows系统备份的重要性日益凸显。随着Windows 7退出历史舞台,Windows 11/10的使用率快速上升。新电脑不再支持Windows 7,许多用户只能转向更新系统。加之Windows 11功能趋于成熟稳定,越来越多人开始适应并接受它。 因此,选择一个适合Windo…

马上做还是等一下?

马上做还是等一下&#xff1f;这是一个产品人经常会遇到的问题。今天想跟大家分享的是面临这两个选择的两个场景和一些感悟。 图1 - 我们总会遇到各种各样的问题&#xff0c;难以抉择 场景一&#xff1a;当你接到一项工作时&#xff0c;会选择高效执行马上开始&#xff0c;还是…

前端图标解决方案

1. 前言 随着 Web 技术的发展与日益丰富的界面需求&#xff0c;图标逐渐成为前端开发中不可或缺的一部分&#xff0c;为此也诞生了各种各样的解决方案。文章总结及分析了目前常见的一些图标解决方案。 2. CSS 背景图片 2.1 background-image 图标本质上也是图片&#xff0c…