使用tf.keras.model.Sequential搭建分类模型


一:使用tf.keras.model.Sequential搭建分类模型主要包括七个步骤:

  1. 导入包模块
  2. 加载数据集(这里使用的是keras.datasets.fashion_mnist数据包)
  3. 切分训练集和验证集
  4. 对数据进行归一化处理
  5. 搭建分类模型
  6. 训练模型
  7. 将模型应用于测试集

二:导入数据包

这里将一次性导入在机器学习方面经常使用到的库。

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)

 

显示结果为:

显示3行3列图片

四:切分训练集和验证集

首先应该查看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. 初始化的时候完成层的添加:
    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'])

     

  2. 初始化为空的模型,之后再根据需要添加层:
    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)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM