You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中基于int[]指定数组维度及实现多维输入Dense层

解决方案

1. 改造Dense层以支持多维输入

要让Dense层支持多维输入且无需额外的Flatten/Reshape层,核心是自动处理输入展平与输出重塑,具体实现如下:

  • 移除构造函数中对输入/输出维度数量的限制
  • 计算输入的总特征数(所有维度的乘积),作为权重矩阵的输入维度
  • 计算输出的总特征数,作为权重矩阵的输出维度
  • 前向传播时自动将多维输入展平为一维完成计算,再将结果重塑为指定输出维度

改造后的构造函数代码:

public Dense(List<int> inputSize, List<int> outputSize)
{
    Random rng = new();
    this.InputSize = inputSize;
    this.OutputSize = outputSize;

    // 计算输入/输出的总元素数
    int inputFeatures = inputSize.Aggregate((current, next) => current * next);
    int outputFeatures = outputSize.Aggregate((current, next) => current * next);

    // 初始化权重与偏置
    this._weights = new float[outputFeatures][];
    this._biases = new float[outputFeatures];

    for (int i = 0; i < outputFeatures; i++)
    {
        this._weights[i] = new float[inputFeatures];
        for (int j = 0; j < inputFeatures; j++)
        {
            this._weights[i][j] = (float)(rng.NextDouble() * 2 - 1);
        }
    }
}

配套的前向传播逻辑示例:

public Array Forward(Array input)
{
    // 1. 将多维输入展平为一维float数组
    float[] flattenedInput = input.Cast<float>().ToArray();
    
    // 2. 执行全连接计算:output = weights * input + biases
    float[] flattenedOutput = new float[_biases.Length];
    for (int i = 0; i < flattenedOutput.Length; i++)
    {
        float sum = 0;
        for (int j = 0; j < flattenedInput.Length; j++)
        {
            sum += _weights[i][j] * flattenedInput[j];
        }
        flattenedOutput[i] = sum + _biases[i];
    }
    
    // 3. 将一维结果重塑为指定的输出维度
    Array output = Array.CreateInstance(typeof(float), OutputSize.ToArray());
    Buffer.BlockCopy(flattenedOutput, 0, output, 0, flattenedOutput.Length * sizeof(float));
    
    return output;
}

2. 动态维度数组的声明方式

C#中无法直接使用float[int[]]语法,但可以通过Array.CreateInstance方法创建任意维度的数组:

基础用法

// 定义维度数组,例如创建3x4x5的float数组
int[] dimensions = new int[] { 3, 4, 5 };
Array dynamicArray = Array.CreateInstance(typeof(float), dimensions);

// 赋值操作(索引从0开始)
dynamicArray.SetValue(1.5f, 1, 2, 3);

// 取值操作
float value = (float)dynamicArray.GetValue(1, 2, 3);

转换为强类型数组(可选)

若已知维度数量,可将动态数组转换为对应强类型多维数组:

// 转换为2维数组
float[,] twoDArray = (float[,])dynamicArray;
// 转换为3维数组
float[,,] threeDArray = (float[,,])dynamicArray;

内容的提问来源于stack exchange,提问作者Lucas Napon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:35:40