Я перевожу свою нейронную сеть из устаревших:
init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
в
init(device: MTLDevice, weights: MPSCNNConvolutionDataSource)
Я реализовал MPSCNNConvolutionDataSource
, который хорошо отлажен и работает для всех моихслои кроме одного.Просто для целей тестирования я сам вызываю функцию источника данных вместе с устаревшим init () MPSCNNFullyConnected
, чтобы убедиться, что источник данных реализован правильно.Я знаю, что это не предполагаемое использование, но я хотел, чтобы одни и те же данные входили в оба конструктора MPSCNNFullyConnected ().Следующий код выполняется и NN работает правильно.
/* This code runs as intended */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
_ = datasource.load()
let layer = MPSCNNFullyConnected(device: device,
convolutionDescriptor: datasource.descriptor(),
kernelWeights: UnsafeMutablePointer<Float>(mutating: datasource.weights().assumingMemoryBound(to: Float.self)),
biasTerms: datasource.biasTerms(),
flags: .none)
Когда я создаю экземпляр полностью подключенного слоя с новым init (), сеть перестает работать.Следующий код выполняется, но NN не работает должным образом.
/* This code does run, but the layer does NOT output the correct values */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
let layer = MPSCNNFullyConnected(device: device, weights: datasource)
Какие-либо предложения, почему оба вызова не идентичны?