Конвертировать график Tensorflow в CoreML - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь преобразовать график Tensorflow в CoreML, и я следую этому руководству .Есть фрагмент кода, который я не совсем понимаю:

#include <metal_stdlib>
using namespace metal;

kernel void swish(
  texture2d_array<half, access::read> inTexture [[texture(0)]],
  texture2d_array<half, access::write> outTexture [[texture(1)]],
  ushort3 gid [[thread_position_in_grid]])
{
  if (gid.x >= outTexture.get_width() || 
      gid.y >= outTexture.get_height()) {
    return;
  }

  const float4 x = float4(inTexture.read(gid.xy, gid.z));
  const float4 y = x / (1.0f + exp(-x));             
  outTexture.write(half4(y), gid.xy, gid.z);
}

Чего я не понимаю, так это использования gid здесь.Разве сетка 2 не является размерной?Что означает gid.z?Разве gid.x не является текущей x-координатой текущего пикселя?

1 Ответ

1 голос
/ 30 мая 2019

gid.x и gid.y - координаты x / y текущего пикселя. Поэтому, когда вы делаете texture.read(gid.xy), это дает вам пиксельные данные на 4 канала.

Но «изображения», используемые в нейронных сетях, могут иметь намного больше, чем 4 канала. Вот почему тип данных для текстур texture2d_array<> вместо texture2d<>.

Значение gid.z относится к индексу текстуры "срез" в этом массиве. Если изображение / тензор имеет 32 канала, то имеется 8 фрагментов текстуры (поскольку каждая текстура хранит до 4 каналов данных).

Таким образом, сетка действительно трехмерна: (x, y, срез).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...