无法找出针对 SOFTMAX 输入/输出的 Android NNAPI 的 CTS 测试
一直在使用 Android P 进行我们的内部产品升级,并查看了以下我无法弄清楚的代码,低于 softmax 的输入和输出如何匹配这里的数学公式?...任何人都可以帮助我理解或任何有关它的文档的链接?
无法找出针对 SOFTMAX 输入/输出的 Android NNAPI 的 CTS 测试
一直在使用 Android P 进行我们的内部产品升级,并查看了以下我无法弄清楚的代码,低于 softmax 的输入和输出如何匹配这里的数学公式?...任何人都可以帮助我理解或任何有关它的文档的链接?
使用此公式计算 Softmax 输出(参考:https ://android.googlesource.com/platform/frameworks/ml/+/android-p-preview-4/nn/runtime/include/NeuralNetworks.h )
output[batch, i] =
exp((input[batch, i] - max(input[batch, :])) * beta) /
sum_{k}{exp((input[batch, k] - max(input[batch, :])) * beta)}
根据您的测试用例,输入张量定义为 {1.0f, 2.0f, 10.0f, 20.0f} ( http://androidxref.com/9.0.0_r3/xref/frameworks/ml/nn/runtime/test/generated /examples/softmax_float_1.example.cpp )
实际的测试用例在这里定义 - http://androidxref.com/9.0.0_r3/xref/frameworks/ml/nn/runtime/test/generated/models/softmax_float_1.model.cpp -
void CreateModel(Model *model) {
OperandType type1(Type::FLOAT32, {});
OperandType type0(Type::TENSOR_FLOAT32, {1, 4});
// Phase 1, operands
auto input = model->addOperand(&type0);
auto beta = model->addOperand(&type1);
auto output = model->addOperand(&type0);
// Phase 2, operations
static float beta_init[] = {1e-06f};
model->setOperandValue(beta, beta_init, sizeof(float) * 1);
model->addOperation(ANEURALNETWORKS_SOFTMAX, {input, beta}, {output});
// Phase 3, inputs and outputs
model->identifyInputsAndOutputs(
{input},
{output});
assert(model->isValid());
}
输入是 {1.0f, 2.0f, 10.0f, 20.0f}
beta是 {1e-06f} (常量值在上面的代码中初始化为 beta_init)输入数组的
最大值是 20.0f
这是softmax函数的python代码(粗略):
# input array
x = numpy.array([1.0,2.0, 10.0,20.0])
#operand value (constant)
beta = numpy.exp(-6)
# max of input array is 20 which is hardcoded here
y = numpy.exp((x - 20.0)*beta)/sum(numpy.exp((x - 20.0)*beta))
print(y)
输出为[ 0.24550335 0.24611264 0.25104177 0.25734224] - 这是预期的输出(四舍五入){0.25f, 0.25f, 0.25f, 0.25f} // 根据您的测试数据 - http://androidxref.com/9.0.0_r3 /xref/frameworks/ml/nn/runtime/test/generated/examples/softmax_float_1.example.cpp
希望能帮助到你!