readMNIST.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 从MNIST中读取原始图片并保存、读取标签数据并保存。
  5. MNIST文件结构分析可以参考:https://blog.csdn.net/justidle/article/details/103149253
  6. """
  7. """
  8. 使用方法:
  9. 1、将MNIST的文件下载到本地。
  10. 2、在py文件所在目录下,建立mnist_data目录。然后将MNIST的四个文件拷贝到mnist_data目录,并解压
  11. 3、在py文件所在目录下,建立test目录,改目录用于存放解压出的图片文件和标签文件
  12. """
  13. import struct
  14. import numpy as np
  15. import PIL.Image
  16. def read_image(filename):
  17. #打开文件
  18. f = open(filename, 'rb')
  19. #读取文件内容
  20. index = 0
  21. buf = f.read()
  22. #关闭文件
  23. f.close()
  24. #解析文件内容
  25. #>IIII 表示使用大端规则,读取四个整型
  26. magic, numImages, rows, columns = struct.unpack_from('>IIII', buf, index)
  27. index += struct.calcsize('>IIII')
  28. for i in range(0, numImages):
  29. # L代表灰度图片
  30. image = PIL.Image.new('L', (columns, rows))
  31. for x in range(rows):
  32. for y in range(columns):
  33. # ‘>B' 读取一个字节
  34. image.putpixel((y,x), int(struct.unpack_from('>B', buf, index)[0]))
  35. index += struct.calcsize('>B')
  36. print('save ' + str(i) + 'image')
  37. image.save('mnist_data/test/'+str(i)+'.png')
  38. def read_label(filename, saveFilename):
  39. f = open(filename, 'rb')
  40. index = 0
  41. buf = f.read()
  42. f.close()
  43. magic, labels = struct.unpack_from('>II' , buf , index)
  44. index += struct.calcsize('>II')
  45. labelArr = [0] * labels
  46. for x in range(labels):
  47. labelArr[x] = int(struct.unpack_from('>B', buf, index)[0])
  48. index += struct.calcsize('>B')
  49. save = open(saveFilename, 'w')
  50. save.write(','.join(map(lambda x: str(x), labelArr)))
  51. save.write('\n')
  52. save.close()
  53. print('save labels success')
  54. if __name__ == '__main__':
  55. #注意t10k-images-idx3-ubyte里面一共有10,000张图片
  56. read_image('mnist_data/t10k-images-idx3-ubyte')
  57. read_label('mnist_data/t10k-labels-idx1-ubyte', 'mnist_data/test/label.txt')