Softmax回归模型实现MNIST手写数字分类(python代码详解)
关键点:
- Softmax回归处理多分类问题,其是Logistic回归在多分类问题上的推广
- softmax回归使用交叉熵损失函数来学习最优的参数矩阵W,对样本进行分类
- Softmax回归是有监督的。
STEP 1:读取数据
'''读取数据'''
from tensorflow.keras.datasets import mnist
from __future__ import division
import tensorflow as tf
import numpy as np
data = mnist.load_data()
(x_train, y_train), (x_test,y_test) = data# x_train.shape=(60000, 28, 28)
x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)
# reshape中值等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
x_train, x_test = x_train.reshape([-1,28*28]),x_test.reshape([-1,28*28]) # x_train.shape=(60000, 784)
STEP 2:特征缩放
该步骤可以让数据处于同一数值量级,也可以加快算法的收敛速度
- 特征缩放包含数据标准化、数据归一化
- 数据归一化:X = (X-Xmin)/(Xmax-Xmin)
- 归一化意义:让数据处于0-1之间,让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性
- 归一化缺点:当有新数据加入时,可能导致max和min的变化,需要重新定义。另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景
- 标准化公式:X = (X-μ)/σ
- 最好选择标准化
- 标准化最大的注意事项:就是先拆分出test集,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中
- sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)可以直接实现标准化, 其中 X:数组或者矩阵;axis:int类型,初始值为0,如果是0,则单独的标准化每列,如果是1,则标准化每行。with_mean:boolean类型,默认为True,表示将数据均值规范到0。with_std:boolean类型,默认为True,表示将数据方差规范到1。
from sklearn