Skip to content

Commit 08fd132

Browse files
committed
[1e feedback code]ch9
1 parent 105a613 commit 08fd132

11 files changed

+68
-70
lines changed

chapter_computer-vision/anchor.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ img = image.imread('../img/catdog.jpg').asnumpy()
2929
h, w = img.shape[0:2]
3030
3131
print(h, w)
32-
X = nd.random.uniform(shape=(1, 3, h, w)) # 构造输入数据
32+
X = nd.random.uniform(shape=(1, 3, h, w)) # 构造输入数据
3333
Y = contrib.nd.MultiBoxPrior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])
3434
Y.shape
3535
```
@@ -44,7 +44,7 @@ boxes[250, 250, 0, :]
4444
为了描绘图像中以某个像素为中心的所有锚框,我们先定义`show_bboxes`函数以便在图像上画出多个边界框。
4545

4646
```{.python .input n=4}
47-
# 本函数已保存在 d2lzh 包中方便以后使用。
47+
# 本函数已保存在d2lzh包中方便以后使用
4848
def show_bboxes(axes, bboxes, labels=None, colors=None):
4949
def _make_list(obj, default_values=None):
5050
if obj is None:
@@ -179,9 +179,9 @@ labels[0]
179179
anchors = nd.array([[0.1, 0.08, 0.52, 0.92], [0.08, 0.2, 0.56, 0.95],
180180
[0.15, 0.3, 0.62, 0.91], [0.55, 0.2, 0.9, 0.88]])
181181
offset_preds = nd.array([0] * anchors.size)
182-
cls_probs = nd.array([[0] * 4, # 背景的预测概率
183-
[0.9, 0.8, 0.7, 0.1], # 狗的预测概率
184-
[0.1, 0.2, 0.3, 0.9]]) # 猫的预测概率
182+
cls_probs = nd.array([[0] * 4, # 背景的预测概率
183+
[0.9, 0.8, 0.7, 0.1], # 狗的预测概率
184+
[0.1, 0.2, 0.3, 0.9]]) # 猫的预测概率
185185
```
186186

187187
在图像上打印预测边界框和它们的置信度。

chapter_computer-vision/bounding-box.md

+4-5
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,23 @@ from mxnet import image
1717
```{.python .input}
1818
d2l.set_figsize()
1919
img = image.imread('../img/catdog.jpg').asnumpy()
20-
d2l.plt.imshow(img); # 加分号只显示图
20+
d2l.plt.imshow(img); # 加分号只显示图
2121
```
2222

2323
## 边界框
2424

2525
在目标检测里,我们通常使用边界框(bounding box)来描述目标位置。边界框是一个矩形框,可以由矩形左上角的$x$和$y$轴坐标与右下角的$x$和$y$轴坐标确定。我们根据上图坐标信息来定义图中狗和猫的边界框。上图中的坐标原点在图像的左上角,原点往右和往下分别为$x$轴和$y$轴的正方向。
2626

2727
```{.python .input n=2}
28-
# bbox 是 bounding box 的缩写。
28+
# bbox是bounding box的缩写
2929
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]
3030
```
3131

3232
我们可以在图中将边界框画出来,以检查其是否准确。画之前,我们定义一个辅助函数`bbox_to_rect`。它将边界框表示成matplotlib的边界框格式。
3333

3434
```{.python .input n=3}
35-
def bbox_to_rect(bbox, color): # 本函数已保存在 d2lzh 包中方便以后使用。
36-
# 将边界框(左上 x、左上 y,右下 x,右下 y)格式转换成 matplotlib 格式:
37-
# ((左上 x,左上 y),宽,高)。
35+
def bbox_to_rect(bbox, color): # 本函数已保存在d2lzh包中方便以后使用
36+
# 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:((左上x,左上y),宽,高)
3837
return d2l.plt.Rectangle(
3938
xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
4039
fill=False, edgecolor=color, linewidth=2)

chapter_computer-vision/fine-tuning.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ d2l.show_images(hotdogs + not_hotdogs, 2, 8, scale=1.4);
7070
在训练时,我们先从图像中裁剪出随机大小和随机高宽比的一块随机区域,然后将该区域缩放为高和宽均为224像素的输入。测试时,我们将图像的高和宽均缩放为256像素,然后从中裁剪出高和宽均为224像素的中心区域作为输入。此外,我们对RGB(红、绿、蓝)三个颜色通道的数值做标准化:每个数值减去该通道所有数值的平均值,再除以该通道所有数值的标准差作为输出。
7171

7272
```{.python .input n=5}
73-
# 指定 RGB 三个通道的均值和方差来将图像通道归一化。
73+
# 指定RGB三个通道的均值和方差来将图像通道归一化
7474
normalize = gdata.vision.transforms.Normalize(
7575
[0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
7676
@@ -107,7 +107,7 @@ pretrained_net.output
107107
finetune_net = model_zoo.vision.resnet18_v2(classes=2)
108108
finetune_net.features = pretrained_net.features
109109
finetune_net.output.initialize(init.Xavier())
110-
# output 中的模型参数将在迭代中使用 10 倍大的学习率。
110+
# output中的模型参数将在迭代中使用10倍大的学习率
111111
finetune_net.output.collect_params().setattr('lr_mult', 10)
112112
```
113113

chapter_computer-vision/image-augmentation.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ d2l.plt.imshow(img.asnumpy())
2727
下面定义绘图函数`show_images`
2828

2929
```{.python .input n=23}
30-
# 本函数已保存在 d2lzh 包中方便以后使用。
30+
# 本函数已保存在d2lzh包中方便以后使用
3131
def show_images(imgs, num_rows, num_cols, scale=2):
3232
figsize = (num_cols * scale, num_rows * scale)
3333
_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
@@ -139,10 +139,10 @@ def load_cifar10(is_train, augs, batch_size):
139139
首先,我们定义`try_all_gpus`函数,从而能够获取所有可用的GPU。
140140

141141
```{.python .input n=35}
142-
def try_all_gpus(): # 本函数已保存在 d2lzh 包中方便以后使用。
142+
def try_all_gpus(): # 本函数已保存在d2lzh包中方便以后使用
143143
ctxes = []
144144
try:
145-
for i in range(16): # 假设一台机器上 GPU 的个数不超过 16。
145+
for i in range(16): # 假设一台机器上GPU的数量不超过16
146146
ctx = mx.gpu(i)
147147
_ = nd.array([0], ctx=ctx)
148148
ctxes.append(ctx)
@@ -160,15 +160,14 @@ def _get_batch(batch, ctx):
160160
features, labels = batch
161161
if labels.dtype != features.dtype:
162162
labels = labels.astype(features.dtype)
163-
# 当 ctx 包含多个 GPU 时,划分小批量数据样本并复制到各个 GPU 上。
164163
return (gutils.split_and_load(features, ctx),
165164
gutils.split_and_load(labels, ctx), features.shape[0])
166165
```
167166

168167
然后,我们定义`evaluate_accuracy`函数评价模型的分类准确率。与[“Softmax回归的从零开始实现”](../chapter_deep-learning-basics/softmax-regression-scratch.md)[“卷积神经网络(LeNet)”](../chapter_convolutional-neural-networks/lenet.md)两节中描述的`evaluate_accuracy`函数不同,这里定义的函数更加通用:它通过辅助函数`_get_batch`使用`ctx`变量所包含的所有GPU来评价模型。
169168

170169
```{.python .input n=36}
171-
# 本函数已保存在 d2lzh 包中方便以后使用。
170+
# 本函数已保存在d2lzh包中方便以后使用
172171
def evaluate_accuracy(data_iter, net, ctx=[mx.cpu()]):
173172
if isinstance(ctx, mx.Context):
174173
ctx = [ctx]
@@ -186,7 +185,7 @@ def evaluate_accuracy(data_iter, net, ctx=[mx.cpu()]):
186185
接下来,我们定义`train`函数使用多GPU训练并评价模型。
187186

188187
```{.python .input n=37}
189-
# 本函数已保存在 d2lzh 包中方便以后使用。
188+
# 本函数已保存在d2lzh包中方便以后使用
190189
def train(train_iter, test_iter, net, loss, trainer, ctx, num_epochs):
191190
print('training on', ctx)
192191
if isinstance(ctx, mx.Context):

chapter_computer-vision/kaggle-gluon-cifar10.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import time
4242
为方便快速上手,我们提供了上述数据集的小规模采样,其中“train_tiny.zip”包含100个训练样本,而“test_tiny.zip”仅包含1个测试样本。它们解压后的文件夹名称分别为“train_tiny”和“test_tiny”。此外,将训练数据集标签的压缩文件解压,并得到“trainLabels.csv”。如果你将使用上述Kaggle比赛的完整数据集,还需要把下面`demo`变量改为`False`
4343

4444
```{.python .input n=2}
45-
# 如果使用下载的 Kaggle 比赛的完整数据集,把 demo 变量改为 False。
45+
# 如果使用下载的Kaggle比赛的完整数据集,把demo变量改为False
4646
demo = True
4747
if demo:
4848
import zipfile
@@ -58,7 +58,7 @@ if demo:
5858
```{.python .input n=3}
5959
def read_label_file(data_dir, label_file, train_dir, valid_ratio):
6060
with open(os.path.join(data_dir, label_file), 'r') as f:
61-
# 跳过文件头行(栏名称)
61+
# 跳过文件头行(栏名称)
6262
lines = f.readlines()[1:]
6363
tokens = [l.rstrip().split(',') for l in lines]
6464
idx_label = dict(((int(idx), label) for idx, label in tokens))
@@ -72,7 +72,7 @@ def read_label_file(data_dir, label_file, train_dir, valid_ratio):
7272
下面定义一个辅助函数,从而仅在路径不存在的情况下创建路径。
7373

7474
```{.python .input n=4}
75-
def mkdir_if_not_exist(path): # 本函数已保存在 d2lzh 包中方便以后使用。
75+
def mkdir_if_not_exist(path): # 本函数已保存在d2lzh包中方便以后使用
7676
if not os.path.exists(os.path.join(*path)):
7777
os.makedirs(os.path.join(*path))
7878
```
@@ -126,8 +126,8 @@ def reorg_cifar10_data(data_dir, label_file, train_dir, test_dir, input_dir,
126126

127127
```{.python .input n=8}
128128
if demo:
129-
# 注意:此处使用小训练集和小测试集并将批量大小相应设小。使用 Kaggle 比赛的完整数据集时
130-
# 可设批量大小为较大整数。
129+
# 注意:此处使用小训练集和小测试集并将批量大小相应设小。使用Kaggle比赛的完整数据集时可
130+
# 设批量大小为较大整数
131131
train_dir, test_dir, batch_size = 'train_tiny', 'test_tiny', 1
132132
else:
133133
train_dir, test_dir, batch_size = 'train', 'test', 128
@@ -143,15 +143,15 @@ reorg_cifar10_data(data_dir, label_file, train_dir, test_dir, input_dir,
143143

144144
```{.python .input n=9}
145145
transform_train = gdata.vision.transforms.Compose([
146-
# 将图像放大成高和宽各为 40 像素的正方形。
146+
# 将图像放大成高和宽各为40像素的正方形
147147
gdata.vision.transforms.Resize(40),
148-
# 随机对高和宽各为 40 像素的正方形图像裁剪出面积为原图像面积 0.64 到 1 倍之间的小正方
149-
# 形,再放缩为高和宽各为 32 像素的正方形。
148+
# 随机对高和宽各为40像素的正方形图像裁剪出面积为原图像面积0.64到1倍之间的小正方形,再放
149+
# 缩为高和宽各为32像素的正方形
150150
gdata.vision.transforms.RandomResizedCrop(32, scale=(0.64, 1.0),
151151
ratio=(1.0, 1.0)),
152152
gdata.vision.transforms.RandomFlipLeftRight(),
153153
gdata.vision.transforms.ToTensor(),
154-
# 对图像的每个通道做标准化
154+
# 对图像的每个通道做标准化
155155
gdata.vision.transforms.Normalize([0.4914, 0.4822, 0.4465],
156156
[0.2023, 0.1994, 0.2010])])
157157
```
@@ -170,7 +170,7 @@ transform_test = gdata.vision.transforms.Compose([
170170
接下来,我们可以通过创建`ImageFolderDataset`实例来读取整理后的含原始图像文件的数据集,其中每个数据样本包括图像和标签。
171171

172172
```{.python .input n=10}
173-
# 读取原始图像文件。flag=1 说明输入图像有三个通道(彩色)
173+
# 读取原始图像文件。flag=1说明输入图像有3个通道(彩色)
174174
train_ds = gdata.vision.ImageFolderDataset(
175175
os.path.join(data_dir, input_dir, 'train'), flag=1)
176176
valid_ds = gdata.vision.ImageFolderDataset(

chapter_computer-vision/kaggle-gluon-dog.md

+19-19
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import zipfile
4343
为方便快速上手,我们提供了上述数据集的小规模采样“train_valid_test_tiny.zip”。如果你要使用上述Kaggle比赛的完整数据集,还需要把下面`demo`变量改为`False`
4444

4545
```{.python .input n=1}
46-
# 如果使用下载的 Kaggle 比赛的完整数据集,把下面改为 False。
46+
# 如果使用下载的Kaggle比赛的完整数据集,把demo变量改为False
4747
demo = True
4848
data_dir = '../data/kaggle_dog'
4949
if demo:
@@ -61,10 +61,10 @@ for f in zipfiles:
6161

6262
```{.python .input}
6363
def reorg_train_valid(data_dir, train_dir, input_dir, valid_ratio, idx_label):
64-
# 训练集中数量最少一类的狗的样本数
64+
# 训练集中数量最少一类的狗的样本数
6565
min_n_train_per_label = (
6666
collections.Counter(idx_label.values()).most_common()[:-2:-1][0][1])
67-
# 验证集中每类狗的样本数
67+
# 验证集中每类狗的样本数
6868
n_valid_per_label = math.floor(min_n_train_per_label * valid_ratio)
6969
label_count = {}
7070
for train_file in os.listdir(os.path.join(data_dir, train_dir)):
@@ -89,14 +89,14 @@ def reorg_train_valid(data_dir, train_dir, input_dir, valid_ratio, idx_label):
8989
```{.python .input n=2}
9090
def reorg_dog_data(data_dir, label_file, train_dir, test_dir, input_dir,
9191
valid_ratio):
92-
# 读取训练数据标签
92+
# 读取训练数据标签
9393
with open(os.path.join(data_dir, label_file), 'r') as f:
94-
# 跳过文件头行(栏名称)
94+
# 跳过文件头行(栏名称)
9595
lines = f.readlines()[1:]
9696
tokens = [l.rstrip().split(',') for l in lines]
9797
idx_label = dict(((idx, label) for idx, label in tokens))
9898
reorg_train_valid(data_dir, train_dir, input_dir, valid_ratio, idx_label)
99-
# 整理测试集
99+
# 整理测试集
100100
d2l.mkdir_if_not_exist([data_dir, input_dir, 'test', 'unknown'])
101101
for test_file in os.listdir(os.path.join(data_dir, test_dir)):
102102
shutil.copy(os.path.join(data_dir, test_dir, test_file),
@@ -107,8 +107,8 @@ def reorg_dog_data(data_dir, label_file, train_dir, test_dir, input_dir,
107107

108108
```{.python .input n=3}
109109
if demo:
110-
# 注意:此处使用小数据集并将批量大小相应设小。使用 Kaggle 比赛的完整数据集时可设批量大
111-
# 小为较大整数。
110+
# 注意:此处使用小数据集并将批量大小相应设小。使用Kaggle比赛的完整数据集时可设批量大小
111+
# 为较大整数
112112
input_dir, batch_size = 'train_valid_test_tiny', 1
113113
else:
114114
label_file, train_dir, test_dir = 'labels.csv', 'train', 'test'
@@ -123,18 +123,18 @@ else:
123123

124124
```{.python .input n=4}
125125
transform_train = gdata.vision.transforms.Compose([
126-
# 随机对图像裁剪出面积为原图像面积 0.08 到 1 倍之间、且高和宽之比在 3/4 和 4/3 之间
127-
# 的图像,再放缩为高和宽均为 224 像素的新图像。
126+
# 随机对图像裁剪出面积为原图像面积0.08到1倍之间、且高和宽之比在3/4和4/3之间的图像,再
127+
# 放缩为高和宽均为224像素的新图像
128128
gdata.vision.transforms.RandomResizedCrop(224, scale=(0.08, 1.0),
129129
ratio=(3.0/4.0, 4.0/3.0)),
130130
gdata.vision.transforms.RandomFlipLeftRight(),
131-
# 随机变化亮度、对比度和饱和度
131+
# 随机变化亮度、对比度和饱和度
132132
gdata.vision.transforms.RandomColorJitter(brightness=0.4, contrast=0.4,
133133
saturation=0.4),
134-
# 随机加噪音。
134+
# 随机加噪声
135135
gdata.vision.transforms.RandomLighting(0.1),
136136
gdata.vision.transforms.ToTensor(),
137-
# 对图像的每个通道做标准化
137+
# 对图像的每个通道做标准化
138138
gdata.vision.transforms.Normalize([0.485, 0.456, 0.406],
139139
[0.229, 0.224, 0.225])])
140140
```
@@ -144,7 +144,7 @@ transform_train = gdata.vision.transforms.Compose([
144144
```{.python .input}
145145
transform_test = gdata.vision.transforms.Compose([
146146
gdata.vision.transforms.Resize(256),
147-
# 将图像中央的高和宽均为 224 的正方形区域裁剪出来。
147+
# 将图像中央的高和宽均为224的正方形区域裁剪出来
148148
gdata.vision.transforms.CenterCrop(224),
149149
gdata.vision.transforms.ToTensor(),
150150
gdata.vision.transforms.Normalize([0.485, 0.456, 0.406],
@@ -188,14 +188,14 @@ test_iter = gdata.DataLoader(test_ds.transform_first(transform_test),
188188
```{.python .input n=6}
189189
def get_net(ctx):
190190
finetune_net = model_zoo.vision.resnet34_v2(pretrained=True)
191-
# 定义新的输出网络
191+
# 定义新的输出网络
192192
finetune_net.output_new = nn.HybridSequential(prefix='')
193193
finetune_net.output_new.add(nn.Dense(256, activation='relu'))
194-
# 120 是输出的类别数。
194+
# 120是输出的类别个数
195195
finetune_net.output_new.add(nn.Dense(120))
196-
# 初始化输出网络
196+
# 初始化输出网络
197197
finetune_net.output_new.initialize(init.Xavier(), ctx=ctx)
198-
# 把模型参数分配到即将用于计算的 CPU 或 GPU 上。
198+
# 把模型参数分配到内存或显存上
199199
finetune_net.collect_params().reset_ctx(ctx)
200200
return finetune_net
201201
```
@@ -223,7 +223,7 @@ def evaluate_loss(data_iter, net, ctx):
223223
```{.python .input n=7}
224224
def train(net, train_iter, valid_iter, num_epochs, lr, wd, ctx, lr_period,
225225
lr_decay):
226-
# 只训练我们定义的小规模输出网络。
226+
# 只训练自定义的小规模输出网络
227227
trainer = gluon.Trainer(net.output_new.collect_params(), 'sgd',
228228
{'learning_rate': lr, 'momentum': 0.9, 'wd': wd})
229229
for epoch in range(num_epochs):

chapter_computer-vision/multiscale-object-detection.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ h, w
2525
d2l.set_figsize()
2626
2727
def display_anchors(fmap_w, fmap_h, s):
28-
fmap = nd.zeros((1, 10, fmap_w, fmap_h)) # 前两维的取值不影响输出结果
28+
fmap = nd.zeros((1, 10, fmap_w, fmap_h)) # 前两维的取值不影响输出结果
2929
anchors = contrib.nd.MultiBoxPrior(fmap, sizes=s, ratios=[1, 2, 0.5])
3030
bbox_scale = nd.array((w, h, w, h))
3131
d2l.show_bboxes(d2l.plt.imshow(img.asnumpy()).axes,

chapter_computer-vision/neural-style.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,13 @@ style_channels = [net[l].weight.shape[0] for l in style_layers]
160160
content_weight, style_weight, tv_weight = 1, 1e3, 10
161161
162162
def compute_loss(X, contents_Y_hat, styles_Y_hat, contents_Y, styles_Y_gram):
163-
# 分别计算内容、样式和总变差损失。
163+
# 分别计算内容损失、样式损失和总变差损失
164164
contents_l = [content_loss(Y_hat, Y) * content_weight for Y_hat, Y in zip(
165165
contents_Y_hat, contents_Y)]
166166
styles_l = [style_loss(Y_hat, Y) * style_weight for Y_hat, Y in zip(
167167
styles_Y_hat, styles_Y_gram)]
168168
tv_l = tv_loss(X) * tv_weight
169-
# 对所有损失求和
169+
# 对所有损失求和
170170
l = nd.add_n(*styles_l) + nd.add_n(*contents_l) + tv_l
171171
return contents_l, styles_l, tv_l, l
172172
```

chapter_computer-vision/object-detection-dataset.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ def _download_pikachu(data_dir):
2929
我们通过创建`ImageDetIter`实例来读取目标检测数据集。其中名称里的“Det”指的是Detection(检测)。我们将以随机顺序读取训练数据集。由于数据集的格式为RecordIO,我们需要提供图像索引文件`'train.idx'`以随机读取小批量。此外,对于训练集的每张图像,我们将采用随机裁剪,并要求裁剪出的图像至少覆盖每个目标95%的区域。由于裁剪是随机的,这个要求不一定总被满足。我们设定最多尝试200次随机裁剪:如果都不符合要求则不裁剪图像。为保证输出结果的确定性,我们不随机裁剪测试数据集中的图像。我们也无需按随机顺序读取测试数据集。
3030

3131
```{.python .input n=2}
32-
# 本函数已保存在 d2lzh 包中方便以后使用。
33-
def load_data_pikachu(batch_size, edge_size=256): # edge_size:输出图像的宽和高
32+
# 本函数已保存在d2lzh包中方便以后使用
33+
def load_data_pikachu(batch_size, edge_size=256): # edge_size:输出图像的宽和高
3434
data_dir = '../data/pikachu'
3535
_download_pikachu(data_dir)
3636
train_iter = image.ImageDetIter(
3737
path_imgrec=os.path.join(data_dir, 'train.rec'),
3838
path_imgidx=os.path.join(data_dir, 'train.idx'),
3939
batch_size=batch_size,
40-
data_shape=(3, edge_size, edge_size), # 输出图像的形状
41-
shuffle=True, # 以随机顺序读取数据集
42-
rand_crop=1, # 随机裁剪的概率为 1。
40+
data_shape=(3, edge_size, edge_size), # 输出图像的形状
41+
shuffle=True, # 以随机顺序读取数据集
42+
rand_crop=1, # 随机裁剪的概率为1
4343
min_object_covered=0.95, max_attempts=200)
4444
val_iter = image.ImageDetIter(
4545
path_imgrec=os.path.join(data_dir, 'val.rec'), batch_size=batch_size,

0 commit comments

Comments
 (0)