首页 > 试题广场 >

现有一 1920*1080 的单通道图像,每个像素用 flo

[单选题]
现有一 1920*1080 的单通道图像,每个像素用 float32 存储,对其进行 4 个 3*3 核的卷积(无 padding),卷积核如下:
1 1 1 1 1 0 0 1 1 0 1 0
1 0 1 1 1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1 0 0 1 0
若原图像由于量化问题出现了 100 个 INFINITY,而其他的值都在(-1,1)区间内,则卷积的结果至少有多少个 NaN?()
  • 256
  • 284
  • 296
  • 324
需要知道:INFINITY*0 = NAN 
第一个卷积核中间为0,将该卷积核对图像进行扫描,四周的边框都不会被扫描到,将infinity放于四周,则不会出现NAN
第二个卷积核:两个对角为0.可以想象,使用该卷积核对整个图像进行扫描,有8个位置不会被0扫描到。将这8个位置都设为infinity,不会出现NAN。所以该种情况出现NAN情况为100-8 = 92
第三个卷积核:同第二个一样
第四个卷积核:图像所有点都会被0扫描,所以必会出现100个NAN
最少 = 100 + 92+92 =284
发表于 2022-03-14 16:55:35 回复(8)

因为INFINITY与0相乘为NaN,与除了乘以0以外的任何四则运算,得到的结果仍然是INFINITY。
题目问的是至少有多少个,那么我们就考虑nan最少的情况下的INFINITY分布位置,如图所示。
第一个卷积核的4条边都不为0,因此nan的个数为0
第二个卷积核有两个对称的角为0,因此一个((10+11)+(13+12))* 2 = 92
第三个与第二个相同为92个
第四个卷积核的4个角都为0,因此0会与所有的数相乘,相当于从上到下,从左到右,都会被0扫描一遍,因此25*4=100
0+92+92+100=284个
编辑于 2020-04-18 14:30:17 回复(6)
都不知道你们在说个啥
发表于 2020-04-18 19:21:06 回复(0)

楼上的答案的图好像不太容易看懂,重新写一下,希望能更清楚的解释一下

这个题有几个隐藏的点

  • 只有0和inf相乘才会出现NaN, 0 * inf = NaN 1 * inf = inf
  • 题目说1 x 3 x 3 x 4的卷积内核,但没有说明stride,如果stride >= 3,那么可能一个NaN都不会出现,这题就没有意义了,我们只能假设stride = 1
  • 题目问的是至少出现几个NaN,那么需要我们把inf放到特定的地方,尽可能让其少和0相乘
    • 图像各个位置会被3x3卷积核乘多少次?
      • 为了方便,从左到右上到下都从0开始,从下到上,从右到左从-1开始 (python index rule)
      • 图像的四个顶点(0, 0) (0, -1) (-1, 0) (-1, -1),只会被乘一次
      • 图像的四个顶点周围的八个点 (0, 1) (1, 0) (0, -2) (1, -1) (-2, 0) (-1, 1) (-1, -2) (-2, -1), ,只会被乘两次
      • 图像边缘中间的点(0, [2, -3]) etc.,只会被乘三次
      • 图像中间的点,可能会被乘多余3次,具体还可以细分,但跟这题没关系了,就不细说了
    • 接下来就是考虑把100个inf分配到乘最少次数的位置,就是四个边缘
      • 我们统计一下4个内核中0的个数,
        2 0 2
        0 1 0 
        2 0 2
        可以看到卷积内核0的分布是均匀对称的,平均对称分配到四条边是最优的方案i is infv is valid number
        0  1 2 . . . 11 12 13 14 .... -14 -13 -12 -11 . . .  -2 -1 
        1  i i ..... i  i  v  v ....   v   i   i   i  . . .   i i
        2  i 
        .  .
        .  .
        .  .
        11 i 
        12 i
        13 v
    • 剩下的具体的计算就比较简单清晰了, 具体过程如下
      kernel1
      subtotal = 0
      ==========================================
      kernel2
      上下:0<>10 -13<>-1
      左右: 1<>10 -13<>-2(index=0,-1上下边已经考虑过了)
      subtotal = (11 + 13 + 10 + 12) x 2 = 92
      ==========================================
      kernel3
      上下:0->12 -11<-1
      左右: 1<>12 -11<>-2(index=0,-1上下边已经考虑过了)
      subtotal = (11 + 13 + 10 + 12) x 2 = 92
      ==========================================
      kernel4
      0->12 12<-0
      上下:0->12 -13<-1
      左右: 1<>12 -13<>-2(index=0,-1上下边已经考虑过了)
      subtotal = (12 + 12 + 13 + 13) x 2 = 100
      ==========================================
      所以总共 overall_total = 100 + 92 + 92 + 0 = 284
发表于 2022-04-16 03:29:06 回复(0)
这题有点无语。。。。出现这种情况不都是首先调整预处理方法消除inf嘛
发表于 2020-07-21 18:41:26 回复(1)
卷积核的维度是(4,1,3,3)(输出维度,输入维度,卷积核大小,卷积核大小)。
那么输出特征图的维度也就是(4,高度,宽度);
所以我们要对每个卷积核的情况分别考虑。
如果卷积操作的步长≥2,是可以做到0个NAN值的。
但是选项中很显然没有这个选项,所以步长是为1的,当然这也符合pytorch、tensorflow、keras等一些列框架的默认为1的操作。

当按照答案中的四个角各放置25个操作:
(1)第一个卷积核的结果不会产生Nan值,所以个数为0;
(2)第二个卷积核(13+12+11+10)×2=92
(3)第三个卷积核(13+12+11+10)×2=92
(4)第四个卷积核25×4=100
总共0+92×2+100=284

编辑于 2022-09-24 11:25:12 回复(6)
四个角落,每个角落25个inf对称着贴着边,那么第一个filter的map无nan,第二个25+25+21+21,第三个同第二个,第四个25+25+25+25,共100+92+92
发表于 2020-04-08 01:25:20 回复(3)
inf 与 0 相乘就会变成Nan,最好的排列组合是 
左上角:
++++++00000000...
+0000000000000...
+0000000000000...
右下角:
...00000+
...00000+
...00000+
...++++++
+代表了inf所在的位置。
即img[0,:25],  img[1:26,0],  img[-1,-26:],  img[-25:-1]都是inf。
第一次,如有错误,见谅。
编辑于 2019-08-28 10:53:58 回复(3)
这题更像是奥数题,而不是深度学习题目。
发表于 2024-08-08 14:34:14 回复(0)
这道题问的是“至少”,所以核心在于:怎么infinity藏住不让0看见,因为infinity×0=NaN(IEEE 754 浮点数标准)
具体来说可以把每个0扫描过的区域画一个范围,0扫描不到的地方就是可以藏infinity的地方。
图可以试着自己画
第一个卷积核中0扫描不到图像的四个边,而这些区域完全够藏100个infinity;
第二个卷积核中0扫描不到的只有8个像素点(左上,右下),因此还有92个infinity不得不参与运算从而变成NaN;
后面的以此类推,最终答案是0+92+92+100
发表于 2024-06-10 21:47:57 回复(0)
92+92+100=284
发表于 2023-06-13 19:35:45 回复(0)
这道题从第四个卷积核开始考虑,按照四、三、二、一的顺序比较好理解。 第四个卷积核:每个点都会被0扫到,所以有100个nan 第三个卷积核:对于行,有两个点不会被0扫到;对于列,也是有两个点不会被0扫到,所以有100-2*2=96。 第二个卷积核,同理96。 第一个卷积核:因为要求最少,把特殊点都放在边框上,0扫到的个数为0。 所以最终就是284
发表于 2023-01-31 08:26:07 回复(0)
请问10 11 12 13是怎么得出来的呢
发表于 2022-09-24 11:13:37 回复(0)
infinity即inf,无穷的意思
发表于 2021-09-23 22:37:47 回复(0)
4*1 + 8*2 + (100-4-8)*3 =284   有这样算的吗?
发表于 2019-12-05 15:28:29 回复(2)