POOLING
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

竭泽最近尝试学习新的东西,他想看看cnn,现在卡在池化了。

什么是池化?

池化的思想来自于视觉机制,是对信息进行抽象的过程。



池化层也称下采样层,会压缩输入的特征图,一方面减少了特征,导致了参数减少,进而简化了卷积网络计算时的复杂度;另一方面保持了特征的某种不变性(旋转、平移、伸缩等)。

池化操作(Pooling)是卷积神经网络中非常常见的一种操作,Pooling层是模仿人的视觉系统对数据进行降维,在构建卷积神经网络时,往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。

池化如何进行?

下面一张图片我们就来演示池化的一种,max pooling(最大池化)的操作过程

假设我们有4 * 4的图像,每个图像有不同的像素值,这时候我们有一个2 * 2的池化核,并设定步长为2,那么此时我们会对左上角的2 * 2取最大值,作为池化的结果,然后向右平移一个步长,就是向右平移两个单位,得到下一个池化结果,当做完这一行运算,向下平移一个步长,继续做运算,依次类推。

总的来说,假设你有n * n的图像,m * m的池化核,你对图像中第一个m * m的部分图像做完池化操作后,平移一个步长单位,去做下一次池化操作,如果做完这一行的运算,就向下平移一个步长长度,继续运算,直到做完为止。

为了简化问题,本题默认步长为1。

上图是池化窗口为3 * 3,步长为1的池化结果

现在,竭泽给你一个n * m的图像,告诉你池化核的大小k * k, 请输出最大池化后的池化图像的行数和列数,并且输出池化结果

输入描述:

输入第一行,三个数字, n, m, k, 其含义如题所示。

n <= 50, m <= 50, 1 <= k <= 20, k <= n, m , 矩阵元素在int表示范围内

接下来n行为矩阵数据

输出描述:

先输出两个数字,表示池化后图像的尺寸(行和列),之后以矩阵的方式输出池化结果。
示例1

输入

复制
5 5 3
0 1 2 3 4
5 6 7 8 9
0 1 2 3 4
5 6 7 8 9
0 1 2 3 4

输出

复制
3 3
7 8 9
7 8 9
7 8 9