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 Issues

应该是我的问题……

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

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

关于第五章的函数 d2l.train_ch5

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

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

《动手学深度学习》(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/ 会实时刷新等

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

No module named 'd2lzh_pytorch'

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

关于第九章的一些疑问

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

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
使用清华镜像

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:
...

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

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

报错,核心已转储

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
...

丢弃法的 dropout 函数有误

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

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

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

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)

书中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。

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。

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)

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

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:
...

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:无
...

关于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.]])

建议增加CI/CD

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

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

关于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

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

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
...

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

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

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

自定义的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
...

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
...

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.