深入理解深度学习的方法:
亲自实现,从 0 开始编写可实现运行的程序,一边看源码,一边思考
课程信息:
课程安排 - 动手学深度学习课程 (d2l.ai)
认识一下 Colab
Colab 使用教程(超级详细版)及 Colab Pro/Pro + 评测 - 知乎 (zhihu.com)
# 深度学习应用
# 图像分类
http://www.image-net.org/
ImageNet: the data that spawned the current AI boom (qz.com)
# 物体检测和分割
分割指的是某个像素点属于哪个物体
matterport/Mask_RCNN: Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow (github.com)
# 样式迁移
风格变换
zhanghang1989/MXNet-Gluon-Style-Transfer: Neural Style and MSG-Net (github.com)
# 人脸合成
Karras et al, ICLR 2018
# 文字生成图片
https://openai.com/blog/dall-e/
# 完整的故事
领域专家(实现产品应用)
数据科学家(data->model)
AI 专家(提升模型精度和性能)
# 安装
# 步骤
# 登录
仅参考,李沐老师亚马逊平台 ubuntu 系统
1 | ssh ubuntu@100.20.65.33 |
# 升级服务器系统
1 | sudo apt update |
# 装一些 GCC 这类编译开发环境
1 | sudo apt install build-essential |
# 安装 python
1 | sudo apt install python3.8 |
# 安装 miniconda
打开官网
Miniconda — Anaconda documentation
复制所需要的下载连接
这里 Linux 安装到服务器
1 | wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh |
# 启动
1 | bash Miniconda3-latest-Linux-x86_64.sh |
一直回车到 yes
1 | bash |
进入 conda 环境:刚开始最基础的 base 环境
# 创建一个新环境
1 | conda create -n lm |
# 激活
1 | conda activate lm |
# 安装记事本
1 | pip install jupyter d2l torch torchvision |
(国内慢提前安装个源)
# 复制链接
1 | wget https://zh-v2.d2l.ai/d2l-zh.zip |
# 安装 zip
1 | conda install zip |
# 查看
1 | ls |
# 解压文件
1 | unzip d2l-zh.zip |
1 | git clone https://github.com/d2l-ai/d2l-zh-pytorch-slides.git |
1 | jupyter notebook |
本地 prompt 操作!!
需要把远程机器的端口映射运行在本地
m 神操作
1 | ssh -L8888:localhost:8888 ubuntu@100.20.65.33 |
1 | ssh -L8888:localhost:8888 thjin@yuanshen.moe |
再 vscode 点击 8888 进入
这个场景
继续 prompt
别忘了启动对应的环境
# 下载插件
1 | pip install rise |
下载之后 jupyter 就可以直接用了
# 补充
删除单个文件(所有系统):
Code
1
1rm filename.ext
或(Windows)
Code
1
1del filename.ext
删除空文件夹(所有系统):
Code
1
1rmdir foldername
或(Windows)
Code
1
1rmdir /S /Q foldername # 使用/S/Q参数强制删除非空目录及其内容
删除非空文件夹及其中的所有内容(所有系统):
Code
1
1rm -rf foldername
注意:在使用
rm -rf
时要格外小心,因为它会立即、不可逆地删除指定的文件夹及其包含的所有内容。
# 数据操作
课程安排 - 动手学深度学习课程 (d2l.ai)
# 导入
首先,我们导入 torch
。请注意,虽然它被称为 PyTorch,但我们应该导入 torch
而不是 pytorch
In [1]:
1 | import torch |
# 张量表示由一个数值组成的数组,这个数组可能有多个维度
In [2]:
1 | x = torch.arange(12) |
Out[2]:
1 | tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) |
# 可以通过张量的 shape
属性来访问张量的形状 和张量中元素的总数
In [3]:
1 | x.shape |
Out[3]:
1 | torch.Size([12]) |
In [4]:
1 | x.numel() #numel张量大小 |
Out[4]:
1 | 12 |
# 要改变一个张量的形状而不改变元素数量和元素值,可以调用 reshape
函数
In [5]:
1 | X = x.reshape(3, 4) |
Out[5]:
1 | tensor([[ 0, 1, 2, 3], |
# 使用全 0、全 1、其他常量或者从特定分布中随机采样的数字
In [6]:
1 | torch.zeros((2, 3, 4)) |
Out[6]:
1 | tensor([[[0., 0., 0., 0.], |
In [7]:
1 | torch.ones((2, 3, 4)) |
Out[7]:
1 | tensor([[[1., 1., 1., 1.], |
In [8]:
1 | torch.randn(3, 4) |
Out[8]:
1 | tensor([[ 0.2104, 1.4439, -1.3455, -0.8273], |
# 通过提供包含数值的 Python 列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
In [9]:
1 | torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) |
Out[9]:
1 | tensor([[2, 1, 4, 3], |
常见的标准算术运算符( +
、 -
、 *
、 /
和 **
)都可以被升级为按元素运算
In [10]:
1 | x = torch.tensor([1.0, 2, 4, 8]) |
Out[10]:
1 | (tensor([ 3., 4., 6., 10.]), |
# 按按元素方式应用更多的计算
In [11]:
1 | torch.exp(x) #每个数的指数 |
Out[11]:
1 | tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03]) |
# 我们也可以把多个张量 连结(concatenate) 在一起
In [12]:
1 | X = torch.arange(12, dtype=torch.float32).reshape((3, 4)) |
Out[12]:
1 | (tensor([[ 0., 1., 2., 3.], |
# 数据预处理通过 逻辑运算符 构建二元张量
In [13]:
1 | X == Y |
Out[13]:
1 | tensor([[False, True, False, True], |
# 求和
对张量中的所有元素进行求和会产生一个只有一个元素的张量
In [14]:
1 | X.sum() |
Out[14]:
1 | tensor(66.) |
# 广播体制
即使形状不同,我们仍然可以通过调用 广播机制 (broadcasting mechanism) 来执行按元素操作
In [15]:
1 | a = torch.arange(3).reshape((3, 1)) #3行1列 |
Out[15]:
1 | (tensor([[0], |
In [16]:
1 | a + b #广播机制 需要均有1维 |
Out[16]:
1 | tensor([[0, 1], |
# 可以用 [-1]
选择最后一个元素,可以用 [1:3]
选择第二个和第三个元素
In [17]:
1 | X[-1] #最后一行 |
Out[17]:
1 | (tensor([ 8., 9., 10., 11.]), |
# 除读取外,我们还可以通过指定索引来将元素写入矩阵
In [18]:
1 | X[1, 2] = 9 |
Out[18]:
1 | tensor([[ 0., 1., 2., 3.], |
# 为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值
In [19]:
1 | X[0:2, :] = 12 |
Out[19]:
1 | tensor([[12., 12., 12., 12.], |
# 内存问题
运行一些操作可能会导致为新结果分配内存
python 引用语义
id 相当于 c 中的指针
In [20]:
1 | before = id(Y) |
Out[20]:
1 | False |
# 执行原地操作
In [21]:
1 | Z = torch.zeros_like(Y) |
# 如果在后续计算中没有重复使用 X
,我们也可以使用 X[:] = X + Y
或 X += Y
来减少操作的内存开销
In [22]:
1 | before = id(X) |
Out[22]:
1 | True |
# 转换为 NumPy
张量
In [23]:
1 | A = X.numpy() |
Out[23]:
1 | (numpy.ndarray, torch.Tensor) |
numpy 外部库,需要 import
# 将大小为 1 的张量转换为 Python 标量
In [24]:
1 | a = torch.tensor([3.5]) |
Out[24]:
1 | (tensor([3.5000]), 3.5, 3.5, 3) |
# 数据预处理
# 创建一个人工数据集,并存储在 csv(逗号分隔值)文件
In [1]:
1 | import os |
# 从创建的 csv 文件中加载原始数据集
In [2]:
1 | import pandas as pd |
直接输出 data 会好看一些
一般 csv 与 pandas 一起
# 为了处理缺失的数据,典型的方法包括插值和删除, 这里,我们将考虑插值
In [3]:
1 | inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] |
# 对于 inputs
中的类别值或离散值,我们将 “NaN” 视为一个类别
In [4]:
1 | inputs = pd.get_dummies(inputs, dummy_na=True) |
1 | NumRooms Alley_Pave Alley_nan |
现在 inputs
和 outputs
中的所有条目都是数值类型,它们可以转换为张量格式
In [5]:
1 | import torch |
Out[5]:
1 | (tensor([[3., 1., 0.], |
tensor 是数学上的一个概念 array 是计算机一个概念
# 下载电子书
# zlibrary
由于 free 经常被免费下架
最新版网址获取方式:
1 | blackbox@zlib.se |
向这个邮箱发任意信息,等几分钟就会回复最新版的网址