P1-P5_动手学深度学习-pytorch(李沐版,粗浅的笔记)


  说明:该文章是学习 李沐老师在B站上分享的视频 动手学深度学习 PyTorch版而记录的笔记, 版权归李沐老师以及老师背后的团队所有,为了节省时间,笔记仅仅是粗浅的截图以及贴上代码,作用仅仅是复习以及忘了方便到b站上进行回看,以及方便更多的人学习。 若有侵权,请联系本人删除。笔记难免可能出现错误或笔误,若读者发现笔记有错误,欢迎在评论里批评指正。另外 部分内容直接由镜像GPT生成,请自行注意甄别
  笔记可能更新缓慢,建议去b站观看完整视频。
  其他参考链接: Windows 下安装 CUDA 和 Pytorch 跑深度学习 - 动手学深度学习v2python数据分析神器Jupyter notebook快速入门也许是B站最好的 Markdown 科普教程Markdown的官方文档

课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/

预告

在这里插入图片描述

  1.学习深度学习的关键是动手

在这里插入图片描述

  2.什么是《动手学深度学习》

在这里插入图片描述

  3.曾经推出的版本(含github链接)

在这里插入图片描述

含github链接:https://github.com/d2l-ai/d2l-zh

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

一、课程安排

  1.目标

在这里插入图片描述

  2.内容

在这里插入图片描述

  3.上课形式

在这里插入图片描述

  4.你将学到什么

在这里插入图片描述

  5.资源

在这里插入图片描述

课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/

二、深度学习的介绍

在这里插入图片描述

  1.AI地图

在这里插入图片描述

  2.深度学习在一些应用上的突破

  图片分类、物体检测和分割、样式迁移、人脸合成、文字生成图片、文字生成、无人驾驶、广告点击等。
在这里插入图片描述

http://www.image-net.org/

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

https://github.com/matterport/Mask_RCNN

在这里插入图片描述

https://github.com/StacyYang/MXNet-Gluon-Style-Transfer

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

https://openai.com/blog/dall-e/

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

  3.案例研究一广告点击

在这里插入图片描述
在这里插入图片描述
  简单的机器学习包括特征提取、模型的预测。
在这里插入图片描述

三、安装

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

# 1.[可选]使用conda/miniconda环境
conda env remove d2l-zh
conda create -n -y d2l-zh python=3.8 pip
conda activate d2l-zh
# 2.安装需要的包
pip install -y jupyter d2l torch torchvision
# 3.下载代码并执行
wget https://zh-v2.d2l.ai/d2l-zh.zip
unzip d2l-zh.zip
jupyter notebook

  关于安装这块,初学者可能大家跟我一样看不懂云端的配置方法,故请切换到李沐老师的非云端的环境配置方法的视频:Windows 下安装 CUDA 和 Pytorch 跑深度学习 - 动手学深度学习v2

  1.Windows下的安装CUDA

  首先,如下图所示,使用快捷键"Win+R"打开运行窗口,然后输入“dxdiag”并回车。然后点击“显示”,查看电脑是否有NVIDIA的GPU,如果没有,本安装方法不适用。

dxdiag

在这里插入图片描述
在这里插入图片描述
  接下来我们去Nvidial的官网下载CUDA。可直接搜素“CUDA”,点击“CUDA Toolkit 11.6 Downlo…”。然后根据自己的电脑选择合适的参数,选择本地安装,点击“Download”即可进行下载。(注意:此处版本最好安装11.8或12.1的,2023.10.5注明,此时PyTorch最新支持这两个版本。建议大家在选择版本前,先到Pytorch官网(“https://pytorch.org/”)看看。)
在这里插入图片描述
在这里插入图片描述
  双击安装。
在这里插入图片描述
  选择安装目录,点击“OK”。
在这里插入图片描述
  点击“继续”。(未安装过CUDA的可能不会出现这个页面。)
在这里插入图片描述
  接着按下面一堆图所示操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  2.验证CUDA是否安装成功

  如下图,打开命令行窗口。
在这里插入图片描述
  然后输入命令“nvidia-smi”,能查到CUDA的版本号,说明CUDA安装成功。

nvidia-smi

在这里插入图片描述

  3.下载并安装一个Python环境(安装Miniconda)

  首先进入“Conda”(链接“https://docs.conda.io/en/latest/”),然后点击“Miniconda”,点击“Miniconda3 Windows 64-bit”。
在这里插入图片描述
在这里插入图片描述
  如下一堆图所示进行安装。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  然后如下图所示查看安装的Python环境。

python --version   # 查看安装的Python环境

在这里插入图片描述

  4.到Pytorch官网下载对应的GPU版本

  接着到到Pytorch官网(“https://pytorch.org/”)下载对应的GPU版本。发现刚刚装的CUDA(版本11.6)不是最新的,于是选择版本11.8的,版本差异最小,有点小问题。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

在这里插入图片描述
  然后到”Anaconda Prompt“去执行刚刚复制的pip命令。
在这里插入图片描述
  安装完后,我们尝试在GPU上运行一个简单的Python程序,验证是否有问题。结果发现程序能够正常运行,说明没有问题。(本人代码输错了好几次,请忽略)

python   # 进入python
import torch
a=torch.ones((3,1))
a=a.cuda(0)
b=torch.ones((3,1)).cuda(0)
a+b

在这里插入图片描述

  5.运行一个深度学习的应用(安装jupyter和d2l;下载d2I记事本,运行测试)

  打开教材官网:https://zh-v2.d2l.ai。然后下载记事本并解压。
在这里插入图片描述
  接着退出python,再安装两个包:jupyter和d2l。

quit()  # 退出python
pip install jupyter d2l  # 安装两个包:jupyter和d2l

在这里插入图片描述
  如下图所示启动”jupyter notebook“,会自动打开一个浏览器窗口。

jupyter notebook  # 启动”jupyter notebook“

在这里插入图片描述
在这里插入图片描述
  然后类似下面的路径,找到”resnet.ipynb“并点击。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  接着,选择”Kernel“,点击运行所有的选项”Restart Kernel and Run All Cells…“。点击”Restart“。
在这里插入图片描述
在这里插入图片描述
  然后将页面拖到最后,发现模型已经跑了起来。打开”Anaconda Powershell Promp…“,输入”nvidia-smi“查看GPU的使用率。

nvidia-smi   # 查看GPU的使用率

在这里插入图片描述
在这里插入图片描述
  等模型跑完后,打开教材对应的地方,对比两次的结果。
在这里插入图片描述

  6.本次总结

在这里插入图片描述

四、数据操作+数据预处理

  1.数据操作

在这里插入图片描述

  (1)N维数组样例

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

  (2)创建数组

在这里插入图片描述

  (3)访问元素

在这里插入图片描述

  2.数据操作实现

  (1)补充:Jupyter的入门

  关于Jupyter notebook的使用,大家可以随便找个视频学习一下,比如本人观看了下面的视频:python数据分析神器Jupyter notebook快速入门
在这里插入图片描述
  需要知道(由于Jupyter的改版,部分操作有所变化):

注:这些内容均来源于刚刚的链接,只是少部分由于Jupyter的改版,操作有所变化
1.特点:把代码和文本变成单元格,可逐步运行单元格或运行部分单元格。
2.优点:
-1.学习简单,掌握十几个快捷键即可飞速入门。
-2.Jupyter是以代码块和单元格为单位进行运行的。优点:容易查看中间变量,易调试,方便找出bug。
-3.可插入markdown的说明性文字。
3.安装
pip install jupyter # 安装jupyter包
4.新建文件
- New-选择需要创建的文件类型或者文件夹等
5.打开方式以及创建“jupyter”文件
- 打开命令行窗口,输入命令”jupyter notebook“即可打开。(注意:如果是跟着本笔记走的,得去“Anaconda Prompt”中打开,因为是在那里面安装的jupyter包,否则不能启动jupyter)
jupyter notebook  # 启动”jupyter notebook“,让浏览器使用jupyter打开当前目录
- 浏览器使用jupyter打开当前目录后,然后寻找jupyter文件。第一次使用可能没有jupyter文件,此时选择一个合适的目录,然后右击“New Notebook”创建“.ipynb”的jupyter notebook文件
- 选择语言类型,点击“Select”,即可成功创建文件。
6.文档编辑
- 自行学习markdown的编写方式以及听刚刚给出的链接的视频
- 分为命令模式和编辑模式
- 公式可使用LaTeX代码
7.快捷键
- 查看快捷键:Help-Show Keyboard Shortcuts。下面是将快捷键复制出来经翻译后的结果,个别是补充的:
** 命令模式 ESC
** 重新做 Ctrl + Shift + Z
** 撤销 Ctrl + Z
中断内核 I + I
重新启动内核… 0 + 0
** 切换到代码单元格类型 Y
切换到标题1 1
切换到标题2 2
切换到标题3 3
切换到标题4 4
切换到标题5 5
切换到标题6 6
** 切换到Markdown单元格类型 M
切换到原始单元格类型 R
折叠所有标题 Ctrl + Shift + ArrowLeft
** 复制单元格 C
** 剪切单元格 X
** 删除单元格 D + D
** 进入编辑模式 Enter
展开所有标题 Ctrl + Shift + ArrowRight
向上扩展选择 Shift + ArrowUp
向上扩展选择 Shift + K
向下扩展选择 Shift + ArrowDown
向下扩展选择 Shift + J
扩展选择至底部 Shift + End
扩展选择至顶部 Shift + Home
** 在上方插入单元格 A
** 在下方插入单元格 B
在当前标题上方插入标题 Shift + A
在当前标题下方插入标题 Shift + B
合并上方单元格 Ctrl + Backspace
合并下方单元格 Ctrl + Shift + M
合并选定单元格 Shift + M
下移单元格 Ctrl + Shift + ArrowDown
上移单元格 Ctrl + Shift + ArrowUp
选择下方单元格 ArrowDown
选择下方单元格 J
选择上方标题或折叠标题 ArrowLeft
选择下方标题或展开标题 ArrowRight
选择上方单元格 ArrowUp
选择上方单元格 K
粘贴至下方单元格 V
重做单元格操作 Shift + Z
** 运行选定单元格并不前进 Ctrl + Enter
运行选定单元格并在下方插入 Alt + Enter
选择所有单元格 Ctrl + A
** 显示行号 Shift + L
并排渲染 Shift + R
撤销单元格操作 Z
** 运行选定单元格并跳到下一单元格 Shift + Enter
结束搜索 Escape
查找下一个 Ctrl + G
查找上一个 Ctrl + Shift + G
查找… Ctrl + F
激活下一个标签 Ctrl + Shift + ]
激活下一个标签栏 Ctrl + Shift + .
激活上一个标签 Ctrl + Shift + [
激活上一个标签栏 Ctrl + Shift + ,
切换左侧区域 Ctrl + B
切换模式 Ctrl + Shift + D
激活命令面板 Ctrl + Shift + C
显示键盘快捷键 Ctrl + Shift + H
** 暂停 F9
** 下一步 F10
调试器面板 Ctrl + Shift + E
步入 F11
步出 Shift + F11
** 终止 Shift + F9
** 保存笔记本 Ctrl + S
另存为笔记本… Ctrl + Shift + S
激活以前使用的标签 Ctrl + Shift + '
目录 Ctrl + Shift + K
8.文件重命名
- 听刚刚给出的链接的视频或者自己摸索或者上网查
9.运行
-1)全部运行:Run-Run All Cells。代码块前显示数字,表示未执行;显示“[*],表示已执行。
-2)运行代码块:快捷键Shift+Enter

其他操作请自己摸索,慢慢就熟悉了

  (2)补充:Markdown的入门

  参考的视频链接:也许是B站最好的 Markdown 科普教程

1.定义:一种轻量级的标记语言。
2.Markdown编辑器:将Markdown文档渲染为HTML的格式,以供在Web浏览器中浏览阅读。
3.优点:沉浸、统一、可迁移
4.语法:
-1)标题
- 一级标题:“# 一、**”
- 二级标题:“## 1.1**”
- 依次类推,一般支持6级标题
-2)无序列表
- 格式:“- 无序列表”。效果:“▪ 无序列表”
-3)有序列表
- 格式:“1. 有序列表”,回车可以让数字有序增加,Tab键可以可以缩进列表,Shitf+Tab键取消列表缩进。
-4)斜体
- 格式:“*斜体*-5)加粗
- 格式:“**加粗**-6)删除
- 格式:“~~删除~~-7)高亮
- 格式:“==高亮==- 部分不支持的地方可使用html格式:“<mark>torch</mark>-8)分割线
- 用法:“---”,再回车
-9)超链接
- 格式:“[百度](https://www.baidu.com/)”,方框内是标题,括号内是链接。

其他语法请参考Markdown的官方文档,链接:https://markdown.com.cn/

  Markdown的官方文档的超链接:Markdown的官方文档

  (3)数据操作

  请观看b站视频的同时,直接阅读教材的对应章节,链接:2.1. 数据操作
  对应的jupyter文件的相对路径:“\d2l-zh\pytorch\chapter_preliminaries\index.ipynb”。

# 注:为了理解其中的代码,加了点注释
import torch  # 导入torch包
# 这行代码导入了PyTorch库,它是一个用于深度学习和机器学习的开源深度学习库。
# PyTorch提供了各种工具和功能,使得构建、训练和部署神经网络变得更加容易。
# 通过导入torch,你可以在Python代码中使用PyTorch的各种模块和函数,包括张量操作、神经网络层、优化器、损失函数等。
# 这使得你能够进行深度学习任务,如图像分类、自然语言处理、回归分析等。

x=torch.arange(12) # torch.arange()是PyTorch中用于创建一个等差数列的函数,默认步长为1。
x

x.shape  # 通过张量的shape属性来访问张量的形状和张量中元素的总数
x.numel()  # 用于获取张量中元素的总数

X=x.reshape(3,4)  # 要求12=3*4,三行四列
X

torch.zeros((2,3,4))   # 全0张量
torch.ones((2,3,4))   # 全1张量
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])  # tensor:张量

x=torch.tensor([1.0,2,4,8])
y=torch.tensor([2,2,2,2])
x+y,x-y,x*y,x/y,x**y   # **运算符是求幂运算

torch.exp(x)

# 多个张量连结
# -创建了两个张量 X 和 Y,然后使用 torch.cat() 函数进行了张量的拼接操作
# -dim=0:行   dim=1:列
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

X == Y   # 通过逻辑运算符构建二元张量

X.sum()  # 元素求和

# 广播机制:形状不一样时,按行复制或按列复制整个向量,使两个形状一样,再求和
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
a + b

# 元素的访问
# [-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素
X[-1], X[1:3]  # 此处结合语境为:[-1]选择最后一行元素,可以用[1:3]选择第二行和第三行元素

# 通过索引改变矩阵的元素
X[1, 2] = 9
X

# 为多个元素赋值
X[0:2, :] = 12
X

# 为新结果分配内存,注意与C语言区别
before = id(Y)  # id:标识号
Y = Y + X
id(Y) == before

# 执行原地操作   Z的id不变
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y # Z[:] 表示将 Z 的所有元素替换为运算结果
print('id(Z):', id(Z))

# 如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。
before = id(X)
X += Y
id(X) == before

# 转换为NumPy张量
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

# 将大小为1的张量转换为Python标量
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)  

  3.数据预处理

  请观看b站视频的同时,直接阅读教材的对应章节,链接:2.2. 数据操作
在这里插入图片描述
  注:CSV是"Comma-Separated Values"(逗号分隔值)的缩写,是一种常见的文本文件格式,用于存储和交换表格数据。CSV文件由纯文本组成,数据以行为单位,每行中的数据字段之间用逗号(,)或其他分隔符(如分号、制表符等)进行分隔。

# os模块提供了一种与操作系统功能进行交互的方式,包括与文件系统的交互、管理目录和运行系统命令等。
import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
# os.makedirs: 这是os模块中的一个函数,用于递归地创建目录。如果目录已经存在,它不会引发错误。
# os.path.join('..', 'data'): 这一部分使用os.path.join函数来创建一个路径字符串。在这里,它将两个字符串连接起来,形成一个相对路径,其中'..'表示上一级目录,'data'表示一个名为"data"的子目录
# exist_ok=True: 这是一个参数,如果设置为True,则表示如果目录已经存在,不会引发错误。如果目录不存在,它将创建目录。
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    # NA:表示未知数
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

在这里插入图片描述

# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pd
# pandas是一个强大的数据处理和分析库,特别适用于处理结构化数据,如表格数据。它提供了各种数据结构和函数,使数据的读取、转换、筛选、统计分析等操作变得非常简便。
# 常见的pandas数据结构包括DataFrame和Series,它们允许你以表格形式组织和操作数据。

data = pd.read_csv(data_file)
# 使用pd.read_csv(data_file)读取了一个CSV文件的内容,并将其存储在一个pandas的数据结构中,通常是一个DataFrame。这里的data_file是CSV文件的文件路径,你需要将其替换为实际的文件路径。
print(data)

在这里插入图片描述

# 通过位置索引iloc,我们将data分成inputs和outputs, 其中前者为data的前两列,而后者为data的最后一列。 对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
# mean()函数计算了该列中非空数值的平均值
# inputs.fillna(inputs.mean()): 这部分使用fillna()方法,将inputs中的缺失值(NaN,Not-a-Number)用对应列的平均值填充
print(inputs)

在这里插入图片描述

inputs = pd.get_dummies(inputs, dummy_na=True)
"""
这行代码使用了pandas库中的get_dummies()函数来进行独热编码(One-Hot Encoding)处理。让我解释一下这段代码的作用:
- pd.get_dummies(inputs, dummy_na=True): 这部分代码对inputs进行了独热编码的处理。独热编码是一种用于处理分类变量的方法,它将原始的分类变量转换为二进制的形式,以便在机器学习模型中使用。
- inputs: 这是要进行独热编码的数据,通常是一个pandas的数据框(DataFrame)。
- dummy_na=True: 这个参数是可选的,如果设置为True,则会为原始数据中的缺失值(NaN)创建一个额外的列进行编码。
- 独热编码将原始的分类变量拆分成多个二进制变量,每个变量代表一个可能的分类值。这有助于避免模型将分类变量解释为连续变量,并确保模型能够正确理解和使用这些分类信息。
- 举例来说,如果原始数据包含一个"颜色"列,其中包括"红色"、"绿色"和"蓝色"这三个分类值,独热编码后会创建三个新的列,分别代表这三种颜色,每列的取值只有0和1,1表示对应的颜色。同时,如果设置了dummy_na=True,还会创建一个额外的列表示缺失值。
"""
print(inputs)

在这里插入图片描述

# 转换为张量格式
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

  4.数据操作QA

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

五、线性代数

  1.线性代数

  请观看b站视频的同时,直接阅读教材的对应章节,链接:2.3.线性代数
在这里插入图片描述

  (1)标量

在这里插入图片描述

  (2)向量

在这里插入图片描述
  其中 α \alpha α为标量。上面的公式中 ∣ ∣ a ⋅ b ∣ ∣ = ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣ ||a \cdot b||=|a| \cdot ||b|| ∣∣ab∣∣=a∣∣b∣∣ a a a为标量,其他地方的 a a a为向量。
在这里插入图片描述
在这里插入图片描述

  (3)矩阵

在这里插入图片描述
在这里插入图片描述
  行和列相乘。
在这里插入图片描述
在这里插入图片描述
   i i i行和 j j j列相乘作为结果矩阵的 i i i j j j列的一个元素。
在这里插入图片描述

  (4)特殊矩阵

在这里插入图片描述
在这里插入图片描述
  其中“ j = π ( i ) j = \pi ( i ) j=π(i)”表示 j j j i i i的置换。
在这里插入图片描述
  对于特征向量,矩阵并不会改变它的方向,如上图的绿色的向量就是一个特征向量。

  2.线性代数的实现

在这里插入图片描述

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y

在这里插入图片描述

x = torch.arange(4)
x
x[3]

在这里插入图片描述

len(x)
x.shape

在这里插入图片描述

A = torch.arange(20).reshape(5, 4)
A
A.T

在这里插入图片描述

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B
B == B.T

在这里插入图片描述

X = torch.arange(24).reshape(2, 3, 4)
X

在这里插入图片描述

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
A, A + B

在这里插入图片描述

A * B
a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

在这里插入图片描述

x = torch.arange(4, dtype=torch.float32)
x, x.sum()
A.shape, A.sum()

在这里插入图片描述

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape
A.sum(axis=[0, 1])  # 结果和A.sum()相同

在这里插入图片描述

A.mean(), A.sum() / A.numel()
A.mean(axis=0), A.sum(axis=0) / A.shape[0]

在这里插入图片描述
  注:广播机制要求维度个数一样。

sum_A = A.sum(axis=1, keepdims=True)
sum_A
A / sum_A

在这里插入图片描述

A.cumsum(axis=0)

在这里插入图片描述

y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)   # torch.dot:点积
torch.sum(x * y)

在这里插入图片描述

A.shape, x.shape, torch.mv(A, x)

在这里插入图片描述

B = torch.ones(4, 3)
torch.mm(A, B)

在这里插入图片描述

u = torch.tensor([3.0, -4.0])
torch.norm(u)

在这里插入图片描述

torch.abs(u).sum()

在这里插入图片描述

torch.norm(torch.ones((4, 9)))

  3.按特定轴求和

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

  4.线性代数QA

  详细内容请观看视频:05 线性代数-P4 线性代数QA
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知乎云烟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值