this version of the MNIST data set을 여는 방법을 알고 싶습니다. 예를 들어, 트레이닝 세트 레이블 파일 train-labels-idx1-ubyte
는 다음과 같이 정의된다 :Yann LeCun의 MNIST IDX 파일 형식 구문 분석
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
그리고 작동하는 것 같다 몇 가지 코드를 온라인으로 찾았지만 작동 방식을 이해하지 않습니다
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
나의 이해는 점이다 struct.unpack
은 두 번째 인수를 두 개의 4 바이트 정수로 구성된 빅 엔디안 바이트 문자열로 해석합니다 (here 참조). 실제로 bytes
의 값을 인쇄 할 때,하지만, 내가 얻을 : 처음 두 바이트는 다음 0입니다
b'\x00\x00\x08\x01'
데이터가 나타냅니다
b'\x00\x00\x08\x01\x00\x00\xea`'
첫 번째 4 바이트 정수는 의미가 있습니다 부호없는 바이트. 0x01
은 레이블의 1 차원 벡터를 나타냅니다. (? 네) 다음의 세 가지로 무슨 일이 일어나고 있는지, 나의 이해는 지금까지 올바른 가정 바이트 :
...\x00\x00\xea`
방법이 60,000에 번역 하는가?
질문 제목을 변경 하시겠습니까?IMO 오해의 소지가 있습니다. 문제는 MNIST 데이터 세트를 파싱하는 방법이 아니라 파일에서 바이트 시퀀스가 정수가되는 방식을 이해하는 것입니다. –
MNIST 데이터 세트의 이미 디코딩 된 버전은 http://mnist-decoded.000webhostapp.com/에서 찾을 수 있습니다. – SomethingSomething