Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f8e5c60

Browse files
update
1 parent dd620d3 commit f8e5c60

File tree

14 files changed

+484
-971
lines changed

14 files changed

+484
-971
lines changed

‎README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 深度学习入门之PyTorch
1+
# 深度学习入门之PyTorch
22

33
Learn Deep Learning with PyTorch
44

@@ -31,14 +31,15 @@ Learn Deep Learning with PyTorch
3131

3232
- Chapter 4: 卷积神经网络
3333
- [PyTorch 中的卷积模块](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter4_CNN/basic_conv.ipynb)
34-
- [批标准化,batch normalization](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter4_CNN/batch-normalization.ipynb))
34+
- [批标准化,batch normalization](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter4_CNN/batch-normalization.ipynb)
3535
- [使用重复元素的深度网络,VGG](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/vgg.ipynb)
3636
- [更加丰富化结构的网络,GoogLeNet](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/googlenet.ipynb)
3737
- [深度残差网络,ResNet](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/resnet.ipynb)
3838
- [稠密连接的卷积网络,DenseNet](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/densenet.ipynb)
3939
- 更好的训练卷积网络
4040
- [数据增强](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/data-augumentation.ipynb)
41-
- dropout、正则化方法和学习率衰减]()
41+
- [正则化](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/regularization.ipynb)
42+
- [学习率衰减](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter3_CNN/lr-decay.ipynb)
4243

4344
- Chapter 5: 循环神经网络
4445
- LSTM 和 GRU
@@ -54,15 +55,15 @@ Learn Deep Learning with PyTorch
5455
- 深度卷积对抗网络(DCGANs)
5556

5657
- Chapter 7: PyTorch高级
57-
- tensorboard 可视化
58+
- [tensorboard 可视化]()
5859
- 优化算法
5960
- [SGD](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/sgd.ipynb)
6061
- [动量法](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/momentum.ipynb)
6162
- [Adagrad](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/adagrad.ipynb)
6263
- [RMSProp](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/rmsprop.ipynb)
6364
- [Adadelta](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/adadelta.ipynb)
6465
- [Adam](https://github.com/SherlockLiao/code-of-learn-deep-learning-with-pytorch/blob/master/chapter6_PyTorch-Advances/optimizer/adam.ipynb)
65-
- 灵活的数据读取介绍
66+
- [灵活的数据读取介绍]()
6667
- autograd.function 的介绍
6768
- 数据并行和多 GPU
6869
- PyTorch 的分布式应用

‎chapter3_NN/deep-nn.ipynb

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,6 @@
112112
"a_label"
113113
]
114114
},
115-
{
116-
"cell_type": "markdown",
117-
"metadata": {},
118-
"source": [
119-
"这里的读入的数据是 PIL 库中的格式,我们可以非常方便地将其转换为 numpy array"
120-
]
121-
},
122115
{
123116
"cell_type": "code",
124117
"execution_count": 6,
@@ -220,15 +213,6 @@
220213
"print(a_data)"
221214
]
222215
},
223-
{
224-
"cell_type": "markdown",
225-
"metadata": {},
226-
"source": [
227-
"我们可以将数组展示出来,里面的 0 就表示黑色,255 表示白色\n",
228-
"\n",
229-
"对于神经网络,我们第一层的输入就是 28 x 28 = 784,所以必须将得到的数据我们做一个变换,使用 reshape 将他们拉平成一个一维向量"
230-
]
231-
},
232216
{
233217
"cell_type": "code",
234218
"execution_count": 8,
@@ -284,13 +268,6 @@
284268
"test_data = DataLoader(test_set, batch_size=128, shuffle=False)"
285269
]
286270
},
287-
{
288-
"cell_type": "markdown",
289-
"metadata": {},
290-
"source": [
291-
"使用这样的数据迭代器是非常有必要的,如果数据量太大,就无法一次将他们全部读入内存,所以需要使用 python 迭代器,每次生成一个批次的数据"
292-
]
293-
},
294271
{
295272
"cell_type": "code",
296273
"execution_count": 11,
@@ -374,13 +351,6 @@
374351
"net"
375352
]
376353
},
377-
{
378-
"cell_type": "markdown",
379-
"metadata": {},
380-
"source": [
381-
"交叉熵在 pytorch 中已经内置了,交叉熵的数值稳定性更差,所以内置的函数已经帮我们解决了这个问题"
382-
]
383-
},
384354
{
385355
"cell_type": "code",
386356
"execution_count": 28,

‎chapter3_NN/logistic-regression/logistic-regression.ipynb

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -503,13 +503,6 @@
503503
"print()\n",
504504
"print('During Time: {:.3f} s'.format(during))"
505505
]
506-
},
507-
{
508-
"cell_type": "markdown",
509-
"metadata": {},
510-
"source": [
511-
"可以看到,使用了 PyTorch 自带的 loss 之后,速度有了一定的上升,虽然看上去速度的提升并不多,但是这只是一个小网络,对于大网络,使用自带的 loss 不管对于稳定性还是速度而言,都有质的飞跃,同时也避免了重复造轮子的困扰"
512-
]
513506
}
514507
],
515508
"metadata": {

‎chapter3_NN/nn-sequential-module.ipynb

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
"cell_type": "markdown",
55
"metadata": {},
66
"source": [
7-
"# 多层神经网络,Sequential 和 Module\n",
8-
"通过前面的章节,我们了解到了机器学习领域中最常见的两个模型,线性回归模型和 Logistic 回归模型,他们分别是处理机器学习中最常见的两类问题-回归问题和分类问题。\n",
9-
"\n",
10-
"下面我们会讲第一个深度学习的模型,多层神经网络。"
7+
"# 多层神经网络,Sequential 和 Module"
118
]
129
},
1310
{
@@ -232,13 +229,6 @@
232229
"plt.title('logistic regression')"
233230
]
234231
},
235-
{
236-
"cell_type": "markdown",
237-
"metadata": {},
238-
"source": [
239-
"可以看到,logistic 回归并不能很好的区分开这个复杂的数据集,如果你还记得前面的内容,你就知道 logistic 回归是一个线性分类器,这个时候就该我们的神经网络登场了!"
240-
]
241-
},
242232
{
243233
"cell_type": "code",
244234
"execution_count": 43,
@@ -360,24 +350,6 @@
360350
"## Sequential 和 Module"
361351
]
362352
},
363-
{
364-
"cell_type": "markdown",
365-
"metadata": {},
366-
"source": [
367-
"我们讲了数据处理,模型构建,loss 函数设计等等内容,但是目前为止我们还没有准备好构建一个完整的机器学习系统,一个完整的机器学习系统需要我们不断地读写模型。在现实应用中,一般我们会将模型在本地进行训练,然后保存模型,接着我们会将模型部署到不同的地方进行应用,所以在这节课我们会教大家如何保存 PyTorch 的模型。\n",
368-
"\n",
369-
"首先我们会讲一下 PyTorch 中的模块,Sequential 和 Module。"
370-
]
371-
},
372-
{
373-
"cell_type": "markdown",
374-
"metadata": {},
375-
"source": [
376-
"对于前面的线性回归模型、 Logistic回归模型和神经网络,我们在构建的时候定义了需要的参数。这对于比较小的模型是可行的,但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非常麻烦,所以 PyTorch 提供了两个模块来帮助我们构建模型,一个是Sequential,一个是 Module。\n",
377-
"\n",
378-
"Sequential 允许我们构建序列化的模块,而 Module 是一种更加灵活的模型定义方式,我们下面分别用 Sequential 和 Module 来定义上面的神经网络。"
379-
]
380-
},
381353
{
382354
"cell_type": "code",
383355
"execution_count": 73,
@@ -497,13 +469,6 @@
497469
" print('epoch: {}, loss: {}'.format(e+1, loss.data[0]))"
498470
]
499471
},
500-
{
501-
"cell_type": "markdown",
502-
"metadata": {},
503-
"source": [
504-
"可以看到,训练 10000 次 loss 比之前的更低,这是因为 PyTorch 自带的模块比我们写的更加稳定,同时也有一些初始化的问题在里面,关于参数初始化,我们会在后面的课程中讲到"
505-
]
506-
},
507472
{
508473
"cell_type": "code",
509474
"execution_count": 80,
@@ -558,35 +523,6 @@
558523
"\n"
559524
]
560525
},
561-
{
562-
"cell_type": "markdown",
563-
"metadata": {},
564-
"source": [
565-
"下面我们再用 Module 定义这个模型,下面是使用 Module 的模板\n",
566-
"\n",
567-
"```\n",
568-
"class 网络名字(nn.Module):\n",
569-
" def __init__(self, 一些定义的参数):\n",
570-
" super(网络名字, self).__init__()\n",
571-
" self.layer1 = nn.Linear(num_input, num_hidden)\n",
572-
" self.layer2 = nn.Sequential(...)\n",
573-
" ...\n",
574-
" \n",
575-
" 定义需要用的网络层\n",
576-
" \n",
577-
" def forward(self, x): # 定义前向传播\n",
578-
" x1 = self.layer1(x)\n",
579-
" x2 = self.layer2(x)\n",
580-
" x = x1 + x2\n",
581-
" ...\n",
582-
" return x\n",
583-
"```\n",
584-
"\n",
585-
"注意的是,Module 里面也可以使用 Sequential,同时 Module 非常灵活,具体体现在 forward 中,如何复杂的操作都能直观的在 forward 里面执行\n",
586-
"\n",
587-
"下面我们照着模板实现一下上面的神经网络"
588-
]
589-
},
590526
{
591527
"cell_type": "code",
592528
"execution_count": 84,
@@ -718,13 +654,6 @@
718654
" if (e + 1) % 1000 == 0:\n",
719655
" print('epoch: {}, loss: {}'.format(e+1, loss.data[0]))"
720656
]
721-
},
722-
{
723-
"cell_type": "markdown",
724-
"metadata": {},
725-
"source": [
726-
"可以看到我们得到了相同的结果,而且使用 Sequential 和 Module 来定义模型更加方便"
727-
]
728657
}
729658
],
730659
"metadata": {

‎chapter3_NN/param_initialize.ipynb

Lines changed: 3 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
"cell_type": "markdown",
1212
"metadata": {},
1313
"source": [
14-
"## 使用 NumPy 来初始化\n",
15-
"因为 PyTorch 是一个非常灵活的框架,理论上能够对所有的 Tensor 进行操作,所以我们能够通过定义新的 Tensor 来初始化,直接看下面的例子"
14+
"## 使用 NumPy 来初始化"
1615
]
1716
},
1817
{
@@ -87,13 +86,6 @@
8786
"print(w1)"
8887
]
8988
},
90-
{
91-
"cell_type": "markdown",
92-
"metadata": {},
93-
"source": [
94-
"注意,这是一个 Parameter,也就是一个特殊的 Variable,我们可以访问其 `.data`属性得到其中的数据,然后直接定义一个新的 Tensor 对其进行替换,我们可以使用 PyTorch 中的一些随机数据生成的方式,比如 `torch.randn`,如果要使用更多 PyTorch 中没有的随机化方式,可以使用 numpy"
95-
]
96-
},
9789
{
9890
"cell_type": "code",
9991
"execution_count": 16,
@@ -134,13 +126,6 @@
134126
"print(net1[0].weight)"
135127
]
136128
},
137-
{
138-
"cell_type": "markdown",
139-
"metadata": {},
140-
"source": [
141-
"可以看到这个参数的值已经被改变了,也就是说已经被定义成了我们需要的初始化方式,如果模型中某一层需要我们手动去修改,那么我们可以直接用这种方式去访问,但是更多的时候是模型中相同类型的层都需要初始化成相同的方式,这个时候一种更高效的方式是使用循环去访问,比如"
142-
]
143-
},
144129
{
145130
"cell_type": "code",
146131
"execution_count": 18,
@@ -156,13 +141,6 @@
156141
" # 定义为均值为 0,方差为 0.5 的正态分布"
157142
]
158143
},
159-
{
160-
"cell_type": "markdown",
161-
"metadata": {},
162-
"source": [
163-
"对于 Module 的参数初始化,其实也非常简单,如果想对其中的某层进行初始化,可以直接像 Sequential 一样对其 Tensor 进行重新定义,其唯一不同的地方在于,如果要用循环的方式访问,需要介绍两个属性,children 和 modules,下面我们举例来说明"
164-
]
165-
},
166144
{
167145
"cell_type": "code",
168146
"execution_count": 28,
@@ -293,15 +271,6 @@
293271
" print(i)"
294272
]
295273
},
296-
{
297-
"cell_type": "markdown",
298-
"metadata": {},
299-
"source": [
300-
"通过上面的例子,看到区别了吗?\n",
301-
"\n",
302-
"children 只会访问到模型定义中的第一层,因为上面的模型中定义了三个 Sequential,所以只会访问到三个 Sequential,而 modules 会访问到最后的结构,比如上面的例子,modules 不仅访问到了 Sequential,也访问到了 Sequential 里面,这就对我们做初始化非常方便,比如"
303-
]
304-
},
305274
{
306275
"cell_type": "code",
307276
"execution_count": 33,
@@ -320,15 +289,7 @@
320289
"cell_type": "markdown",
321290
"metadata": {},
322291
"source": [
323-
"这上面实现了和 Sequential 相同的初始化,同样非常简便"
324-
]
325-
},
326-
{
327-
"cell_type": "markdown",
328-
"metadata": {},
329-
"source": [
330-
"## torch.nn.init\n",
331-
"因为 PyTorch 灵活的特性,我们可以直接对 Tensor 进行操作从而初始化,PyTorch 也提供了初始化的函数帮助我们快速初始化,就是 `torch.nn.init`,其操作层面仍然在 Tensor 上,下面我们举例说明"
292+
"## torch.nn.init"
332293
]
333294
},
334295
{
@@ -397,7 +358,7 @@
397358
}
398359
],
399360
"source": [
400-
"init.xavier_uniform(net1[0].weight) # 这就是上面我们讲过的 Xavier 初始化方法,PyTorch 直接内置了其实现"
361+
"init.xavier_uniform(net1[0].weight)"
401362
]
402363
},
403364
{
@@ -427,22 +388,6 @@
427388
"source": [
428389
"print(net1[0].weight)"
429390
]
430-
},
431-
{
432-
"cell_type": "markdown",
433-
"metadata": {},
434-
"source": [
435-
"可以看到参数已经被修改了\n",
436-
"\n",
437-
"`torch.nn.init` 为我们提供了更多的内置初始化方式,避免了我们重复去实现一些相同的操作"
438-
]
439-
},
440-
{
441-
"cell_type": "markdown",
442-
"metadata": {},
443-
"source": [
444-
"上面讲了两种初始化方式,其实它们的本质都是一样的,就是去修改某一层参数的实际值,而 `torch.nn.init` 提供了更多成熟的深度学习相关的初始化方式,非常方便"
445-
]
446391
}
447392
],
448393
"metadata": {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /