【问题标题】:Neural network in CC中的神经网络
【发布时间】:2021-12-06 21:01:11
【问题描述】:

我有一个训练有素的神经网络,用于解决 Matlab 中的分类问题。我想使用经过训练的权重并将其应用到 C 中。我的神经网络输出给了我一个 7 的向量 (output2[i])。

如何在 Matlab 中使用相同的 vec2ind 函数,该函数采用向量矩阵,每个向量包含一个 1,并返回这些向量的索引,并在找到 1 时立即停止?

我想用 C 语言实现它。

我附上了部分代码

谢谢

double sum = 0;
/// matrix multiplication
for (int i = 0; i < 29; i++)
{
        for (int k = 0; k < 2; k++)
        {
            sum += inputs[k] * weights[i][k];
        }

        /// apply activation function
        output[i] = tanh_func(sum + biases[i]);
        sum = 0;
}

/// output layer
for (int i = 0; i < 7; i++)
{
    for (int k = 0; k < 29; k++)
    {
        sum += output[k] * weights2[i][k];
    }

    /// apply activation function
    output2[i] = sigmoid(sum + biases2[i]);
    sum = 0;
}

【问题讨论】:

  • 如何循环遍历数组,一旦找到 1 就停止,并记住循环索引是什么时候发生的?
  • 是的。我将编辑我的问题。我想要一个与 Matlab 中的 vec2ind 类似的功能。我想用 C 来做。我试着做,但我没有得到与 Matlab 中的 vec2ind 函数相同的结果。

标签: c matlab vector neural-network


【解决方案1】:

要在 C 中仅编写 vec2ind,请参阅其他答案。

或者,如果您可以访问 MATLAB Coder,它可以自动将 MATLAB 代码(整个算法)转换为 C 代码: https://www.mathworks.com/help/coder/index.html

【讨论】:

  • 谢谢。 Matlab 编码器不支持 vec2ind 函数。
  • 如果手动调用 vec2ind,您可以将调用替换为您自己的实现 - 如下所示: function [ind, numRows] = my_vec2ind(vec) numRows = size(vec, 1) ; numCols = size(vec, 2); ind = 零(1,numCols);对于 col = 1:numCols [~, ind(col)] = max(vec(:, col)); end end 我把这条评论弄乱了几分钟,但是代码块的三次反引号、4 间隔缩进和代码标签似乎在 cmets 中不起作用......
【解决方案2】:

为了更好地理解,您可以使用三重指针double*** tensor3d

初始化它

tensor3d =  malloc( dim0 * sizeof( double** ));
for( int i = 0; i < dim0; ++i )
{
  tensor3d[i] =  malloc( dim1 * sizeof( double* ));
  for( int j = 0; j < dim1; ++j )
  {
    tensor3d[i][j] =  malloc( dim2 * sizeof( double ));
  }
}

如果您已经复制了该 3dim 数组中的向量矩阵,则可以这样做

int indices[dim0][dim1];

for( int i = 0; i < dim0; ++i )
{
  for( int j = 0; j < dim1; ++j )
  {
    for( int k = 0; k < dim2; ++k )
    {
      if( tensor3d[i][j][k] > 0.99 && tensor3d[i][j][k] < 1.01 )
      {
        indices[i][j] = k;
        break;
      }
    }
  }
}

但在现实生活中,您会使用 1 个暗阵列 flattensor3d[]

tensor3d[i][j][k] == flattensor3d[i * dim0 * dim1 + j * dim1 + k]      

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2015-04-14
    • 2017-09-11
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多