Giter VIP home page Giter VIP logo

shusentang / dive-into-dl-pytorch Goto Github PK

View Code? Open in Web Editor NEW
17.8K 389.0 5.3K 34.33 MB

本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。

Home Page: http://tangshusen.me/Dive-into-DL-PyTorch

License: Apache License 2.0

Jupyter Notebook 99.06% Python 0.94% Dockerfile 0.01%
deep-learning deep-learning-tutorial pytorch pytorch-tutorial computer-vision natural-language-processing d2l

dive-into-dl-pytorch's People

Contributors

fangmingzhou avatar fengredrum avatar forest0 avatar npuichigo avatar shusentang avatar yangefei avatar yongboy avatar zooltd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dive-into-dl-pytorch's Issues

3.2节里的线性回归w和b的初始化时数据为float32类型,导致后面计算矩阵相乘错误

python vision:py3.7
torchvision:0.4.0

3.2节里的线性回归w和b的初始化时数据为float32类型,导致后面计算矩阵相乘错误
我试着打印出features时,发现数据类型是float64类型的,而后面的w和b均是float32类型。训练的时候使用torch.mm做矩阵,这个函数需要统一传进来的三个参数类型,所以在初始化w和b时需要将其设置为torch.float64类型才可以。

验证如下:
LUN_JV9XPNS9 1){_300 $8
error

修改后的结果如下:
1572143875(1)
4(V6YZBV@`QXJ%E6OD}0LVI

3.3.4节报错:'LinearNet' object does not support indexing

python版本为3.6.3
pytorch版本为1.2.0

建议将原代码

init.normal_(net[0].weight, mean=0, std=0.01)
init.constant_(net[0].bias, val=0)  # 也可以直接修改bias的data: net[0].bias.data.fill_(0)

更改为:

init.normal_(net.linear.weight, mean=0, std=0.01)
init.constant_(net.linear.bias, val=0)  # 也可以直接修改bias的data: net[0].bias.data.fill_(0)

5.10.2 「从零开始实现批量归一化」 的实现可以优化

bug描述
文中是这样写的:

mean = X.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)

而原文是这样的:

mean = X.mean(axis=(0, 2, 3), keepdims=True)

事实上,pytorch 也支持类似写法,如下:

mean = X.mean(dim=(0, 2, 3), keepdim=True)

这种写法除了简洁外,数值上应该更精确一些。
版本信息
pytorch: 1.3.1
...

自定义的sgd函数中的“除以batch_size”是否要省略需要视loss如何定义

bug描述

def sgd(params, lr, batch_size):
    # 为了和原书保持一致,这里除以了batch_size,但是应该是不用除的,因为一般用PyTorch计算loss时就默认已经沿batch维求了平均了。除batch size后训练速度变慢
    for param in params:
        param.data -= lr * param.grad #/ batch_size

首先说batch_size需要除就必须除,不能除就必须不除,没有应该不应该。

loss的定义如果是如3.7节中调用nn.CrossEntropyLoss(),是不能除以batch_size的,原因如源码所述,CrossEntropyLoss()已经沿batch_size取了平均。
而如果loss是采用3.6节中自定义的cross_entropy函数,而且在训练时l = loss(y_hat, y).sum()(计算的是批量样本loss和,不是平均),那在sgd中必须要除以batch_size,而如果定义l = loss(y_hat, y).sum()/batch_size,效果跟调用nn.CrossEntropyLoss()是相同的,此时sgd就不能再除以batch_size了。

这里定义loss的方式不同,带来的另一个问题是每一个epoch结束后计算平均loss的方式,如#74 所述,如果loss的定义是3.7节中调用nn.CrossEntropyLoss(),在print loss时,应该是train_loss_sum/len(train_iter),而如果l = loss(y_hat, y).sum(),才是train_loss_sum/n

版本信息
pytorch:1.3.1
torchvision:0.4.2
torchtext:0.4.0
...

报错,核心已转储

bug描述
3.6节运行时出错,猜测与“import d2lzh_pytorch as d2l”有关。
下面是具体bug信息:
bash: 行 1: 12013 段错误 (核心已转储) env "PYCHARM_HOSTED"="1" "PYTHONUNBUFFERED"="1" "PYTHONIOENCODING"="UTF-8" "PYCHARM_MATPLOTLIB_PORT"="49946" "JETBRAINS_REMOTE_RUN"="1" "PYTHONPATH"="/home/zjr/pytorch:/home/zjr/pytorch/SR-GNN-master/pytorch_code:/home/zjr/.pycharm_helpers/pycharm_matplotlib_backend" '/home/zjr/anaconda3/envs/pytorch/bin/python3.6' '-u' '/home/zjr/pytorch/pytorch-pretrain/3.6_simple.py'

版本信息
pytorch:1.2.0
torchvision:0.4.0
torchtext:0.3.1
...

3.16节 kaggle_house的一个小错误

bug描述
在预处理数据代码中,原文为
all_features[numeric_features] = all_features[numeric_features].fillna(0)
最终输出应为 all_features.shape = (2919, 331)
而在您编写的代码中,此句变为
all_features = all_features.fillna(0)
最终输出为all_features.shape = (2919, 354),
初次接触pandas,不知这个是您的疏忽还是由于我对代码的理解不充分,望解答,十分感谢。

版本信息
pytorch:
torchvision:
torchtext:
...

书中seq2seq + Attention部分有一些代码是基于size间相等的前提写的,which is not always true.

image

比如这个attention前向传播的代码,这里是默认encoder_hidden_size == decoder_hidden_size,所以下面红线处input_size 才能用2倍num_hiddens来赋值,并且上面红线处才可以直接dec_state.expand_as(enc_state)。

image
这边又默认了hidden_size == embedding_size,所以decoder中的input_size 才能用2倍embedding_size来赋值。

我感觉这里是不是写的更具有普遍性会比较好,否则容易误导读者,我一开始就纳闷了很久为什么是*2。

5.10使用pandoc转为pdf报错

bug描述
chapter05中的5.10_batch-norm.md文件,转为pdf的时候报错。信息如下:

Error producing PDF.
! Missing { inserted.

_um_group_begin:
l.135 [\boldsymbol{\mu}
\mathcal

对markdown和LaTeX的语法不熟,不知道是什么原因?其他的章节都没问题。

谢谢
版本信息
pytorch:
torchvision:
torchtext:
...

关于Chap02中2.3_autograd.ipynb的疑问

原文中写到

如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么我么可以对tensor.data进行操作.

In [14]:
x = torch.ones(1,requires_grad=True)

print(x.data) # 还是一个tensor
print(x.data.requires_grad) # 但是已经是独立于计算图之外

y = 2 * x
x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播

y.backward()
print(x) # 更改data的值也会影响tensor的值
print(x.grad)

-----------输出结果-----------
tensor([1.])
False
tensor([100.], requires_grad=True)
tensor([2.])

我做了些尝试性的改变,发现输出了一些我无法理解的结果,比如把y = 2 * x 改成y = 2 * x * x时,print(x.grad)的输出结果变成202;如果把y = 2 * x改成y = 2 * x * x * xprint(x.grad)的输出结果变成20202

虽然结果似乎有一定的规律,但是我没找到。这种情况下应该怎么解释呢?

10.7.1.3文本情感分类章节,数据迭代器提示错误

bug描述
描述一下你遇到的bug, 例如报错位置、报错信息(重要, 可以直接截个图)等
在创建数据迭代器的时候报错,没有错误提示,显示的是某一个单词卡住,之前以为是代码写错了,但是在运行了课本提供的代码后依然有这个错误问题。
image

版本信息
pytorch:1.0.0
torchvision:
torchtext:0.4.0
...

3.7_softmax-regression-pytorch.ipynb中运行d2l.train_ch3()报错

bug描述
运行d2l.train_ch3()报错
报错位置:
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)
报错信息:

RuntimeError Traceback (most recent call last)
in
1 num_epochs = 5
----> 2 d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

D:\Users\Administrator\Anaconda3\Dive-into-DL-PyTorch-master\code\d2lzh_pytorch\utils.py in train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr, optimizer)
140 train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()
141 n += y.shape[0]
--> 142 test_acc = evaluate_accuracy(test_iter, net)
143 print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
144 % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))

D:\Users\Administrator\Anaconda3\Dive-into-DL-PyTorch-master\code\d2lzh_pytorch\utils.py in evaluate_accuracy(data_iter, net, device)
212 if isinstance(net, torch.nn.Module):
213 net.eval() # 评估模式, 这会关闭dropout
--> 214 acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item()
215 net.train() # 改回训练模式
216 else: # 自定义的模型, 3.13节之后不会用到, 不考虑GPU

d:\program files\python36\lib\site-packages\torch\nn\modules\module.py in call(self, *input, **kwargs)
539 result = self._slow_forward(*input, **kwargs)
540 else:
--> 541 result = self.forward(*input, **kwargs)
542 for hook in self._forward_hooks.values():
543 hook_result = hook(self, input, result)

d:\program files\python36\lib\site-packages\torch\nn\modules\container.py in forward(self, input)
90 def forward(self, input):
91 for module in self._modules.values():
---> 92 input = module(input)
93 return input
94

d:\program files\python36\lib\site-packages\torch\nn\modules\module.py in call(self, *input, **kwargs)
539 result = self._slow_forward(*input, **kwargs)
540 else:
--> 541 result = self.forward(*input, **kwargs)
542 for hook in self._forward_hooks.values():
543 hook_result = hook(self, input, result)

d:\program files\python36\lib\site-packages\torch\nn\modules\linear.py in forward(self, input)
85
86 def forward(self, input):
---> 87 return F.linear(input, self.weight, self.bias)
88
89 def extra_repr(self):

d:\program files\python36\lib\site-packages\torch\nn\functional.py in linear(input, weight, bias)
1368 if input.dim() == 2 and bias is not None:
1369 # fused op is marginally faster
-> 1370 ret = torch.addmm(bias, input, weight.t())
1371 else:
1372 output = input.matmul(weight.t())

RuntimeError: Expected object of device type cuda but got device type cpu for argument #1 'self' in call to _th_addmm

版本信息
pytorch: 1.3.0
torchvision: 0.4.1
torchtext: 0.4.0
...

No module named 'd2lzh_pytorch'

bug描述
描述一下你遇到的bug, 例如报错位置、报错信息(重要, 可以直接截个图)等
我在3.10 节中引入 d2lzh_pytorch 这个包后总是报错,说我没有这个包,我想问问这个包应该是在哪里安装的,我查了没查到,谢谢作者解答
版本信息
pytorch: 1.3.1
torchvision: 0.4.2
torchtext: 0.4.0
...

建议增加CI/CD

可以在CI里边做静态网页生成和pdf生成,在CD里边部署网页,这样就可以只专注于markdown及图片的修改。

看了下,作者似乎是想放到github pages上,travis-ci 也有相应的支持

关于第五章的函数 d2l.train_ch5

bug描述
关于第五章的函数 d2l.train_ch5 中的batch_count=0难道不应该写在循环内部吗,请问老师您为什么把问题关掉了,不太理解,所以再来询问一下。

版本信息
pytorch:
torchvision:
torchtext:
...

3.2.7训练模型 代码bug

bug描述
3.2.7训练模型 代码运行报错

RuntimeError Traceback (most recent call last)
in
8 # 和y分别是小批量样本的特征和标签
9 for X, y in data_iter(batch_size, features, labels):
---> 10 l = loss(net(X, w, b), y).sum() # l是有关小批量X和y的损失
11 l.backward() # 小批量的损失对模型参数求梯度
12 sgd([w, b], lr, batch_size) # 使用小批量随机梯度下降迭代模型参数

in linreg(X, w, b)
1 def linreg(X, w, b): # 本函数已保存在d2lzh_pytorch包中方便以后使用
----> 2 return torch.mm(X, w) + b

RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #2 'mat2'

将3.2.3初始化参数部分类型改为double或float64可运行

版本信息
pytorch:1.2.0
torchvision:0.4.0
torchtext:?
安装指令是
conda install pytorch torchvision cudatoolkit=10.0
使用清华镜像

丢弃法的 dropout 函数有误

好吧,发现是我看了旧版本。

bug描述
丢弃法的 dropout 函数使用的 torch.randn 是正态分布,这样的话就不是精确按指定概率丢弃了,应该用平均分布。
image

版本信息
算法错误,跟版本无关

应该是我的问题……

bug描述
描述一下你遇到的bug, 例如报错位置、报错信息(重要, 可以直接截个图)等

版本信息
pytorch:3.7
torchvision:1.2.0
torchtext:0.4.0
...
image
set函数去重之后,后面的
image
idx_to_char访问会越界

关于3.13章丢弃法的疑惑

def dropout(X, drop_prob):
    X = X.float()
    assert 0 <= drop_prob <= 1
    keep_prob = 1 - drop_prob
    # 这种情况下把全部元素都丢弃
    if keep_prob == 0:
        return torch.zeros_like(X)
    mask = (torch.randn(X.shape) < keep_prob).float()
    
    return mask * X / keep_prob

此处randn生成的数不是分布在0-1之间,导致drop_prob为0时也会产生丢弃。

X = torch.arange(16).view(2, 8)
dropout(X, 0)
tensor([[ 0.,  0.,  2.,  3.,  4.,  5.,  6.,  7.],
        [ 8.,  9., 10.,  0., 12., 13., 14., 15.]])

2.2.4 运算的内存开销 中关于view之后是否是同一id的疑惑

教程中的表述,虽然没有明说,不过给人感觉是view这种操作不会改变id值。

但在我试验中,tensor在view之后,会变为新的id。如下代码:

x = torch.randn(1,2)
print(x)
y = x.view(1,2)
print(y)
print(id(x) == id(y))

tensor([[-0.7329, -1.4493]])
tensor([[-0.7329, -1.4493]])
False

不过使用torch自带的equal可以正确检查这两个是不是指向同一个tensor:

x = torch.zeros(3, 5)
y = x.view(3, 5)

print(torch.equal(x, y))

True

不过equal函数要求tensor有相同的size和elements。

3.5节fashion-mnist.ipynb下载FashionMNIST数据集报错

python 3.6.7
pytorch 1.1
torchvision 0.3

这一行报错
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())

0it [00:00, ?it/s]
Using downloaded and verified file: /home/zhoushijie/Datasets/FashionMNIST/FashionMNIST/raw/train-images-idx3-ubyte.gz
Extracting /home/zhoushijie/Datasets/FashionMNIST/FashionMNIST/raw/train-images-idx3-ubyte.gz
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to /home/zhoushijie/Datasets/FashionMNIST/FashionMNIST/raw/train-labels-idx1-ubyte.gz

ZeroDivisionError Traceback (most recent call last)
in
----> 1 mnist_train = torchvision.datasets.FashionMNIST(root='/Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())
2 mnist_test = torchvision.datasets.FashionMNIST(root='
/Datasets/FashionMNIST', train=False, download=True, transform=transforms.ToTensor())

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torchvision/datasets/mnist.py in init(self, root, train, transform, target_transform, download)
66
67 if download:
---> 68 self.download()
69
70 if not self._check_exists():

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torchvision/datasets/mnist.py in download(self)
143 filename = url.rpartition('/')[2]
144 file_path = os.path.join(self.raw_folder, filename)
--> 145 download_url(url, root=self.raw_folder, filename=filename, md5=None)
146 self.extract_gzip(gzip_path=file_path, remove_finished=True)
147

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torchvision/datasets/utils.py in download_url(url, root, filename, md5)
78 urllib.request.urlretrieve(
79 url, fpath,
---> 80 reporthook=gen_bar_updater()
81 )
82 except OSError:

~/anaconda3/envs/pytorch/lib/python3.6/urllib/request.py in urlretrieve(url, filename, reporthook, data)
272
273 if reporthook:
--> 274 reporthook(blocknum, bs, size)
275
276 while True:

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/torchvision/datasets/utils.py in bar_update(count, block_size, total_size)
13 pbar.total = total_size
14 progress_bytes = count * block_size
---> 15 pbar.update(progress_bytes - pbar.n)
16
17 return bar_update

~/anaconda3/envs/pytorch/lib/python3.6/site-packages/tqdm-4.7.2-py3.6.egg/tqdm/_tqdm.py in update(self, n)
687 if self.smoothing and delta_t:
688 self.avg_time = delta_t / delta_it
--> 689 if self.avg_time is None
690 else self.smoothing * delta_t / delta_it +
691 (1 - self.smoothing) * self.avg_time

ZeroDivisionError: float division by zero

4.1 doc结尾出现错误

Sequential、ModuleList、ModuleDict类继承自BlModuleock类。
最后应该是继承Module类吧。
感谢大佬给初学者提供PyTorch框架版!

loss计算错误

bug描述
3.7 3.9中计算交叉熵损失函数时使用tf.nn.CrossEntropyLoss()时,已经作了平均。
但是计算每一个epoch的损失时,又除了整个训练集样本的个数n ,这样对吗?

版本信息
pytorch:1.13
torchvision:0.4.2
torchtext:无
...

关于第九章的一些疑问

在mxnet原作9.4中,涉及到了MultiBoxTarget、MultiBoxPrior、MultiBoxDetection这几个库函数。我想探讨下在pytorch中相对应的库函数是什么呢?还是说只能自己手动实现这些功能?

《动手学深度学习》(PyTorch版)本地WEB访问打开姿势

针对使用Mac/Linux等终端(不支持Windows)各位,可以快速本地以web方式访问《动手学深度学习》(PyTorch版)项目。

这不是一个 Issue,目的想让大家本地阅读本文档时更为舒服一些 :))
管理员可随时关闭掉......

快速体验

  • git clone https://github.com/ShusenTang/Dive-into-DL-PyTorch.git
  • 终端下执行make wwwdocs命令
# cd Dive-into-DL-PyTorch
# make wwwdocs
bash script/prepare_wwwdocs.sh
本脚本将自动创建 .wwwdocs 目录
初始化项目依赖时将使用 docsify 工具自动生成本地文档web访问文档
本web文档为绿色创建,不会对现有项目产生副作用!不会产生产生git需要提交文件!
请放心食用 :))
根据项目README.md自动生成目录文件 ......
根据项目根目录下README.md以及docs/README.md合并生成项目所需${docs}导航 ......
生成 docsify 所需入口文件......
为各章节markdown文件以及图片建立软连接 ......
启动web server,稍后请在浏览器中打开:http://localhost:3000 ,即可访问 ......

Serving /Users/nieyong/ai/book/Dive-into-DL-PyTorch/.wwwdocs now.
Listening at http://localhost:3000
  • 在本地浏览器访问 http://127.0.0.1:3000/ 即可完整显示所有数学公式了

截图展示

启动成功之后,请在chrome等现代浏览器内访问:http://localhost:3000 即可。

来一个首页和导航标签显示:

内置JS完整支持数学公式显示(不再需要在Chrome上安装任何插件):

代码显示增加拷贝支持:

增加搜索支持:

其它

本方案非常绿色:

  • 完全不会对现有项目造成侵入
  • 经常执行git fetch ; git rebase命令即可更新上游文档内容
    • 完全不用重新构建!
    • http://127.0.0.1:3000/ 会实时刷新等

希望能给各位带来一点帮助 :))

docs文件夹下第二章的2.3节的文件讲梯度哪里好像显示出来有点问题

梯度哪里有一堆类似如下的符号:
数学上,如果有一个函数值和自变量都为向量的函数 $\vec{y}=f(\vec{x})$, 那么 $\vec{y}$ 关于 $\vec{x}$ 的梯度就是一个雅可比矩阵(Jacobian matrix):
$$
J=\left(\begin{array}{ccc}
\frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}}\
\vdots & \ddots & \vdots\
\frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}}
\end{array}\right)

看不太懂,可否修正一下?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.