Io 使用F读取MNIST数据集#

Io 使用F读取MNIST数据集#,io,f#,mnist,Io,F#,Mnist,我能做到这一点;我只是不知道为什么它会起作用。使用我从中下载的MNIST数据库和该页面底部的指南,我编写了(尚未完成的)方法 这是最简单的部分。困难的部分是readInt函数的形式。我不能只使用位转换器.ToInt();我在这页找到了答案: 翻译方法 int Read(BinaryReader b, int i) { int res = 0; while (i-- > 0) { res <<= 8; res |= b.ReadByte

我能做到这一点;我只是不知道为什么它会起作用。使用我从中下载的MNIST数据库和该页面底部的指南,我编写了(尚未完成的)方法

这是最简单的部分。困难的部分是
readInt
函数的形式。我不能只使用
位转换器.ToInt()
;我在这页找到了答案:

翻译方法

int Read(BinaryReader b, int i)
{
   int res = 0;

   while (i-- > 0)
   {
      res <<= 8;
      res |= b.ReadByte()
   }
   return res;
}
分别给出
(2051,10000,28,28)
(2051,60000,28,28)
的结果,这些结果与第一个代码段注释中的值一致


我不明白的是为什么它会起作用。按位or运算符上的所有这些位移位和折叠是什么?为什么我不能直接使用
BitConverter.ToInt()

如前所述,无论运行代码的机器的终止性如何,该方法都可以工作

标准库方法将根据运行代码的机器的终止性返回所有结果。这可能会产生与预期不同的结果(相对字节顺序颠倒)。

标准库方法在从网络顺序转换
int
时会考虑执行平台的终止性。按照标准惯例,后者是大端的。由于MNIST文件遵循约定且为大端,以下两种标准库方法将作为
readInt
函数的端不可知替代:

let readInt (reader: System.IO.BinaryReader) =
    reader.ReadInt32() |> System.Net.IPAddress.NetworkToHostOrder
涉及
位转换器
的等效但更详细的变体是

let readInt (reader: System.IO.BinaryReader) =
    (reader.ReadBytes(4),0)
    |> System.BitCoverter.ToInt32
    |> System.Net.IPAddress.NetworkToHostOrder

您所使用的方法与正在运行代码的机器的端点无关。使用位转换器,结果将根据Endianness而变化。那么,现在还没有一种内置的方法可以做到这一点吗?我认为不存在任何内置的方法。内置的endianness不可知转换方法是。谢谢Gene——这非常有趣。
loadMnistImage @"Data\t10k-images.idx3-ubyte"
loadMnistImage @"Data\train-images.idx3-ubyte"
let readInt (reader: System.IO.BinaryReader) =
    reader.ReadInt32() |> System.Net.IPAddress.NetworkToHostOrder
let readInt (reader: System.IO.BinaryReader) =
    (reader.ReadBytes(4),0)
    |> System.BitCoverter.ToInt32
    |> System.Net.IPAddress.NetworkToHostOrder