2017-04-25 4 views
1

umsetzen, was der beste Weg ist, um die folgenden in MetallErreichen tf in Metall Performance Shader

inputs_transposed = tf.transpose(inputs,(2,0,1))

Dank Hollemans zu erreichen, ich weiß, das ist ein Rechenkern sein muss, aber ich bin nicht sicher, wie man Schreib es. Hat jemand versucht, in Metal zu transponieren, wenn der Eingang mehr als 4 Feature-Kanäle hat.

Antwort

0

Sie möchten Ihre Daten während der Übertragung transponieren? Dann müssen Sie tatsächlich einen Rechenkernel schreiben.

Es wäre in Metall Shading Language in etwa so aussehen:

half4 inColor = inTexture.read(gid); 
half4 outColor = half4(inColor[2], inColor[0], inColor[1], 0.0h); 
outTexture.write(outColor, gid); 

Wo gid Punkte auf Pixel, dass diese besondere Kernel arbeitet.

Um dies für mehr als 4 Kanäle zu tun, ist es ziemlich das Gleiche, aber jetzt müssen Sie aus verschiedenen Textur Slices im Kernel lesen/schreiben.

Das obige Beispiel zeigt Ihre (2, 0, 1) transponieren, aber hardcoded in den Kernel. Es wird etwas komplizierter, wenn Sie auf beliebige Weise transponieren möchten. In diesem Fall müssen Sie die neue Kanalreihenfolge unter Verwendung einer MTLBuffer in den Kernel übergeben, und Sie müssen herausfinden, welcher Kanalindex welchem ​​Texturabschnitt entspricht und so weiter.

Ich weiß, das ist immer noch eine vage Antwort. Ich werde sehen, ob ich dafür einen Beispielkernel erstellen und zu meiner Open-Source-Bibliothek Forge hinzufügen kann. https://github.com/hollance/Forge

Edit: Ich habe einen einfachen transponieren Kernel zu schmieden: https://github.com/hollance/Forge/blob/master/Forge/Forge/TransposeChannels.swift

Sie verwenden es wie folgt aus:

let channels = 8 
let perm: [UInt16] = [2, 4, 0, 5, 1, 7, 6, 3] 
transposeKernel = TransposeChannelsKernel(device: device, 
          featureChannels: channels, permute: perm) 

Und dann codieren Sie es wie jedes andere MPSCNN kernel:

transposeKernel.encode(commandBuffer: commandBuffer, 
         sourceImage: img0, destinationImage: img1) 

Da es ein Teil von Forge ist, verwendet es eine Reihe von Helfer-Code aus dieser Bibliothek. Wenn Sie es zu Ihrem eigenen Projekt hinzufügen und Forge nicht verwenden möchten, müssen Sie auch diesen Hilfscode kopieren.

Edit 2: Von Ihrem Kommentar unten scheint es, wie Sie nicht nur Kanäle wollen um tauschen, sondern ganze Achsen, so dass dieses TransposeChannels Objekt wird nicht auf Sie zu sehr nützlich. Hey, zumindest habe ich meiner Bibliothek Code hinzugefügt. :-D

+0

vielen dank! Ja, das ist für mehr Feature-Kanäle [1024, um genau zu sein]. Ich würde für ein Beispiel töten. – user3208799

+0

Im Wesentlichen versuche ich, ein 7 * 7 * 1024 MPSImage in 1024 * 7 * 7 zu ändern. Ich würde wirklich schätzen, wenn dies ein Beispiel für Schmiede sein kann. – user3208799

+0

Nach dem Transponieren [nicht sicher, ob ich es richtig gemacht habe] erhalten wir diesen Fehler/BuildRoot/Library/Caches/com.apple.xbs/Sources/MetalImage/MetalImage-61.5/MetalPerformanceShaders/Utility/MPSLibrary.mm: 357: fehlgeschlagene Zusicherung 'MPS interner Fehler: konnte keine spezialisierte Funktion mit dem Namen cnnConvGenF erzeugen. Hast du das gesehen – user3208799