我在我的F#项目中使用MathNet.Numerics,并且在处理应该在其职权范围内的矩阵时内存不足。
编辑:问题绝对不是MathNet.Numerics。这是我正在做的事情,虽然我还没有弄清楚它可能是什么。
以下是我构建MNIST矩阵的方法。也许我正在打开一个文件流或其他东西,但我看不出那是怎么回事。
let readInt (b : BinaryReader) =
[1..4] |> List.fold (fun res item -> (res <<< 8) ||| (int)(b.ReadByte())) 0
let readImage (b : BinaryReader, rowArray, colArray) =
rowArray |> List.collect (fun r -> List.map (fun c -> (b.ReadByte() |> int |> float)/255.0 ) colArray)
let loadMnistImage file =
use stream = File.Open(file, FileMode.Open)
use reader = new BinaryReader(stream)
let magicNumber = readInt(reader)
let nImages = readInt(reader)
let nRows = readInt(reader)
let nCols = readInt(reader)
let row = [1..nRows]
let col = [1..nCols]
let images = [1..nImages] |> List.map (fun _ -> readImage(reader, row, col))
matrix images;
使用它,
let mnistTrainingImages = loadMnistImage MnistTrainingImageData
let tr = mnistTrainingImages.Transpose()
爆炸。
是他们还是我?我从http://yann.lecun.com/exdb/mnist/中提取了该文件,以防有人自己尝试这样做。
编辑1:罪魁祸首是对loadMnistImage
的调用。根据Gene Belitski的建议,我运行了代码
let rand = System.Random()
let m: double [,] = Array2D.init 60000 784 (fun _ _ -> rand.NextDouble())
行之前和之后
let mnistTrainingImages = loadMnistImage MnistTrainingImageData
在排队之前,很好;在该行之后,它会以相同的内存不足异常爆炸。我原以为use
语句会释放文件而我会好的(这不是一个庞大的文件)。但是,我错过了什么,所以我会继续挖掘,如果有人看到任何东西,请告诉我。
编辑2:当我按如下方式简化文件阅读器时,问题就消失了。看起来问题是列表的懒惰评估。
let readImage (b : BinaryReader) =
(b.ReadByte() |> int |> float)/255.0
let loadMnistImage file =
use stream = File.Open(file, FileMode.Open)
use reader = new BinaryReader(stream)
let magicNumber = readInt(reader)
let nImages = readInt(reader)
let nRows = readInt(reader)
let nCols = readInt(reader)
Array2D.init nImages (nRows * nCols) (fun _ _ -> readImage reader)
答案 0 :(得分:2)
即使使用32位F#3.0 FSI,以下代码段对我也没有问题:
#if INTERACTIVE
#r @"....\packages\MathNet.Numerics.2.6.2\lib\net40\MathNet.Numerics.dll"
#endif
open MathNet.Numerics.LinearAlgebra.Double
let rand = System.Random()
let m: double [,] = Array2D.init 60000 784 (fun _ _ -> rand.NextDouble())
let mx = DenseMatrix.OfArray m
let tmx = mx.Transpose()
必须在你的设置中工作,是吗?