MPSNNGraph Изменить форму узла

Есть ли аналог 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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам