2

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ステートメントがファイルを解放し、私は大丈夫だと思っていたでしょう (そして、これは大規模なファイルではありません)。しかし、私は何かが欠けているので、掘り続けます。もし誰かが何かを見たら、私に知らせてください.

EDIT 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)
4

1 に答える 1

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()

あなたのセットアップで動作する必要がありますね。

于 2013-10-30T13:22:03.697 に答える