Numpy MNIST 教程中为什么使用负数的reshape(-1)

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)的作用就非常重要了。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程