提交 0489823c 编写于 作者: A Aston Zhang

revise cv, dlc, nlp, cp

上级 31bfc506
......@@ -33,19 +33,19 @@ x_gpu = nd.random.uniform(shape=(6000, 6000), ctx=mx.gpu(0))
然后,分别使用它们在CPU和GPU上运行`run`函数并打印所需时间。
```{.python .input}
run(x_cpu) # 预热开始。
run(x_cpu) # 预热开始。
run(x_gpu)
nd.waitall() # 预热结束。
nd.waitall() # 预热结束。
start = time()
run(x_cpu)
nd.waitall()
print('run on CPU: %f sec' % (time()-start))
print('run on CPU: %f sec' % (time() - start))
start = time()
run(x_gpu)
nd.waitall()
print('run on GPU: %f sec' % (time()-start))
print('run on GPU: %f sec' % (time() - start))
```
我们去掉`run(x_cpu)``run(x_gpu)`两个计算任务之间的`nd.waitall()`,希望系统能自动并行这两个任务。
......@@ -55,7 +55,7 @@ start = time()
run(x_cpu)
run(x_gpu)
nd.waitall()
print('run on both CPU and GPU: %f sec' % (time()-start))
print('run on both CPU and GPU: %f sec' % (time() - start))
```
可以看到,当两个计算任务一起执行时,执行总时间小于它们分开执行的总和。这表示,MXNet能有效地在CPU和GPU上自动并行计算。
......
......@@ -141,7 +141,8 @@ transform_train = gdata.vision.transforms.Compose([
ratio=(1.0, 1.0)),
# 随机左右翻转图片。
gdata.vision.transforms.RandomFlipLeftRight(),
# 将图片像素值按比例缩小到 0 和 1 之间,并将数据格式从“高*宽*通道”改为“通道*高*宽”。
# 将图片像素值按比例缩小到 0 和 1 之间,并将数据格式从“高 * 宽 * 通道”改为
# “通道 * 高 * 宽”。
gdata.vision.transforms.ToTensor(),
# 对图片的每个通道做标准化。
gdata.vision.transforms.Normalize([0.4914, 0.4822, 0.4465],
......
......@@ -146,7 +146,8 @@ transform_train = gdata.vision.transforms.Compose([
# 随机加噪音。
gdata.vision.transforms.RandomLighting(0.1),
# 将图片像素值按比例缩小到 0 和 1 之间,并将数据格式从“高*宽*通道”改为“通道*高*宽”。
# 将图片像素值按比例缩小到 0 和 1 之间,并将数据格式从“高 *宽 * 通道”改为
# “通道 * 高 * 宽”。
gdata.vision.transforms.ToTensor(),
# 对图片的每个通道做标准化。
gdata.vision.transforms.Normalize([0.485, 0.456, 0.406],
......
......@@ -133,9 +133,7 @@ def style_loss(y_hat, gram_y):
当我们使用靠近输出层的神经层输出来匹配时,经常可以观察到学到的合成图片里面有大量高频噪音,即有特别亮或者暗的颗粒像素。一种常用的降噪方法是总变差降噪(total variation denoising)。假设 $x_{i,j}$ 表示像素 $(i,j)$的值,总变差损失使得邻近的像素值相似:
$$
\sum_{i,j} |x_{i,j} - x_{i+1,j}| + |x_{i,j} - x_{i,j+1}|
$$
$$\sum_{i,j} \left|x_{i,j} - x_{i+1,j}\right| + \left|x_{i,j} - x_{i,j+1}\right|.$$
```{.python .input}
def tv_loss(y_hat):
......@@ -176,7 +174,7 @@ def train(x, content_y, style_y, ctx, lr, max_epochs, lr_decay_epoch):
# 对所有损失求和。
l = nd.add_n(*style_L) + nd.add_n(*content_L) + tv_L
l.backward()
# 对 x 的梯度除去绝对均值使得数值更加稳定,并更新 x
# 对 x 的梯度除去绝对均值使得数值更加稳定,并更新 x
x.grad[:] /= x.grad.abs().mean() + 1e-8
x[:] -= lr * x.grad
# 如果不加的话会导致每50轮迭代才同步一次,可能导致过大内存使用。
......
......@@ -24,7 +24,7 @@ import time
具体来说,类别预测层使用一个保持输入高宽的卷积层,其输出的$(x,y)$像素通道里包含了以输入$(x,y)$像素为中心的所有锚框的类别预测。其输出通道数为$a(n+1)$,其中通道$i(n+1)$是第$i$个锚框预测的背景置信度,而通道$i(n+1)+j+1$则是第$i$锚框预测的第$j$类物体的置信度。
下面我们定义一个这样的类别分类器,指定$a$和$n$后,它使用一个填充为1的3乘3卷积层。注意到我们使用了较小的卷积窗口,它可能不能覆盖锚框定义的区域。所以我们需要保证前面的卷积层能有效的将较大的锚框区域的特征浓缩到一个3乘3的窗口里。
下面我们定义一个这样的类别分类器,指定$a$和$n$后,它使用一个填充为1的$3\times3$卷积层。注意到我们使用了较小的卷积窗口,它可能不能覆盖锚框定义的区域。所以我们需要保证前面的卷积层能有效的将较大的锚框区域的特征浓缩到一个$3\times3$的窗口里。
```{.python .input n=2}
def cls_predictor(num_anchors, num_classes):
......@@ -79,7 +79,7 @@ concat_preds([y1, y2]).shape
### 减半模块
减半模块将输入高宽减半来得到不同尺度的特征,这是通过步幅2的2乘2最大池化层来完成。我们前面提到因为预测层的窗口为3,所以我们需要额外卷积层来扩大其作用窗口来有效覆盖锚框区域。为此我们加入两个3乘3卷积层,每个卷积层后接批量归一化层和ReLU激活层。这样,一个尺度上的3乘3窗口覆盖了上一个尺度上的10乘10窗口。
减半模块将输入高宽减半来得到不同尺度的特征,这是通过步幅2的$2\times2$最大池化层来完成。我们前面提到因为预测层的窗口为3,所以我们需要额外卷积层来扩大其作用窗口来有效覆盖锚框区域。为此我们加入两个$3\times3$卷积层,每个卷积层后接批量归一化层和ReLU激活层。这样,一个尺度上的$3\times3$窗口覆盖了上一个尺度上的$10\times10$窗口。
```{.python .input n=8}
def down_sample_blk(num_filters):
......
......@@ -142,7 +142,7 @@ net(x)
* 在FancyMLP类里我们重用了`dense`,这样对输入形状有了一定要求,尝试改变下输入数据形状试试。
* 如果我们去掉FancyMLP里面的`asscalar`会有什么问题?
* 在NestMLP里假设我们改成 `self.net=[nn.Dense(64, activation='relu'),nn.Dense(32, activation='relu')]`,而不是用Sequential类来构造,会有什么问题?
* 在NestMLP里假设我们改成 `self.net = [nn.Dense(64, activation='relu'), nn.Dense(32, activation='relu')]`,而不是用Sequential类来构造,会有什么问题?
## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/986)
......
......@@ -50,7 +50,8 @@ def readIMDB(dir_url, seg='train'):
for label in pos_or_neg:
files = os.listdir(os.path.join('../data/',dir_url, seg, label))
for file in files:
with open(os.path.join('../data/',dir_url, seg, label, file), 'r', encoding='utf8') as rf:
with open(os.path.join('../data/',dir_url, seg, label, file), 'r',
encoding='utf8') as rf:
review = rf.read().replace('\n', '')
if label == 'pos':
data.append([review, 1])
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册