Skip to content

Commit

Permalink
Merge pull request zergtant#9 from yaleimeng/master
Browse files Browse the repository at this point in the history
错别字、超链接修正,语句通顺性优化。
  • Loading branch information
zergtant authored Mar 25, 2019
2 parents eedd73d + 7312c9a commit 66da51a
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 28 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ API的改动不是很大,本教程已经通过测试,保证能够在1.0中

## 说明

修改错别字请直接提issue或PR
- 修改错别字请直接提issue或PR

PR时请注意版本
- PR时请注意版本

有问题也请直接提issue
- 有问题也请直接提issue

感谢

Expand Down Expand Up @@ -103,7 +103,7 @@ PR时请注意版本

[tensorboardx](chapter4/4.2.2-tensorboardx.ipynb)

[可视化理解卷积神经网络](chapter4/4.2.2-tensorboardx.ipynb)
[可视化理解卷积神经网络](chapter4/4.2.3-cnn-visualizing.ipynb)

#### 第三节 fastai
#### 第四节 训练的一些技巧
Expand Down
7 changes: 3 additions & 4 deletions chapter1/1.1-pytorch-introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,8 @@ PyTorch是一个Python包,提供两个高级功能:
* 包含自动求导系统的的深度神经网络

## 1.1.4 对比PyTorch和Tensorflow
没有好的框架,只有合适的框架, 这里有个简单的对比,所以这里就不详细再说了
https://zhuanlan.zhihu.com/p/28636490
并且技术是发展的,这里的对比也不是绝对的,比如Tensorflow在1.5版的时候就引入了Eager Execution机制实现了动态图,PyTorch的可视化,windows支持,沿维翻转张量等问题都已经不是问题了。
没有好的框架,只有合适的框架, [这篇知乎文章](https://zhuanlan.zhihu.com/p/28636490)有个简单的对比,所以这里就不详细再说了。
并且技术是发展的,知乎上的对比也不是绝对的,比如Tensorflow在1.5版的时候就引入了Eager Execution机制实现了动态图,PyTorch的可视化,windows支持,沿维翻转张量等问题都已经不是问题了。

## 1.1.5 再次总结

Expand All @@ -54,4 +53,4 @@ https://zhuanlan.zhihu.com/p/28636490
- 不错的的文档(相比FB的其他项目,PyTorch的文档简直算是完善了,参考Thrift),PyTorch作者亲自维护的论坛 供用户交流和求教问题
- 入门简单

所以如果以上信息有吸引你的内容,那么请一定要读完这本书:)
所以如果以上信息有吸引你的内容,那么请一定要读完这本书:)
4 changes: 2 additions & 2 deletions chapter1/1.2-pytorch-installation.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 1.2 Pytorch环境搭建
PyTorch的安装十分简单,根据[PyTorch官网](https://pytorch.org/),对系统选择和安装方式等灵活选择即可。
这里以[anaconda](https://www.anaconda.com/)为例,简单的说一下步骤和要点。
国内安装anaconda建议使用[清华](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)或者中科大[http://mirrors.ustc.edu.cn/help/anaconda.html]镜像,快的不是一点半点。
国内安装anaconda建议使用[清华](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)或者[中科大](http://mirrors.ustc.edu.cn/help/anaconda.html)镜像,快的不是一点半点。

# 1.2.1 安装Pytorch
anaconda安装完成后可以开始创建环境,这里以win10 系统为例。打开Anaconda Prompt
Expand Down Expand Up @@ -35,7 +35,7 @@ conda install pytorch torchvision cudatoolkit=10.0 -c pytorch


```
需要说明的一点是如果使用清华源,可以直接添加pytorch源镜像去掉,并且去掉`-c pytorch` 这样才能使用镜像源。
需要说明的一点是如果使用清华镜像,可以直接添加pytorch源镜像去掉,并且去掉`-c pytorch` 这样才能使用镜像源。

验证输入python 进入
```python
Expand Down
6 changes: 3 additions & 3 deletions chapter2/2.1.2-pytorch-basics-autograd.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"在张量创建时,通过设置 requires_grad 标识为Ture来告诉Pytorch需要对该张量进行自动的求导,PyTorch回记录该张量的每一步操作历史并自动计算"
"在张量创建时,通过设置 requires_grad 标识为Ture来告诉Pytorch需要对该张量进行自动求导,PyTorch会记录该张量的每一步操作历史并自动计算"
]
},
{
Expand Down Expand Up @@ -98,7 +98,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我们看到 该张量的grad_fn已经被赋予了一个新的函数下面我们来调用反向传播函数,计算其梯度"
"我们看到 该张量的grad_fn已经被赋予了一个新的函数下面我们来调用反向传播函数,计算其梯度"
]
},
{
Expand Down Expand Up @@ -225,7 +225,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我们可以使用`with torch.no_grad()`禁止已经设置requires_grad=True的向量进行自动求导,这个方法在测试集测试准确率的时候回经常用到,例如"
"我们可以使用`with torch.no_grad()`上下文管理器临时禁止对已设置requires_grad=True的张量进行自动求导。这个方法在测试集计算准确率的时候会经常用到,例如"
]
},
{
Expand Down
10 changes: 5 additions & 5 deletions chapter2/2.2-deep-learning-basic-mathematics.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@
" optim.zero_grad()\n",
" # 计算损失\n",
" loss = criterion(outputs, labels)\n",
" # 反响传播\n",
" # 反向传播\n",
" loss.backward()\n",
" # 使用优化器默认方行优化\n",
" optim.step()\n",
Expand Down Expand Up @@ -390,7 +390,7 @@
"\n",
"这里有一个重点:因为PyTorch是使用mini-batch来进行计算的,所以损失函数的计算出来的结果已经对mini-batch取了平均\n",
"\n",
"常见(PyTorch内置)的损失函数一下几个\n",
"常见(PyTorch内置)的损失函数有以下几个\n",
"### nn.L1Loss:\n",
"输入x和目标y之间差的绝对值,要求 x 和 y 的维度要一样(可以是向量或者矩阵),得到的 loss 维度也是对应一样的\n",
"\n",
Expand Down Expand Up @@ -459,7 +459,7 @@
"metadata": {},
"source": [
"## 2.2.4 梯度下降\n",
"在介绍损失函数的时候我们已经说了,梯度下降是一个使损失函数越来越小的优化算法,在无求解机器学习算法的模型参数,即约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一所以梯度下降是我们目前所说的机器学习的核心,了解了它的含义,也就了解了机器学习算法的含义。\n"
"在介绍损失函数的时候我们已经说了,梯度下降是一个使损失函数越来越小的优化算法,在无求解机器学习算法的模型参数,即约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一。所以梯度下降是我们目前所说的机器学习的核心,了解了它的含义,也就了解了机器学习算法的含义。\n"
]
},
{
Expand All @@ -481,7 +481,7 @@
"\n",
"这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处(局部最优解)。\n",
"\n",
"这个问题在以前的机器学习中可能会遇到,因为机器学习中的特征比较少,所以导致很可能陷入到一个局部最优解中出不来,但是到了深度学习,动辄百万甚至上亿的特征,出现这种情况的纪律几乎为0,所以我们可以不用考虑这个问题。"
"这个问题在以前的机器学习中可能会遇到,因为机器学习中的特征比较少,所以导致很可能陷入到一个局部最优解中出不来,但是到了深度学习,动辄百万甚至上亿的特征,出现这种情况的概率几乎为0,所以我们可以不用考虑这个问题。"
]
},
{
Expand Down Expand Up @@ -524,7 +524,7 @@
"metadata": {},
"outputs": [],
"source": [
"#lr参数为学习了率对于SGD来说一般选择0.1 0.01.0.001,如何设置会在后面实战的章节中详细说明\n",
"#lr参数为学习率,对于SGD来说一般选择0.1 0.01.0.001,如何设置会在后面实战的章节中详细说明\n",
"##如果设置了momentum,就是带有动量的SGD,可以不设置\n",
"optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)"
]
Expand Down
12 changes: 6 additions & 6 deletions chapter3/3.2-mnist.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@
"# 3.2 MNIST数据集手写数字识别\n",
"\n",
"## 3.2.1 数据集介绍\n",
"MNIST 包括6万张28x28的训练样本,1万张测试样本,很多教程都会对它”下手”几乎成为一个 “典范”,可以说他就是计算机视觉里面的Hello World。所以我们这里也会使用MNIST来进行实战。\n",
"MNIST 包括6万张28x28的训练样本,1万张测试样本,很多教程都会对它”下手”几乎成为一个 “典范”,可以说它就是计算机视觉里面的Hello World。所以我们这里也会使用MNIST来进行实战。\n",
"\n",
"我们在介绍卷积神经网络的时候说到过LeNet-5,LeNet-5之所以强大就是因为在当时的环境下将MNIST数据的识别率提高到了99%,这里我们也自己从头搭建一个卷积神经网络,也达到99%的准确率"
"前面在介绍卷积神经网络的时候说到过LeNet-5,LeNet-5之所以强大就是因为在当时的环境下将MNIST数据的识别率提高到了99%,这里我们也自己从头搭建一个卷积神经网络,也达到99%的准确率"
]
},
{
Expand Down Expand Up @@ -121,7 +121,7 @@
"source": [
"下面我们定义一个网络,网络包含两个卷积层,conv1和conv2,然后紧接着两个线性层作为输出,最后输出10个维度,这10个维度我们作为0-9的标识来确定识别出的是那个数字\n",
"\n",
"在这里建议大家将每一层的输入和输出都显作为注释标注出来,这样后面阅读代码的会方便很多"
"在这里建议大家将每一层的输入和输出维度都作为注释标注出来,这样后面阅读代码的会方便很多"
]
},
{
Expand Down Expand Up @@ -235,7 +235,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"下面开始训练,封装起来的好处这里就体现出来了,只要谢两行就可以了"
"下面开始训练,这里就体现出封装起来的好处了,只要写两行就可以了"
]
},
{
Expand Down Expand Up @@ -389,9 +389,9 @@
"source": [
"如果你的模型连MNIST都搞不定,那么你的模型没有任何的价值\n",
"\n",
"如果你的模型搞定了MNIST,那么你的模型也可能没有任何的价值\n",
"即使你的模型搞定了MNIST,你的模型也可能没有任何的价值\n",
"\n",
"MNIST是一个很简单的数据集,但是因为他的局限性只能作为研究来使用,对于实际应用中带来的价值非常有限,但是通过这个例子,我们可以完全了解一个实际项目的工作流程\n",
"MNIST是一个很简单的数据集,由于它的局限性只能作为研究用途,对实际应用带来的价值非常有限。但是通过这个例子,我们可以完全了解一个实际项目的工作流程\n",
"\n",
"我们找到数据集,对数据做预处理,定义我们的模型,调整超参数,测试训练,再通过训练结果对超参数进行调整或者对模型进行调整。\n",
"\n",
Expand Down
8 changes: 4 additions & 4 deletions chapter4/4.1-fine-tuning.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,20 @@
"## 4.1.1 什么是微调\n",
"\n",
"针对于某个任务,自己的训练数据不多,那怎么办?\n",
"没关系,我们先找到一个同类的别人训练好的模型,把别人现成的训练好了的模型拿过来,换成自己的数据,调整一下参数,在训练一遍,这就是微调(fine-tune)。\n",
"没关系,我们先找到一个同类的别人训练好的模型,把别人现成的训练好了的模型拿过来,换成自己的数据,调整一下参数,再训练一遍,这就是微调(fine-tune)。\n",
"PyTorch里面提供的经典的网络模型都是官方通过Imagenet的数据集与训练好的数据,如果我们的数据训练数据不够,这些数据是可以作为基础模型来使用的。\n",
"\n",
"### 为什么要微调\n",
"1. 对于数据集本身很小(几千张图片)的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠微调已经训练好的模型。\n",
"2. 可以降低训练成,如果使用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用 CPU 都完全无压力,没有深度学习机器也可以做。\n",
"2. 可以降低训练成本:如果使用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用 CPU 都完全无压力,没有深度学习机器也可以做。\n",
"3. 前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要强悍,没有必要重复造轮子。\n",
"\n",
"\n",
"### 迁移学习 Transfer Learning\n",
"总是有人把 迁移学习和神经网络的训练联系起来,这两个概念刚开始是无关的。\n",
"迁移学习是机器学习的分支,现在之所以 迁移学习和神经网络联系如此紧密,现在图像识别这块发展的太快效果也太好了,所以几乎所有的迁移学习都是图像识别方向的,所以大家看到的迁移学习基本上都是以神经网络相关的计算机视觉为主,本文中也会以这方面来举例子\n",
"\n",
"迁移学习初衷是节省人工标注样本的时间,让模型可以通过一个已有的标记数据的领域向未标记数据领域进行迁移从而训练出适用于该领域的模型,直接对目标域从头开始学习成本太高,我们故而转向运用已有的相关知识来辅助尽快地学习新知识,直接对目标域从头开始学习成本太高,我们故而转向运用已有的相关知识来辅助尽快地学习新知识\n",
"迁移学习初衷是节省人工标注样本的时间,让模型可以通过一个已有的标记数据的领域向未标记数据领域进行迁移从而训练出适用于该领域的模型,直接对目标域从头开始学习成本太高,我们故而转向运用已有的相关知识来辅助尽快地学习新知识\n",
"\n",
"举一个简单的例子就能很好的说明问题,我们学习编程的时候会学习什么? 语法、特定语言的API、流程处理、面向对象,设计模式,等等\n",
"\n",
Expand Down Expand Up @@ -109,7 +109,7 @@
"\n",
"1. 新数据集和原始数据集合类似,那么直接可以微调一个最后的FC层或者重新指定一个新的分类器\n",
"2. 新数据集比较小和原始数据集合差异性比较大,那么可以使用从模型的中部开始训练,只对最后几层进行fine-tuning\n",
"3. 新数据集比较小和原始数据集合差异性比较大,如果上面方法还是不行的化那么最好是从新训练,只将预训练的模型作为一个新模型初始化的数据\n",
"3. 新数据集比较小和原始数据集合差异性比较大,如果上面方法还是不行的化那么最好是重新训练,只将预训练的模型作为一个新模型初始化的数据\n",
"4. 新数据集的大小一定要与原始数据集相同,比如CNN中输入的图片大小一定要相同,才不会报错\n",
"5. 如果数据集大小不同的话,可以在最后的fc层之前添加卷积或者pool层,使得最后的输出与fc层一致,但这样会导致准确度大幅下降,所以不建议这样做\n",
"6. 对于不同的层可以设置不同的学习率,一般情况下建议,对于使用的原始数据做初始化的层设置的学习率要小于(一般可设置小于10倍)初始化的学习率,这样保证对于已经初始化的数据不会扭曲的过快,而使用初始化学习率的新层可以快速的收敛。"
Expand Down

0 comments on commit 66da51a

Please sign in to comment.