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
相关产品推荐
相关产品推荐

