MPSNNGraph Изменить форму узла - PullRequest
0 голосов
/ 28 июня 2018

Есть ли аналог Reshape слоя Keras / TensorFlow в Metal / Metal-Performance-Shaders? Я конвертирую обученную модель Keras в MPSNNGraph, и у меня возникли проблемы с обработкой секции conv2d-> density-> conv2dTranspose. Я пытаюсь построить следующую конфигурацию:

Conv2D_1, output_shape: (1,1,128) <-- i've handled up to here
Reshape_1(Conv2D_1), output_shape: (128)
Dense_1(Reshape_1), output_shape: (1024)
Dense_2(Dense_1), output_shape: (8192)
Reshape_2(Dense_2), output_shape: (4,4,512) <--hung up here
Conv2DTranspose(Reshape_2), output_shape: (8,8,256) <-- i know how to do this

Я понимаю концепцию выражения плотных слоев в виде четырехмерных блоков в металле (я думаю?), Но я не понимаю, как перейти от формы (8192) к (4,4,512) с металлом. Я чувствую, что есть что-то умное, что можно сделать, чтобы получить Dense_2 и изменить форму в один узел MPSNN, но я не знаю, что это такое.

Я пытаюсь использовать только объекты из https://developer.apple.com/documentation/metalperformanceshaders/objects_that_simplify_the_creation_of_neural_networks

1 Ответ

0 голосов
/ 28 июня 2018

Слой MPSCNNFullyConnected дает изображение 1x1 в качестве вывода с 8192 каналами в вашем случае (что также является максимальным количеством каналов, поддерживаемых текстурой Metal).

Опция изменения формы будет принимать это изображение 1x1x8192 и выводить изображение 4x4 с 512 каналами. В Keras и т. Д. Это просто вопрос изменения шагов в базовом тензоре TF, но в Metal вам придется копировать данные.

Начиная с iOS 11.3, существует объект MPSNNReshape, который может выполнять такую ​​перестановку. Я не использовал его сам, но похоже, что вы просто даете ему исходное и конечное изображение (при кодировании этого ядра), и он сам поймет, как копировать данные между ними.

Однако ... MPSNNReshape не представляется узлом , который может быть помещен в MPSNNGraph, поскольку он расширяет MPSCNNKernel, а не MPSNNFilterNode. Это похоже на недосмотр ...

Таким образом, вам нужно будет создать два графика, один до этого узла изменения формы, а другой - с остальным кодом. Затем запустите первый график, закодируйте узел изменения формы, используя выходные данные этого первого графика, затем запустите второй график, используя выходные данные узла изменения формы. Это должно быть достаточно быстро, но это немного раздражает, так как вы не можете сделать все это в одном графике.

...