I have setup a Neural Network using (Keras with a Tensorflow backend).I have exported the weights and have 84 weights and one bias. The NN has 84 inputs and one output.
I am trying to use the steps (by converting the code to Swift from Objective-C) in https://www.bignerdranch.com/blog/use-tensorflow-and-bnns-to-add-machine-learning-to-your-mac-or-ios-app/
My current code looks like this:
//: Playground - noun: a place where people can play
import Accelerate
//// //// CREATE MODEL ///
var OUT_COUNT = 1
var IN_COUNT = 84
var inVectorDescriptor = BNNSVectorDescriptor(size: IN_COUNT, data_type: BNNSDataTypeFloat32, data_scale: 0.0, data_bias: 0.0)
var outVectorDescriptor = BNNSVectorDescriptor(size: OUT_COUNT, data_type: BNNSDataTypeFloat32, data_scale: 0.0, data_bias: 0.0)
let weightsPath = Bundle.main.url(forResource: "weights", withExtension: "data")
let biasesPath = Bundle.main.url(forResource: "biases", withExtension: "data")
let activation = BNNSActivation(function: BNNSActivationFunctionIdentity, alpha: 0, beta: 0)
var weightsVector = Array<Float>(repeating:0.0, count:IN_COUNT*OUT_COUNT)
var biasesVector = Array<Float>(repeating:0.0, count:OUT_COUNT)
// reading biases
let biasesText = try String(contentsOf: biasesPath!, encoding: String.Encoding.utf8)
var biasesTextArr2 = biasesText.characters.split{$0 == ","}.map(String.init)
let floatsArrayB = biasesTextArr2.flatMap{ Float($0) }
biasesVector = floatsArrayB
// reading weights
let weightsText = try String(contentsOf: weightsPath!, encoding: String.Encoding.utf8)
let weightsTextArr = weightsText.characters.split{$0 == ","}.map(String.init)
let floatsArrayW = weightsTextArr.flatMap{ Float($0) }
weightsVector = floatsArrayW
var weightsVectorBNNS = BNNSLayerData(data: &weightsVector, data_type: BNNSDataTypeFloat32, data_scale: 0.0, data_bias: 0.0, data_table: nil)
var biasesVectorBNNS = BNNSLayerData(data: biasesVector, data_type: BNNSDataTypeFloat32, data_scale: 0.0, data_bias: 0.0, data_table: nil)
var parameters = BNNSFullyConnectedLayerParameters(in_size: IN_COUNT, out_size: OUT_COUNT, weights: weightsVectorBNNS, bias: biasesVectorBNNS, activation:activation)
let filter = BNNSFilterCreateFullyConnectedLayer(&inVectorDescriptor, &outVectorDescriptor, ¶meters, nil)
and then to make a prediction:
let buffer = ....// data to be tested
var output = Array<Float>(repeating:0.0, count:OUT_COUNT)
let success = BNNSFilterApply(filter, buffer, &output);
/// softmax
let outputSM = output.map { 1/(1 + exp($0)) }
for (index,value) in output.enumerated() {
output[index] = log(1 + exp(value))
}
print(outputSM)
print(output)
The data in biases and weights are in csv format. The result shown is a nan and that is not what is supposed to come out. I should be getting a value between 0 and 1.
Hope someone can help.
Best,
Feras A.