卷积|深度学习:全卷积网络( 三 )

, 例如 , 根据输入与输出的尺寸之比来映射 。 映射后的

通常是实数 。 然后 , 在输入图像上找到与坐标
最近的4像素 。 最后 , 输出图像在坐标
上的像素依据输入图像上这4像素及其与
的相对距离来计算 。 双线性插值的上采样可以通过由以下bilinear_kernel函数构造的卷积核的转置卷积层来实现 。 限于篇幅 , 我们只给出bilinear_kernel函数的实现 , 不再讨论算法的原理 。

In [10]: def bilinear_kernel(in_channels, out_channels, kernel_size): factor = (kernel_size + 1) // 2 if kernel_size % 2 == 1: center = factor - 1 else: center = factor - 0.5 og = np.ogrid[:kernel_size, :kernel_size] f ilt = (1 - abs(og[0] - center) / factor) *(1 - abs(og[1] - center) / factor) weight = np.zeros((in_channels, out_channels, kernel_size, kernel_size), dtype="f loat32") weight[range(in_channels), range(out_channels), :, :] = f ilt return nd.array(weight)
我们来实验一下用转置卷积层实现的双线性插值的上采样 。 构造一个将输入的高和宽放大 2 倍的转置卷积层 , 并将其卷积核用bilinear_kernel函数初始化 。
In [11]: conv_trans = nn.Conv2DTranspose(3, kernel_size=4, padding=1, strides=2) conv_trans.initialize(init.Constant(bilinear_kernel(3, 3, 4)))
读取图像X , 将上采样的结果记作Y 。 为了打印图像 , 我们需要调整通道维的位置 。
In [12]: img = image.imread("../img/catdog.jpg") X = img.astype("f loat32").transpose((2, 0, 1)).expand_dims(axis=0) / 255 Y = conv_trans(X) out_img = Y[0].transpose((1, 2, 0))
可以看到 , 转置卷积层将图像的高和宽分别放大2倍 。 值得一提的是 , 除了坐标刻度不同 , 双线性插值放大的图像和9.3节中打印出的原图看上去没什么两样 。

In [13]: d2l.set_f igsize() print("input image shape:", img.shape) d2l.plt.imshow(img.asnumpy()) print("output image shape:", out_img.shape) d2l.plt.imshow(out_img.asnumpy())input image shape: (561, 728, 3)output image shape: (1122, 1456, 3)
卷积|深度学习:全卷积网络
本文插图

在全卷积网络中 , 我们将转置卷积层初始化为双线性插值的上采样 。 对于1 × 1卷积层 , 我们采用Xavier随机初始化 。
In [14]: net[-1].initialize(init.Constant(bilinear_kernel(num_classes, num_classes, 64))) net[-2].initialize(init=init.Xavier())9.10.4读取数据集
我们用9.9节介绍的方法读取数据集 。 这里指定随机裁剪的输出图像的形状为320 × 480:高和宽都可以被 32 整除 。
In [15]: crop_size, batch_size, colormap2label = (320, 480), 32, nd.zeros(256**3) for i, cm in enumerate(d2l.VOC_COLORMAP): colormap2label[(cm[0] * 256 + cm[1]) * 256 + cm[2]] = i voc_dir = d2l.download_voc_pascal(data_dir="../data") num_workers = 0 if sys.platform.startswith("win32") else 4 train_iter = gdata.DataLoader( d2l.VOCSegDataset(True, crop_size, voc_dir, colormap2label), batch_size, shuff le=True, last_batch="discard", num_workers=num_workers) test_iter = gdata.DataLoader( d2l.VOCSegDataset(False, crop_size, voc_dir, colormap2label), batch_size, last_batch="discard", num_workers=num_workers)read 1114 examplesread 1078 examples9.10.5训练模型


推荐阅读