gwg*_*gwg 7 python binary bits mnist
我想了解如何打开这个版本的MNIST数据集.例如,训练集标签文件train-labels-idx1-ubyte定义为:
TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
Run Code Online (Sandbox Code Playgroud)
我发现一些似乎有效的在线代码,但不明白它是如何工作的:
with open('train-labels-idx1-ubyte', 'rb') as f:
bytes = f.read(8)
magic, size = struct.unpack(">II", bytes)
print(magic) # 2049
print(size) # 60000
Run Code Online (Sandbox Code Playgroud)
我的理解是struct.unpack将第二个参数解释为两个4字节整数的大端字节字符串(参见此处).bytes但是,当我实际打印出值时,我得到:
b'\x00\x00\x08\x01\x00\x00\xea`'
Run Code Online (Sandbox Code Playgroud)
第一个四字节整数是有意义的:
b'\x00\x00\x08\x01'
Run Code Online (Sandbox Code Playgroud)
前两个字节为0.下一个表示数据是无符号字节.并且0x01表示标签的一维矢量.假设到目前为止我的理解是正确的,接下来的三个(四个?)字节会发生什么:
...\x00\x00\xea`
Run Code Online (Sandbox Code Playgroud)
这如何转化为60,000?
Car*_*zón 11
我编写了以下代码,以防有人需要解析整个图像数据集(出现在问题标题中),而不仅是前两个字节。
import numpy as np
import struct
with open('samples/t10k-images-idx3-ubyte','rb') as f:
magic, size = struct.unpack(">II", f.read(8))
nrows, ncols = struct.unpack(">II", f.read(8))
data = np.fromfile(f, dtype=np.dtype(np.uint8).newbyteorder('>'))
data = data.reshape((size, nrows, ncols))
Run Code Online (Sandbox Code Playgroud)
只是检查一下,请显示第一个数字。在我的情况下是7。
import matplotlib.pyplot as plt
plt.imshow(data[0,:,:], cmap='gray')
plt.show()
Run Code Online (Sandbox Code Playgroud)
要了解其工作原理,您需要将其转换为二进制表示形式。
如您所述,Python正确地提取了正确的信息:
>>> import struct
>>> with open('train-labels-idx1-ubyte', 'rb') as f:
... data = f.read(8)
...
>>> print(data)
b'\x00\x00\x08\x01\x00\x00\xea`'
>>> print(struct.unpack('>II', data))
(2049, 60000)
Run Code Online (Sandbox Code Playgroud)
在字符串的标题中,有两个4字节整数。如果我们进行迭代,我们可以看到它们的二进制和十进制表示形式data:
>>> for char in data:
... print('{0:08b} - {0:3d} - {1:s}'.format(char, str(bytes([char]))))
...
00000000 - 0 - b'\x00'
00000000 - 0 - b'\x00'
00001000 - 8 - b'\x08'
00000001 - 1 - b'\x01'
00000000 - 0 - b'\x00'
00000000 - 0 - b'\x00'
11101010 - 234 - b'\xea'
01100000 - 96 - b'`'
Run Code Online (Sandbox Code Playgroud)
容易的部分是,知道前4个字节是第一个整数(幻数),接下来的4个字节是第二个整数(项数)。
然后,给定最后四个字节,可以通过两种方式构造它们表示的整数值。
第一个选项(MNIST中使用的选项)是big或high endian。这意味着,将首先找到MOST有效字节:
00000000 00000000 11101010 01100000
Run Code Online (Sandbox Code Playgroud)
如果检查此二进制数的十进制值,则为MNIST数据集中的项目数60,000。
同样,我们可以将其解释为小端。在这种情况下,将首先找到LESS有效字节:
01100000 11101010 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
用十进制表示的数字是1,625,948,160。
因此,如果将每个字节简单地转换\x00\x00\xea`成二进制,然后找到整个二进制数的十进制表示(如果为小端,则恢复字节的顺序),则它们具有整数值。
| 归档时间: |
|
| 查看次数: |
4864 次 |
| 最近记录: |