为什么TensorFlow使用频道last Ordering而不是行 - 马约尔



在大多数Tensorflow教程中,作者都使用通道延迟订购,例如

input_layer = tf.reshape(features, [-1, 28, 28, 1])

最后一个数字表示通道数(https://www.tensorflow.org/tutorials/layers(。我觉得这很尴尬。此外,在读取了张孔流中内存内布局方案方案的文档后,我认为频道last的布局将导致更多的缓存缺失,因为卷积是在单个频道上执行的,而在频道last上,这些频道以这些频道在频道上订购中是线性内存中的混合。,有效地通过n(n是n是通道数(将缓存缩小,这在3D和4D卷积中尤其低。我有问题吗?

P.S。

我发现了一个密切相关的线程(Tensorflow 3通道的颜色输入顺序(。接受答案的作者指出,默认情况下,TF使用了行 - 莫乔尔,但是鉴于我迄今为止我发现的所有教程显示了Show频道的命令,因此我发现该声称具有误导性。

这是解释:

https://www.tensorflow.org/performance/performance_guide#use_nchw_image_data_data_format

图像数据格式是指图像批处理的表示。TensorFlow支持NHWC(TensorFlow默认值(和NCHW(CUDNN默认值(。n是指批处理中的图像数量,h是指垂直尺寸中的像素数,w是指水平尺寸中的像素数,c是指通道(例如,黑白,3,3,3对于RGB等。

最好的做法是构建与NCHW和NHWC一起使用的模型,因为在GPU上使用NCHW训练通常是常见的,然后在CPU上使用NHWC进行推断。

这两种格式的简短历史记录是通过使用NHWC开始TensorFlow,因为它在CPU上的速度更快。然后,Tensorflow团队发现使用NVIDIA CUDNN库时NCHW的性能更好。当前的建议是用户在其模型中支持两种格式。从长远来看,我们计划重写图表以在格式之间进行切换。

此外,挖掘我们可以在这里看到的代码,当输入以NHWC格式为NHWC时,TensorFlow将其转换为NCHW。

  if (data_format == FORMAT_NHWC) {
    // Convert the input tensor from NHWC to NCHW.
    TensorShape nchw_shape =
        ShapeFromFormat(FORMAT_NCHW, in_batch, in_rows, in_cols, in_depths);
    if (in_depths > 1) {
      Tensor transformed_input;
      OP_REQUIRES_OK(ctx, ctx->allocate_temp(DataTypeToEnum<T>::value,
                                             nchw_shape, &transformed_input));
      functor::NHWCToNCHW<GPUDevice, T, 4>()(
          ctx->eigen_device<GPUDevice>(),
          const_cast<const Tensor&>(input).tensor<T, 4>(),
          transformed_input.tensor<T, 4>());
      input = transformed_input;
    } else {
      // If depth <= 1, then just reshape.
      CHECK(input.CopyFrom(input, nchw_shape));
    }
  }

您可以为每个操作指定要使用的数据格式,但是默认值的TensorFlow不使用NCHW,而是NHWC,这就是为什么即使TF Defelopers仍然使用NHWC来避免在每个操作中指定格式

您的问题是基于误解。

Row-Major和NHWC之间没有矛盾。行 - 马约尔意味着最右边的索引是导致内存变化时最小跳跃的索引,并且最左边的索引变化会导致最大的跳跃。在Row-Major中,最后一个维度是连续的,在列中,第一个维度是。请参阅https://en.wikipedia.org/wiki/row-_and_column-major_order#address_calculation_general,以了解如何计算任意维度数的内存偏移。

因此,TF的内存是在行 - 莫乔尔(Row-Major(中布置的。指数的顺序差异很微妙(有些人甚至更喜欢CHWN-请参阅https://github.com/soumith/convnet-benchmarks/sissues/issues/66#issuecomment-1559444875(。NCHW很受欢迎,因为这是Cudnn最擅长的。但基本上DL中的每个常见内存布局都是行 -

最新更新