【问题标题】:Batch normalization imlementation on intel MKL failed英特尔 MKL 上的批量标准化实施失败
【发布时间】:2019-03-27 01:12:50
【问题描述】:

我正在尝试使用英特尔 MKL 实现一个简单的批量标准化调用,我在网上找不到示例,所以我尝试遵循英特尔 MKL 代码的逻辑结构,但是,我收到了这个错误

makefile:151: recipe for target '_results/bn_layer_generator_mkl.res' failed
make[1]: *** [_results/bn_layer_generator_mkl.res] Error 255
make[1]: Leaving directory '/home/tiramisu/benchmarks/DNN/layers/bn/cpu'
makefile:82: recipe for target 'libintel64' failed
make: *** [libintel64] Error 2
[bn_layer_generator_mkl.c:84] err (-1)
FAILED

我之前实现了其他 intel MKL 函数(卷积、ReLu),我可以正确运行它们。 有谁知道我在批量标准化方面做错了什么? 这是我的代码

dnnError_t err;

size_t outputSize[dimension] = {N, N, FIn, BATCH_SIZE};
size_t outputStrides[dimension] = {1, N, N * N, N * N * FIn};

size_t inputSize[dimension] = {N, N, FIn, BATCH_SIZE};
size_t inputStrides[dimension] = {1, N, N * N, N * N * FIn};

dnnLayout_t lt_user_input = NULL,
            lt_user_output = NULL;
dnnLayout_t lt_bn_input = NULL,
            lt_bn_output = NULL;
dnnPrimitive_t cv_user_to_bn_input = NULL,
               cv_bn_to_user_output = NULL;
dnnPrimitive_t bn = NULL;
double *resBn1[dnnResourceNumber] = {0};
dnnPrimitiveAttributes_t attributes = NULL;

double *user_i = NULL,
       *user_o = NULL;

/*** data allocation ***/
user_i = (double *)malloc(sizeof(double) * (N * N * FIn * BATCH_SIZE));
if (user_i == NULL)
{
    err = E_MEMORY_ERROR;
    goto bail_out;
}

/*** User's data description ***/
CHECK_ERR(dnnLayoutCreate_F64(&lt_user_input, dimension, inputSize, inputStrides), err);
CHECK_ERR(dnnLayoutCreate_F64(&lt_user_output, dimension, outputSize, outputStrides), err);

/* Initialize attributes */
CHECK_ERR(dnnPrimitiveAttributesCreate_F64(&attributes), err);

/*** Bn section ***/
CHECK_ERR(dnnBatchNormalizationCreateBackwardData_F64(&bn, attributes, lt_user_input, -0.01), err);

CHECK_ERR(dnnLayoutCreateFromPrimitive_F64(&lt_bn_input, bn, dnnResourceSrc), err);
CHECK_ERR(dnnLayoutCreateFromPrimitive_F64(&lt_bn_output, bn, dnnResourceDst), err);
CHECK_ERR(init_conversion(&cv_user_to_bn_input, &resBn1[dnnResourceSrc], lt_bn_input, lt_user_input, user_i), err);
CHECK_ERR(dnnAllocateBuffer_F64((void **)&resBn1[dnnResourceDst], lt_bn_output), err);
CHECK_ERR(init_conversion(&cv_bn_to_user_output, &user_o, lt_user_output, lt_bn_output, resBn1[dnnResourceDst]), err);

srand(1);

for (int i = 0; i < inputSize[0] * inputSize[1] * inputSize[2] * inputSize[3]; i++)
    user_i[i] = rand() % 10 - 5;

/*** Execution ***/
if (cv_user_to_bn_input)
    CHECK_ERR(dnnConversionExecute_F64(cv_user_to_bn_input, user_i, resBn1[dnnResourceSrc]), err);

CHECK_ERR(dnnExecute_F64(bn, (void *)resBn1), err);

【问题讨论】:

    标签: intel-mkl batch-normalization


    【解决方案1】:

    深度神经网络 (DNN) 组件已弃用,将在下一个英特尔 MKL 版本中删除。我们将继续支持在面向深度神经网络的英特尔数学核心函数库(英特尔 MKL-DNN)中为深度神经网络提供优化的函数。这是 hithub 提供的开源实现 - https://github.com/intel/mkl-dnn。请检查批处理模式如何与此库一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 2018-02-21
      • 2016-09-26
      • 2019-11-19
      • 2022-07-06
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多