提问人:Lucas Napon 提问时间:10/25/2023 更新时间:11/11/2023 访问量:59
如何声明一个 Array,其维度由另一个 int[] 数组指定。喜欢 float[int[]]?
How to declare an Array with its dimensions specified by another int[] array. Like float[int[]]?
问:
我正在用 C# 创建一个用于机器学习的 API,以更好地了解它们的工作原理。为简单起见,我使用的名称与 Keras 使用的名称相同。
在我的项目中,每个都需要指定其 和 。例如,如果图层接收到 10x10 的图像,则其输入大小为 。这作为 Layer 构造函数的参数传递,输出大小也是如此。Layer
inputSize
outputSize
new List<int>{10, 10}
在尝试创建层(完全连接)时,我发现将输入大小限制为单个数组维度更简单,因为权重可以声明为 .但是,如果我想将多维矩阵连接为输入,并保留其某些格式作为输出,该怎么办?
结果应与之前展平数组和之后反向展平数组相同。在我的模型中,这需要 3 层!Dense
float[][] _weights = new float[OutputSize[0]][]
public Dense(List<int> inputSize, List<int> outputSize)
{
if (inputSize.Count != 1 || outputSize.Count != 1)
{
throw new Exception("Input size and output sizes must have only 1 dimension; inputSize has " +
inputSize.Count + " and outputSize has " + outputSize.Count);
}
Random rng = new();
this.InputSize = inputSize;
this.OutputSize = outputSize;
this._weights = new float[this.OutputSize[0]][];
this._biases = new float[this.OutputSize[0]];
for (int i = 0; i < this.OutputSize[0]; i++)
{
this._weights[i] = new float[this.InputSize[0]];
for (int j = 0; j < this.InputSize[0]; j++)
{
this._weights[i][j] = (float)(rng.NextDouble()*2-1);
}
}
}
我的代码的其余部分已经泛化为多维,因此此构造函数是唯一的瓶颈。
先谢谢你。Array
答:
0赞
Lucas Napon
11/11/2023
#1
正如 Dmitry Bychenko 在此评论中回答的那样,假设是在 C# 中实现的,如下所示:float[int[]]
var result = Array.CreateInstance(typeof(float), dimensions);
是 类型的数组。dimensions
int[]
评论
0赞
Ben Voigt
11/11/2023
此处的强制警告:没有静态类型信息,因此在运行时之前无法捕获类型错误。
评论
float[][]
称为锯齿状数组,多维数组称为。我不明白你想实现什么,对于标题,.net 有一个 Array.CreateInstance 方法,它接受一个 int 数组作为每个维度的大小。float[,], float[,,], etc.
int[] dimensions = new int[] {3, 4, 5}; var result = Array.CreateInstance(typeof(float), dimensions);
创建多维数组(这里是长度为 3、宽度为 4、高度为 5 的 3D 数组)