目录
错误现象
在TensorFlow/Keras环境下读取MNIST手写数字时出错,错误现象如下:
D:\anaconda3\envs\tf1\python.exe F:/Program/Python_Ex/TensorFlow+PyTorch/Chapter02Keras_TensorFlow/ch02p42ReadImage.py
Process finished with exit code -1073741819 (0xC0000005)
说明:tf1是笔者之前搭建的TensorFlow/Keras环境,具体请参考以下文章。
《Win10快速搭建TensorFlow, Keras与PyTorch深度学习环境》
《如何在PyCharm中选择并使用Anaconda建立的TensorFlow、Keras和PyTorch Python环境》。
分析问题
通过二分法注释代码进行调试,发现出错的是这两行
# 画图并显示
plt.imshow(image2, cmap="binary")
plt.show()
matplotlib是这个TensorFlow1.12环境(tf1)中最近新装的,其matplotlib版本为2.2.2,pyqt版本为5.6
其他Python环境中Python3.6与PyTorch(pt)的matplotlib都是2.2.3,pyqt版本为5.9
解决办法
对症下药。重新安装正确版本的matplotlib与pyqt。
只要下指令安装matplotlib即可,因为它是以pyqt为后端,conda会自动更新对应版本的pytq与qt。
输出结果
完整代码
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# import the necessary packages
import matplotlib.pyplot as plt
import numpy as np
print("######读取数字######")
f = open("./train-labels.idx1-ubyte", "rb")
f.seek(8) # 文件的头是8字节,略过不读
# 文件头之后,每个字节代表一个0-9的数字
data = f.read(1)
print(data)
f.close()
print("######读取图片######")
file_train_image = open("./train-images.idx3-ubyte", "rb")
file_train_image.seek(16) # 图像文件的头是16字节,略过不读
image1 = file_train_image.read(28 * 28)
image2 = np.zeros(28 * 28)
# 将值转换成灰度
for i in range(28 * 28):
image2[i] = image1[i] / 256
image2 = image2.reshape(28, 28) # 必须重新reshape
print(image2)
# 画图并显示
plt.imshow(image2, cmap="binary")
plt.show()
file_train_image.close()