chore: Syntax Highlighting
This commit is contained in:
@@ -99,15 +99,21 @@ cs61a 绝对是一个挑战,但是我们都希望你学习并且成功,所
|
||||
|
||||
要使用 Ok 来运行指定函数的 doctests,请运行以下命令
|
||||
|
||||
```python3 ok -q <specified function> #会和你要补充的代码一起给出```
|
||||
```bash
|
||||
python3 ok -q <specified function> #会和你要补充的代码一起给出
|
||||
```
|
||||
|
||||
默认情况下,只有没有通过的测试才会出现。你可以使用-v 选项来显示所有的测试,包括你已经通过的测试
|
||||
|
||||
```python3 ok -v```
|
||||
```bash
|
||||
python3 ok -v
|
||||
```
|
||||
|
||||
有时我们会看到类似这样的 ok 指令
|
||||
|
||||
```python3 ok -q control -u```
|
||||
```bash
|
||||
python3 ok -q control -u
|
||||
```
|
||||
|
||||
在终端中输入后,需要按照要求回答问题,有些时候会做为某些函数测试的前置条件
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ Pip 在通过 python 官网下载 python 并安装时可以选择同时安装 pi
|
||||
3. 对于 Windows 用户,在 C:\Users\xx\pip 目录下(没有 pip 目录就新建)创建一个 pip.ini 文件,并将下面代码块中内容复制进去:
|
||||
4. 对于 Linux 用户,同样在~/.pip/pip.conf 进行配置。如果没有.pip 目录就新建,然后将下面代码块中内容复制进去:
|
||||
|
||||
```
|
||||
```bash
|
||||
[global]
|
||||
index-url = http://pypi.douban.com/simple
|
||||
extra-index-url = https://pypi.mirrors.ustc.edu.cn/simple/
|
||||
|
||||
@@ -20,7 +20,7 @@ PyTorch 中的 Dataset 类是一个抽象类,它可以用来表示数据集。
|
||||
|
||||
下面我们来编写一个简单的例子,看下如何使用 Dataset 类定义一个 Tensor 类型的数据集。
|
||||
|
||||
```
|
||||
```python
|
||||
import torch
|
||||
from torch.utils.data import Dataset
|
||||
|
||||
@@ -43,7 +43,7 @@ class MyDataset(Dataset):
|
||||
|
||||
然后我们来看一下如何调用刚才定义的数据集。首先随机生成一个 10*3 维的数据 Tensor,然后生成 10 维的标签 Tensor,与数据 Tensor 相对应。利用这两个 Tensor,生成一个 MyDataset 的对象。查看数据集的大小可以直接用 len() 函数,索引调用数据可以直接使用下标。
|
||||
|
||||
```
|
||||
```python
|
||||
# 生成数据
|
||||
data_tensor = torch.randn(10, 3)
|
||||
target_tensor = torch.randint(2, (10,)) # 标签是0或1
|
||||
@@ -67,7 +67,7 @@ DataLoader 是一个迭代器,最基本的使用方法就是传入一个 Datas
|
||||
|
||||
DataLoader 类的调用方式如下:
|
||||
|
||||
```
|
||||
```python
|
||||
from torch.utils.data import DataLoader
|
||||
tensor_dataloader = DataLoader(dataset=my_dataset, # 传入的数据集, 必须参数
|
||||
batch_size=2, # 输出的batch大小
|
||||
@@ -143,7 +143,7 @@ MNIST 数据集是 ubyte 格式存储,我们先将“训练集图片”解析
|
||||
|
||||
以 MNIST 为例,我们可以用如下方式调用:
|
||||
|
||||
```
|
||||
```python
|
||||
# 以MNIST为例
|
||||
import torchvision
|
||||
mnist_dataset = torchvision.datasets.MNIST(root='./data',
|
||||
@@ -173,7 +173,7 @@ torchvision.datasets.MNIST 是一个类,对它进行实例化,即可返回
|
||||
|
||||
如果想要查看 mnist_dataset 中的具体内容,我们需要把它转化为列表。(如果 IOPub data rate 超限,可以只加载测试集数据,令 train=False)
|
||||
|
||||
```
|
||||
```python
|
||||
mnist_dataset_list = list(mnist_dataset)
|
||||
print(mnist_dataset_list)
|
||||
```
|
||||
@@ -182,7 +182,7 @@ print(mnist_dataset_list)
|
||||
|
||||
这里图像数据是 PIL.Image.Image 类型的,这种类型可以直接在 Jupyter 中显示出来。显示一条数据的代码如下。
|
||||
|
||||
```
|
||||
```python
|
||||
display(mnist_dataset_list[0][0])
|
||||
print("Image label is:", mnist_dataset_list[0][1])
|
||||
```
|
||||
|
||||
@@ -27,7 +27,7 @@ Torchvision 库中的 torchvision.transforms 包中提供了常用的图像操
|
||||
|
||||
我们来看一个具体的例子加深理解。将图片进行一下数据类型的相互转换。具体代码如下:
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
|
||||
@@ -68,7 +68,7 @@ torchvision.transforms 提供了丰富的图像变换方法,例如:改变尺
|
||||
|
||||
将输入的 PIL Image 或 Tensor 尺寸调整为给定的尺寸,具体定义为:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.Resize(size, interpolation=2)
|
||||
```
|
||||
|
||||
@@ -81,7 +81,7 @@ torchvision.transforms.Resize(size, interpolation=2)
|
||||
|
||||
在 resize 之后呢,一般会接一个 crop 操作,crop 到指定的大小。对于高与宽接近的图片来说,这么做问题不大,但是高与宽的差距较大时,就会 crop 掉很多有用的信息。关于这一点,我们在后续的图像分类部分还会遇到,到时我在详细展开。
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
|
||||
@@ -105,7 +105,7 @@ torchvision.transforms 提供了多种剪裁方法,例如中心剪裁、随机
|
||||
|
||||
先说中心剪裁,在中心裁剪指定的 PIL Image 或 Tensor,其定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.CenterCrop(size)
|
||||
```
|
||||
|
||||
@@ -113,7 +113,7 @@ torchvision.transforms.CenterCrop(size)
|
||||
|
||||
然后是随机剪裁,在一个随机位置剪裁指定的 PIL Image 或 Tensor,定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.RandomCrop(size, padding=None)
|
||||
```
|
||||
|
||||
@@ -121,13 +121,13 @@ torchvision.transforms.RandomCrop(size, padding=None)
|
||||
|
||||
最后要说的是 FiveCrop,我们将给定的 PIL Image 或 Tensor ,分别从四角和中心进行剪裁,共剪裁成五块,定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.FiveCrop(size)
|
||||
```
|
||||
|
||||
size 可以是 int 或 tuple,用法同上。掌握了各种剪裁的定义和参数用法以后,我们来看一下这些剪裁操作具体如何调用,代码如下:
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
|
||||
@@ -158,13 +158,13 @@ for img in imgs:
|
||||
|
||||
以概率 p 随机水平翻转图像,定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.RandomHorizontalFlip(p=0.5)
|
||||
```
|
||||
|
||||
以概率 p 随机垂直翻转图像,定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.RandomVerticalFlip(p=0.5)
|
||||
```
|
||||
|
||||
@@ -172,7 +172,7 @@ torchvision.transforms.RandomVerticalFlip(p=0.5)
|
||||
|
||||
这里的随机翻转,是为数据增强提供方便。如果想要必须执行翻转操作的话,将 p 设置为 1 即可。图片翻转代码如下:
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
|
||||
@@ -212,7 +212,7 @@ display(img2)
|
||||
|
||||
torchvision.transforms 提供了对 Tensor 进行标准化的函数,定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.Normalize(mean, std, inplace=False)
|
||||
```
|
||||
|
||||
@@ -224,7 +224,7 @@ torchvision.transforms.Normalize(mean, std, inplace=False)
|
||||
|
||||
我们来看看以 (R, G, B) 均值和标准差均为 (0.5, 0.5, 0.5) 来标准化图片后,是什么效果:
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
|
||||
@@ -254,7 +254,7 @@ display(img_norm)
|
||||
|
||||
Compose 类是将多个变换组合到一起,它的定义如下:
|
||||
|
||||
```
|
||||
```python
|
||||
torchvision.transforms.Compose(transforms)
|
||||
```
|
||||
|
||||
@@ -262,7 +262,7 @@ torchvision.transforms.Compose(transforms)
|
||||
|
||||
我们还是结合例子动手试试,如果我们想要将图片变为 200*200 像素大小,并且随机裁切成 80 像素的正方形。那么我们可以组合 Resize 和 RandomCrop 变换,具体代码如下所示:
|
||||
|
||||
```
|
||||
```python
|
||||
from PIL import Image
|
||||
from IPython.display import display
|
||||
from torchvision import transforms
|
||||
@@ -292,7 +292,7 @@ Compose 类是未来我们在实际项目中经常要使用到的类,结合 to
|
||||
|
||||
我们还是以读取 MNIST 数据集为例,看下如何在读取数据的同时,完成数据预处理等操作。具体代码如下:
|
||||
|
||||
```
|
||||
```python
|
||||
from torchvision import transforms
|
||||
from torchvision import datasets
|
||||
|
||||
@@ -320,7 +320,7 @@ print(type(item[0]))
|
||||
|
||||
我们下面先来看看,在图像分类实战中使用的 transform,可以感受一下实际使用的 transforms 是什么样子:
|
||||
|
||||
```
|
||||
```python
|
||||
transform = transforms.Compose([
|
||||
transforms.RandomResizedCrop(dest_image_size),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
|
||||
@@ -48,9 +48,8 @@ BYOL 之后,大家都发现对比学习是靠许许多多的小 trick 和技
|
||||
|
||||
下面是这些网络训练结果的对比,也列出了它们分别有哪些 trick(用的是分类任务)
|
||||
|
||||
```
|
||||
负样本 动量编码器 训练轮数
|
||||
```
|
||||
负样本 动量编码器 训练轮数
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ $$
|
||||
print(similarity_matrix)
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
A B C D E
|
||||
A 1.000000 -0.476731 -0.123091 0.532181 0.969458
|
||||
B -0.476731 1.000000 0.645497 -0.310087 -0.478091
|
||||
@@ -124,7 +124,7 @@ $$
|
||||
print(f'与物品{target_item}最相似的{num}个物品为:{sim_items}')
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
与物品E最相似的2个物品为:['A', 'D']
|
||||
```
|
||||
|
||||
@@ -147,7 +147,7 @@ $$
|
||||
print(f'用户{target_user}对物品{target_item}的预测评分为:{target_item_pred}')
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
用户 Alice 对物品E的预测评分为:4.6
|
||||
```
|
||||
|
||||
|
||||
@@ -234,7 +234,7 @@ UserCF算法的两个步骤:
|
||||
print(similarity_matrix)
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
1 2 3 4 5
|
||||
1 1.000000 0.852803 0.707107 0.000000 -0.792118
|
||||
2 0.852803 1.000000 0.467707 0.489956 -0.900149
|
||||
@@ -253,7 +253,7 @@ UserCF算法的两个步骤:
|
||||
print(f'与用户{target_user}最相似的{num}个用户为:{sim_users}')
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
与用户 Alice 最相似的2个用户为:['user1', 'user2']
|
||||
```
|
||||
|
||||
@@ -277,7 +277,7 @@ UserCF算法的两个步骤:
|
||||
print(f'用户{target_user}对物品{target_item}的预测评分为:{target_item_pred}')
|
||||
```
|
||||
|
||||
```
|
||||
```python
|
||||
用户 Alice 对物品E的预测评分为:4.871979899370592
|
||||
```
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
以最基本的 C 语言为例,C 语言的函数局部变量就保存在栈中。
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -33,7 +33,7 @@ int main()
|
||||
可以发现`ch`和`ch2`刚好差`8`个字节,也就是`ch`的长度。
|
||||
`ch`只有`8`个字节,那么如果我们向`ch`中写入超过`8`个字节的数据呢?很显然,会从`ch`处发生溢出,写入到`ch2`的空间中,覆盖`ch2`的内容。
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -54,7 +54,7 @@ int main()
|
||||
|
||||
对于以上程序,“栈溢出”带来的后果仅仅是修改了局部变量的值,会造成一些程序的逻辑错误:
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -81,7 +81,7 @@ int main()
|
||||
|
||||
在 C 语言编译之后,通常会产生汇编语言,汇编语言的字节码可以直接在物理 CPU 上运行。而 C 语言函数调用会被编译为如下形式:
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int add(int a,int b)
|
||||
{
|
||||
@@ -187,20 +187,20 @@ ROP 网上已有非常系统的资料,在这里不做过多的叙述,可参
|
||||
|
||||
格式化字符串的利用思路来源于`printf`函数中的`%n`format 标签,该标签的作用和`%s`、`%d`等不同,是将已打印的字符串的长度返回到该标签对应的变量中。在正常情况下的使用不会出现什么问题:
|
||||
|
||||
```C
|
||||
```c
|
||||
printf("abcd%n",&num);
|
||||
//输出abcd,并且num的值为4
|
||||
```
|
||||
|
||||
但如果在编写代码时忘记 format 字符串:
|
||||
|
||||
```C
|
||||
```c
|
||||
printf(something_want_print);
|
||||
```
|
||||
|
||||
此时若攻击者可以自定义该字符串,就可以使用`%d`、`%p`、`%s`等打印栈上数据,或者`%n`来覆写栈上的数据,如果覆写了返回地址,就可以实现任意代码执行。
|
||||
|
||||
```C
|
||||
```c
|
||||
char ch[20];
|
||||
scanf("%s",ch);// 输入 %d%n%n%n%n%n
|
||||
printf(ch);
|
||||
|
||||
@@ -283,7 +283,7 @@ TLS 建立在 TCP 的基础上,他会通过加密来确保传输过程中数
|
||||
|
||||
相信在看这篇文章的大家都正在使用互联网,如果你正在使用windows设备,你可以先按 `win`+`R` ,输入 `cmd`,在弹出的窗口输入 `ipconfig` 你可以看到里面有一串类似于下文的内容:
|
||||
|
||||
```
|
||||
```powershell
|
||||
无线局域网适配器 WLAN:
|
||||
|
||||
连接特定的 DNS 后缀 . . . . . . . :
|
||||
|
||||
Reference in New Issue
Block a user