【问题标题】:Understanding batch_size in CNNs了解 CNN 中的 batch_size
【发布时间】:2020-04-25 06:30:01
【问题描述】:

假设我在 Pytorch 中有一个 CNN 模型和 2 个以下大小的输入:

  • input_1: [2, 1, 28, 28]
  • input_2: [10, 1, 28, 28]

注意事项

  • 重申一下,input_1 是 batch_size == 2,input_2 是 batch_size == 10。
  • Input_2input_1 的超集。即input_2包含input_1中相同位置的2张图片。

我的问题是:CNN 如何处理两个输入中的图像? IE。 CNN 是否按顺序处理批次中的每张图像?还是将批量大小的所有图像连接起来,然后按照惯例执行卷积?

我问的原因是因为:

  • CNN(input_1) 的输出 != CNN(input_2)[:2]

也就是说,batch_size 的差异导致两个输入相同位置的 CNN 输出略有不同。

【问题讨论】:

    标签: python pytorch conv-neural-network


    【解决方案1】:

    CNN 是卷积神经网络的总称。根据特定的架构,它可能会做不同的事情。 CNN 的主要构建块是convolutions,它不会在批处理项目之间造成任何“串扰”,而像ReLU 这样的逐点非线性也不会。然而,大多数架构还涉及其他操作,例如规范化层 - 可以说最流行的是batch norm,它确实引入了串扰。许多模型还将使用dropout,它在eval 模式之外随机运行(默认情况下模型处于train 模式)。上述两种影响都可能导致上述观察到的结果,以及其他可能导致批次间串扰的自定义操作。

    除此之外,由于numeric precision 问题,您的代码可能不会给出完全相同相同的结果,即使它没有任何跨批处理操作。这个错误非常轻微,但在使用CNN(input_1) == CNN(input_2)[:2] 检查时足以显示出来。最好使用 allclose 代替,并带有合适的 epsilon。

    【讨论】:

    • 我测试了我的 CNN 模型,实际上,batch_norm 引入了串扰。这是非常有趣的行为。
    【解决方案2】:

    为了补充 Jatentaki 的好答案,下面是一个简单的演示,即纯 conv2d 不会在批次中的项目之间引入“串扰”:

    import torch
    import torch.nn.functional as F
    
    
    input_1 = torch.randn((10, 1, 28, 28))
    input_2 = input_1[:2]
    
    weight =  torch.randn((16, 1, 3, 3))
    
    conv_1 = F.conv2d(input_1, weight)
    conv_2 = F.conv2d(input_2, weight)
    
    >>> torch.equal(conv_1[:2], conv_2)
    True
    

    因此,您得到差异的原因可能是 Jatentaki 提到的原因之一(如果您可以展示您的 CNN 模型,这将有助于找出确切的原因)。

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2019-08-08
      • 2019-07-22
      • 2018-08-27
      • 2020-12-06
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多