Фреймворк Metal Performance Shader поддерживает создание собственных сверточных нейронных сетей. Например, при создании MSPCNNConvolution
требуется четырехмерный тензор веса в качестве параметра init
, который представлен в виде одномерного указателя с плавающей запятой.
init(device: MTLDevice,
convolutionDescriptor: MPSCNNConvolutionDescriptor,
kernelWeights: UnsafePointer<Float>,
biasTerms: UnsafePointer<Float>?,
flags: MPSCNNConvolutionFlags)
В документации есть что сказать о тензоре 4D
Макет веса фильтра устроен так, что его можно интерпретировать как четырехмерный тензор (массив) weight[outputChannels][kernelHeight][kernelWidth][inputChannels/groups]
К сожалению, эта информация на самом деле не говорит мне, как организовать четырехмерный массив в одномерный указатель Float
.
Я попытался упорядочить веса, как того требует аналог BNNS
, но безуспешно.
Как правильно представить четырехмерный тензор (массив) в виде одномерного указателя Float
(массив)?
PS: я попытался упорядочить его как массив C и получить указатель на плоский массив, но это не сработало.
ОБНОВЛЕНИЕ
@RhythmicFistman: Вот как я сохранил его в простом массиве, который я могу преобразовать в UsafePointer<Float>
(но не работает):
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] = ...
}
}
}
}
tf.transpose
здесь: mattrajca.com/2016/11/26/ - person paiv   schedule 15.12.2016