Metal Performance Shaderフレームワークは、独自の畳み込みニューラルネットを構築するためのサポートを提供します。例えばMSPCNNConvolution
を作成する場合、1D浮動小数点ポインタとして表されるinit
パラメータの4Dのテンソルが必要です。MPSCNN重み付け順序
init(device: MTLDevice,
convolutionDescriptor: MPSCNNConvolutionDescriptor,
kernelWeights: UnsafePointer<Float>,
biasTerms: UnsafePointer<Float>?,
flags: MPSCNNConvolutionFlags)
ドキュメントは、 4Dテンソル(配列) 重量[outputChannels]として再解釈することができるように、フィルタ重みのレイアウトが配置される4Dテンソル
について言うためにこれを持っています[kernelHeight] [kernelWidth] [入力チャネルに/グループ]
残念ながら、その情報は本当に次元の1に4D配列を配置する方法を教えていません0ポインタ。
私はBNNS
のような重量を注文しようとしましたが、運が必要です。
4Dテンソル(配列)を1D Float
ポインタ(配列)として正しく表現するにはどうすればよいですか?
PS:C配列のように配列して、フラット配列へのポインタを取得しようとしましたが、動作しませんでした。
UPDATE
@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] = ...
}
}
}
}
4Dを1Dにしようとした方法を示すことができますか?間違ったポインタを使用しない限り、間違っている可能性がある唯一のものはインデックスの順序です。 –
@RhythmicFistman質問を更新しました.Apples OWNのサンプルプロジェクト(独自の訓練されたウェイトあり)は正しく動作しません。だから私はどういうことが間違っているかを知っているはずです...自分のデータやその実装。 –
どのAppleサンプルを参考にしていますか? MetalImageRecognitionとMPSCNNHelloWorldの両方が、Xcode 8.2ベータとiOS 10.2ベータ版で私にとってうまくいくようです。 – warrenm