Numpy MNIST 教程中为什么使用负数的reshape(-1)
在机器学习领域,MNIST数据集是一个经典的用于图像分类问题的数据集,它包含了大量的手写数字的图片和对应的标签。在这个数据集中,每张图片都是由28×28个像素组成的,而标签则是表明该图片上的数字是几。
Numpy是Python中一个非常强大的数学库,它可以非常方便地处理多维数组,并且提供非常多的数学函数和运算符。在使用Numpy进行MNIST数据处理时,我们经常会遇到reshape这个函数,这个函数可以将一个多维数组变换成另一个指定形状的多维数组,它的用法非常灵活,但也有一些需要注意的地方。
在经常使用Numpy进行MNIST数据处理时,我们会注意到很多时候会用到reshape(-1)这个操作,它可以将一个多维数组变形成一个一维数组(向量)。那么这个负数的reshape(-1)操作是怎么工作的呢?它的作用是什么?
阅读更多:Numpy 教程
reshape()函数的基础用法
在介绍reshape(-1)操作之前,我们先来看一下reshape()函数的基础用法,这样能对后面的讲解更好理解。
reshape()函数的基本语法如下:
numpy.reshape(a, newshape, order='C')
其中a代表要变形的多维数组,newshape是一个整数元组,表示变形后的形状,order是一个可选参数,它指定了变形的顺序,C代表按照行优先顺序变形,F代表按照行优先顺序变形。
例如,我们有一个二维数组a,它的形状为(3, 4),我们要将它变成一个3x2x2的三维数组,代码如下:
import numpy as np
a = np.arange(12).reshape(3, 4)
b = a.reshape(3, 2, 2)
print(b)
输出结果为:
[[[ 0 1]
[ 2 3]]
[[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]]]
可以看到,我们将(3, 4)的二维数组变形成了(3, 2, 2)的三维数组。
reshape(-1)的用法
到了这里,我们就可以理解reshape(-1)是怎么回事了。reshape(-1)的作用就是将一个多维数组压缩成一个一维数组,并且不需要知道原来数组的形状。在使用reshape(-1)时,Numpy会自动计算出其他维度的大小,使得总的元素个数保持不变。例如,我们可以使用reshape(-1)将上面的三维数组b转换成一个一维数组,代码如下:
c = b.reshape(-1)
print(c)
输出结果为:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
我们可以看到,reshape(-1)将上面的三维数组压缩成了一个一维数组,并且保持了原来的元素顺序不变。
为什么要使用reshape(-1)?
在MNIST图像分类问题中,我们通常会将图像展开成一个一维数组,并将像素值归一化到[0,1]之间。这时候reshape(-1)的作用就非常重要了,它可以帮助我们将一个形状为(28, 28)的二维数组转换成一个784维的向量,并且保证元素的顺序不变。具体代码如下:
import numpy as np
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将图像展开成一维数组
X_train = X_train.reshape(-1, 784)
X_test = X_test.reshape(-1, 784)
# 将像素归一化到[0, 1]之间
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
可以看到,我们使用了reshape(-1)将二维数组变换成了一个一维数组,这个一维数组可以作为模型的输入。
总结
在使用Numpy进行MNIST数据处理时,reshape()函数是一个非常常用的操作。其中,reshape(-1)可以将多维数组变形成一个一维数组,并且保持原来的元素顺序不变。在MNIST图像分类问题中,我们通常会将图像展开成一个一维数组,并将像素值归一化到[0,1]之间,这样reshape(-1)的作用就非常重要了。