一:使用tf.keras.model.Sequential搭建分类模型主要包括七个步骤:
- 导入包模块
- 加载数据集(这里使用的是keras.datasets.fashion_mnist数据包)
- 切分训练集和验证集
- 对数据进行归一化处理
- 搭建分类模型
- 训练模型
- 将模型应用于测试集
二:导入数据包
这里将一次性导入在机器学习方面经常使用到的库。
1 import numpy as np 2 import pandas as pd 3 import matplotlib as mpl 4 import matplotlib.pyplot as plt 5 import sklearn 6 import tensorflow as tf 7 import tensorflow.keras as keras
打印一下库的相关信息
1 for module in np, pd, mpl, sklearn, tf, keras: 2 print (module.__name__, module.__version__)
三:加载数据集
这里使用的是keras自带的数据集,用于图像识别的数据
1 fashion_mnist = keras.datasets.fashion_mnist 2 (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
在对数据进行处理之前,我们应该查看一下数据集中的数据样本,所以我们定义一下两个函数来查看数据集中的图片
1 # 定义函数,查看一张图片 2 def show_single_img(img_arr): 3 plt.imshow(img_arr, cmap='binary') 4 plt.show() 5 show_single_img(x_train_all[0])
显示结果为:
1 # 定义函数,显示多行多列图片。显示x_data的前n_rows*n_cols个图片 2 def show_images(n_rows, n_cols, x_data, y_data, class_names): 3 assert len(x_data) == len(y_data)#数据集中的图片的个数必须和其类别个数相同 4 assert n_rows*n_cols < len(x_data)#要显示的数据量必须小于数据集中的数据量 5 plt.figure(figsize=(n_rows*1.5, n_cols*1.5)) 6 for row in range(n_rows): 7 for col in range(n_cols): 8 index = n_cols * row + col 9 plt.subplot(n_rows, n_cols, index+1) 10 plt.imshow(x_data[index], cmap='binary', interpolation='nearest') 11 plt.axis('off')# 不显示坐标轴 12 plt.title(class_names[y_data[index]]) 13 plt.show() 14 class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 15 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle_boot']#fashion_mnist数据集图片的类别 16 show_images(3, 3, x_test, y_test, class_names)
显示结果为:
四:切分训练集和验证集
首先应该查看x_train_all中有多少张图片:
1 print (x_train_all.shape) #(60000, 28, 28)
我们将前5000张作为验证集validation,将后55000张作为训练集:
1 x_train, x_valid = x_train_all[:5000], x_train_all[5000:] 2 y_train, y_valid = y_train_all[:5000], y_train_all[5000:]
五:对数据进行归一化处理
归一化规则:x = (x-u)/std。u:均值,std:方差
我们使用sklearn库的preprocessing模块的StandardScaler对象来对数据进行归一化处理
1 from sklearn.preprocessing import StandardScaler 2 scaler = StandardScaler() 3 x_train_scaled = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28,28) 4 x_valid_scaled = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) 5 x_test_scaled = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
这里有一个非常值得注意的点:fit_transform和transform的区别。
- 在进行归一化处理的时候,我们对验证集和测试及进行归一化的时候,需要使用测试集的均值和方差,不能使用自己数据集的均值和方差。
- 这里fit_transform就可以记录数据集的均值和方差,我们对训练集进行归一化的时候,使用这个函数,记录下训练集的均值和方差。
- 在对验证集和测试集进行归一化的时候使用transform函数,使用的就是训练集的均值和方差。
六:搭建分类模型(两种方式)
- 初始化的时候完成层的添加:
1 model = keras.models.Sequential([ 2 keras.layers.Flatten(input_shape = [28,28]), 3 keras.layers.Dense(300, activation = 'sigmoid'), 4 keras.layers.Dense(100, activation='sigmoid'), 5 keras.layers.Dense(10, activation = 'softmax') 6 ]) 7 model.compile(loss = 'sparse_categorical_crossentropy', 8 optimizer = 'sgd', 9 metrics = ['accuracy'])
- 初始化为空的模型,之后再根据需要添加层:
1 model = keras.models.Sequential() 2 model.add(keras.layers.Flatten(input_shape = [28,28])) 3 model.add(keras.layers.Dense(300, activation = 'sigmoid')) 4 model.add(keras.layers.Dense(100, activation = 'sigmoid')) 5 model.add(keras.layers.Dense(10, activation = 'softmax')) 6 7 model.compile(loss = 'sparse_categorical_crossentropy', 8 optimizer = 'sgd', 9 metrics = ['accuracy'])
这里有一个非常值得注意的点:sparse_categorical_crossentropy和categorical_crossentropy的区别。
- 这里我们的y是一个图片类别的index。我们需要使用one_hot方法将y转换成相对应的向量,以便于我们来计算损失函数。
- 这里的sparse_categorical_crossentropy就是实现这个功能,自动将y使用one_hot方法转换成向量。
- 如果我们的y本身就是一个向量,则使用categorical_crossentropy即可。
七:训练模型
1 history = model.fit(x_train_scaled, y_train, epochs=10, 2 validation_data=(x_valid_scaled, y_valid))
八:将模型应用于测试集上
1 model.evaluate(x_test_scaled,y_test)