我使用 Python 中的 Keras 库训练了一个手写图像分类器。最初,我使用标准 MNIST 数据集进行训练和测试。但现在我想使用自己的数据集进行测试,其中所有图像的大小均为 900*1200*3
而不是 28*28*1
所以我需要在测试之前 reshape 所有图像。我正在使用以下代码来 reshape 但它给出了错误。
代码:
bb = lol.reshape(lol.shape[0], 28, 28, 1).astype('float32')
其中 lol
是我的 numpy 数组,包含 55 个形状为 (900,1200,3)
错误日志如下:
ValueError Traceback (most recent call last)
<ipython-input-46-87da95da73e9> in <module>()
24 # # you can show every image
25 # img.show()
---> 26 bb = lol.reshape(lol.shape[0], 28, 28, 1).astype('float32')
27 # model = loaded_model
28 # classes = model.predict(bb)
ValueError: cannot reshape array of size 178200000 into shape (55,28,28,1)
那我做错了什么?即使将大图像调整为 28*28 的非常小的图像,我能否获得准确的预测?感谢帮助。
最佳答案
你所做的事情是错误的。您无法将 (55, 900, 1200, 3) 的数组 reshape 为 (55, 28, 28, 1) 的数组,因为您试图在数组中存储 55*900*1200*3=178200000 个元素只能存储 55*28*28=43120 个元素。
你想做两件事:
1) 将 RGB 图像(由最后一个维度表示,即 3 个 channel )转换为灰度图像(1 个 channel )。最简单的方法是 (R+B+G)/3。所有与图像相关的 python 库(PIL、OpenCV、skimage、tensorflow、keras 等)都已经实现了这一点。示例:
from skimage.color import rgb2gray
gray = rgb2gray(original)
2) 将图像大小从 900x1200 调整为 28x28。同样,您可以在所有主要的图像相关 python 库中执行此操作。示例:
from skimage.transform import resize
resized = resize(gray, (28,28))
现在,如果您想在所有 55 个图像中执行此操作,您可以编写一个函数来转换一个图像并将其映射到您的数组中,或者使用一个简单的 for 循环并一次填充一个图像到您的新数组。
在您的情况下,代码应如下所示:
num_images = lol.shape[0] # 55 in your case
resized_images = np.zeros(shape=(num_images, 28, 28, 1)) # your final array
for i in range(num_images):
gray = rgb2gray(lol[i,:,:,:]) # gray.shape should be (900,1200,1)
resized = resize(gray, (28,28)) # resized.shape should be (28,28,1)
resized_images[i,:,:,:] = resized # resized_images.shape should be (55,28,28,1)
关于python - 无法 reshape 包含 PNG 图像的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46118773/