Struktury Metal Shader zapewnia wsparcie dla budowy własnych konwolucyjnych sieci neuronowych. Podczas tworzenia na przykład MSPCNNConvolution
wymaga tensora 4D jako parametru init
, który jest reprezentowany jako wskaźnik pływający 1D.MPSCNN Ciężar Zamawianie
init(device: MTLDevice,
convolutionDescriptor: MPSCNNConvolutionDescriptor,
kernelWeights: UnsafePointer<Float>,
biasTerms: UnsafePointer<Float>?,
flags: MPSCNNConvolutionFlags)
Dokumentacja ma to znaczy o tensora 4D
Rozkład ciężaru filtra jest umieszczony tak, że może być zinterpretowane jako 4D tensora (array) ciężar [outputChannels] [kernelHeight] [kernelWidth] [inputChannels/grupy]
Niestety te informacje nie bardzo mi powiedzieć jak zorganizować tablicy 4D w jeden trójwymiarowy Float
wskaźnik.
Próbowałem zamówić wagi, takie jak odpowiednik BNNS
, ale bez powodzenia.
Jak prawidłowo reprezentować tensor 4D (tablicę) jako wskaźnik 1D Float
?
PS: Próbowałem zorganizować go jak tablicę C i otrzymując wskaźnik do płaskiej tablicy, ale to nie zadziałało.
UPDATE
@RhythmicFistman: To jak ja przechowywać go w zwykłej tablicy, które można przekonwertować do UsafePointer<Float>
(ale nie działa):
var output = Array<Float>(repeating: 0, count: weights.count)
for o in 0..<outputChannels {
for ky in 0..<kernelHeight {
for kx in 0..<kernelWidth {
for i in 0..<inputChannels {
let offset = ((o * kernelHeight + ky) * kernelWidth + kx) * inputChannels + i
output[offset] = ...
}
}
}
}
czy możesz pokazać, w jaki sposób podjąłeś próbę 4D do 1D?obawiając się użycia niewłaściwego wskaźnika, myślę, że jedyną rzeczą, która może pójść źle, jest kolejność indeksów. –
@RhythmicFistman Zaktualizowano pytanie, problem nie jest nawet projekt przykładowy Jabłka WŁASNE (z własnymi wyszkolonych wag) działa poprawnie. Więc skąd mam wiedzieć, co jest nie tak ... moje dane lub ich implementacja. –
Do jakiej próbki Apple się odwołujesz? Zarówno MetalImageRecognition, jak i MPSCNNHelloWorld wydają się działać dla mnie z Xcode 8.2 beta i iOS 10.2 beta. – warrenm