在mnist数据集中,每一张图片都是用28*28的矩阵表示,且数字都会出现在图片的正中央,如下展示图片以及矩阵表示:
MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 数据集由来自250 个不同人手写的数字构成, 其中50% 是高中学生, 50% 来自人口普查局(the Census Bureau) 的工作人员
MNIST 数据集可在http://yann.lecun.com/exdb/mnist/获取TensorFlow提供了数据集读取方法(1.x和2.0版本提供的方法不同)
import tensorflow.compat.v1 as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("Tensorflow版本是:",tf.__version__)
mnist = tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()
MNIST数据集文件在读取时如果指定目录下不存在,则会自动去下载,需等待一定时间;如果已经存在了,则直接读取。
如果运行时出现网络连接错误,可以从[https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz](https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz)或[https://s3.amazonaws.com/img-datasets/mnist.npz](https://s3.amazonaws.com/img-datasets/mnist.npz)下载MNIST 数据集mnist.npz文件,并放置于用户目录的.keras/dataset 目录下(Windows 下用户目录为C:\Users\用户名,Linux 下用户目录为/home/用户名)
print("Train image shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test image shape:",test_images.shape,"Test label shape:",test_labels.shape)
print("image data:",train_images[1])
print("label data:",train_labels[1])
import matplotlib.pyplot as plt
def plot_image(image):
plt.imshow(image.reshape(28,28),cmap='binary')
plt.show()
plot_image(train_images[1])
plot_image(train_images[20000])
打印数组
打印数组1-64位,即为0-63数字,数组的下标从0开始
import numpy as np
int_array = np.array([i for i in range(64)])
print(int_array)
int_array.reshape(8,8)
int_array.reshape(4,16)
重塑数组的时候要注意总元素的个数要相等,即:8*8=4*16=64
独热编码示例
x = [3,4]
tf.one_hot(x,depth=10)
为什么要采用one hot编码
1 将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点
2 机器学习算法中,特征之间距离的计算或相似度的常用计算方法都是基于欧式空间的
3 将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理
独热编码如何取值?
对于一维数组,argmax()返回最大值的下标(从0开始)
示例:
A = tf.constant([3,20,60,7,6])
print(tf.argmax(A).numpy())
对于二维数组,如果指定轴参数axis=0,则按(列)索引;如果指定轴参数axis=1,则按(行)索引
B = tf.constant([[3,20,60,7,6],
[2,11,8,1,87],
[14,57,33,5,21]])
print(tf.math.argmax(B,axis=0).numpy())
print(tf.math.argmax(B,axis=1).numpy())
结果解释:[2 2 0 0 1]:按列查找
2:对应第一列中最大数(14)的行号
2:对应第二列中最大数(57)的行号
0:对应第三列中最大数(60)的行号
0:对应第四列中最大数(7)的行号
1:对应第五列中最大数(87)的行号
[2 4 1]:按行查找
2:对应第一行中最大数(60)的列号
4:对应第二行中最大数(87)的列号
1:对应第三行中最大数(57)的列号