博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Keras(一)分类模型实战
阅读量:4201 次
发布时间:2019-05-26

本文共 12709 字,大约阅读时间需要 42 分钟。

本文将介绍如下内容:

  • 导入、打印使用的python库的版本信息
  • 从keras.datasets中提取图片数据集-“训练数据”、“验证数据”、“测试数据”
  • 查看单、多张图片
  • 分类模型之模型构建
  • 查看模型的图结构
  • 训练模型
  • 绘图表示模型参数的变化过程
  • 数据的标准化
  • 回调函数

一,导入、打印使用的python库的版本信息

import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport sklearnimport pandas as pdimport osimport sysimport timeimport tensorflow as tffrom tensorflow import keras# 打印使用的python库的版本信息print(sys.version_info)for module in mpl, np, pd, sklearn, tf, keras:    print(module.__name__, module.__version__)    #------------------output----------------------sys.version_info(major=3, minor=8, micro=5, releaselevel='final', serial=0)matplotlib 3.3.2numpy 1.19.1pandas 1.0.3sklearn 0.23.2tensorflow 2.2.0tensorflow.keras 2.3.0-tf

二,从keras.datasets中提取图片数据集-“训练数据”、“验证数据”、“测试数据

# 1,从keras.datasets中提取图片数据集-“训练数据”、“验证数据”、“测试数据”fashion_mnist = keras.datasets.fashion_mnist# 提取“训练数据”、“测试数据”(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()# 将“训练数据”中的前5000条数据提取为“验证数据”x_valid, x_train = x_train_all[:5000], x_train_all[5000:]y_valid, y_train = y_train_all[:5000], y_train_all[5000:]# 打印数据集shape维度print(x_valid.shape, y_valid.shape)print(x_train.shape, y_train.shape)print(x_test.shape, y_test.shape)#------------------output----------------------(5000, 28, 28) (5000,)(55000, 28, 28) (55000,)(10000, 28, 28) (10000,)

三,查看单、多张图片

1,查看单张图片
def show_single_image(img_arr):    plt.imshow(img_arr, cmap="binary")    plt.show()show_single_image(x_train[0])
2,查看多张图片
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):    assert len(x_data) == len(y_data)    assert n_rows * n_cols < len(x_data)    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))    for row in range(n_rows):        for col in range(n_cols):            index = n_cols * row + col             plt.subplot(n_rows, n_cols, index+1)            plt.imshow(x_data[index], cmap="binary",interpolation = 'nearest')            plt.axis('off')            plt.title(class_names[y_data[index]])    plt.show()class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress','Coat', 'Sandal',                'Shirt', 'Sneaker','Bag', 'Ankle boot']show_imgs(3, 5, x_train, y_train, class_names)

四,分类模型之模型构建

"""model = keras.models.Sequential()model.add(keras.layers.Flatten(input_shape=[28, 28]))model.add(keras.layers.Dense(300, activation="relu"))model.add(keras.layers.Dense(100, activation="relu"))model.add(keras.layers.Dense(10, activation="softmax"))"""model = keras.models.Sequential([    keras.layers.Flatten(input_shape=[28, 28]), # 输入层    keras.layers.Dense(300, activation='relu'), # 全连接层    keras.layers.Dense(100, activation='relu'), # 全连接层    keras.layers.Dense(10, activation='softmax')# 输出层])# relu: y = max(0, x)# softmax: 将向量变成概率分布. x = [x1, x2, x3], #          y = [e^x1/sum, e^x2/sum, e^x3/sum], sum = e^x1 + e^x2 + e^x3# reason for sparse: y->index. y->one_hot->[] # y 如果是一个向量,那么损失函数为:categorical_crossentropy;# y 如果是一个数字,那么损失函数为:sparse_categorical_crossentropy;model.compile(loss="sparse_categorical_crossentropy",# categorical 类别;crossentropy交叉熵              optimizer = keras.optimizers.SGD(0.001),# 优化方法              metrics = ["accuracy"])

五,查看模型的图结构

# 查看模型的层级print(model.layers) # 查看模型架构的参数# [None, 784] * W + b -> [None, 300] W.shape [784, 300], b = [300]print(model.summary())# ------------output----------------------------[
,
,
,
]Model: "sequential_9"_________________________________________________________________Layer (type) Output Shape Param # =================================================================flatten_9 (Flatten) (None, 784) 0 _________________________________________________________________dense_27 (Dense) (None, 300) 235500 _________________________________________________________________dense_28 (Dense) (None, 100) 30100 _________________________________________________________________dense_29 (Dense) (None, 10) 1010 =================================================================Total params: 266,610Trainable params: 266,610Non-trainable params: 0_________________________________________________________________None

六,训练模型

history = model.fit(x_train, y_train, epochs=10,validation_data=(x_valid, y_valid))print(type(history))print(history.history)# ------------output----------------------------Epoch 1/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3319 - accuracy: 0.8824 - val_loss: 0.3526 - val_accuracy: 0.8740Epoch 2/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3285 - accuracy: 0.8847 - val_loss: 0.3505 - val_accuracy: 0.8740Epoch 3/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3252 - accuracy: 0.8857 - val_loss: 0.3473 - val_accuracy: 0.8768Epoch 4/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3222 - accuracy: 0.8865 - val_loss: 0.3435 - val_accuracy: 0.8780Epoch 5/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3187 - accuracy: 0.8875 - val_loss: 0.3462 - val_accuracy: 0.8786Epoch 6/101719/1719 [==============================] - 2s 1ms/step - loss: 0.3163 - accuracy: 0.8885 - val_loss: 0.3403 - val_accuracy: 0.8784Epoch 7/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3134 - accuracy: 0.8896 - val_loss: 0.3405 - val_accuracy: 0.8796Epoch 8/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3104 - accuracy: 0.8898 - val_loss: 0.3389 - val_accuracy: 0.8796Epoch 9/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3078 - accuracy: 0.8914 - val_loss: 0.3384 - val_accuracy: 0.8802Epoch 10/101719/1719 [==============================] - 3s 2ms/step - loss: 0.3055 - accuracy: 0.8923 - val_loss: 0.3346 - val_accuracy: 0.8818
{
'loss': [0.3319365084171295, 0.3284938931465149, 0.3252427577972412, 0.32224059104919434, 0.31868669390678406, 0.31627702713012695, 0.3133821487426758, 0.31036657094955444, 0.3077640235424042, 0.30545520782470703], 'accuracy': [0.8824363350868225, 0.8846545219421387, 0.8857272863388062, 0.8864727020263672, 0.8875272870063782, 0.8885454535484314, 0.8896363377571106, 0.8898181915283203, 0.8913999795913696, 0.8923090696334839], 'val_loss': [0.35259583592414856, 0.3505200743675232, 0.34725818037986755, 0.34350329637527466, 0.34617453813552856, 0.3403223752975464, 0.34054407477378845, 0.33890753984451294, 0.33837735652923584, 0.3346402645111084], 'val_accuracy': [0.8740000128746033, 0.8740000128746033, 0.876800000667572, 0.878000020980835, 0.878600001335144, 0.8784000277519226, 0.8795999884605408, 0.8795999884605408, 0.8802000284194946, 0.8817999958992004]}

七,绘图表示模型参数的变化过程

def plot_learning_curves(history):    pd.DataFrame(history.history).plot(figsize=(8, 5))    plt.grid(True)    plt.gca().set_ylim(0, 1)    plt.show()plot_learning_curves(history)

八,数据的标准化

print(np.max(x_train), np.min(x_train))# x = (x - u) / stdfrom sklearn.preprocessing import StandardScaler# from sklearn.preprocessing import MinMaxScalerscaler = StandardScaler()# x_train: [None, 28, 28] -> [None, 784]x_train_scaled = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)x_valid_scaled = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)x_test_scaled = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)print(np.max(x_train_scaled), np.min(x_train_scaled))x_train = x_train_scaledx_valid = x_valid_scaledx_test = x_test_scaled

九,回调函数

在callbacks同级目录中,执行“tensorboard --logdir=callbacks”,会临时在本地搭建服务tensorboard服务。

层级结构如下:
在这里插入图片描述
代码如下:

# Tensorboard, earlystopping, ModelCheckpointlogdir = './callbacks'if not os.path.exists(logdir):    os.mkdir(logdir)output_model_file = os.path.join(logdir,                                 "fashion_mnist_model.h5")callbacks = [    keras.callbacks.TensorBoard(logdir),    keras.callbacks.ModelCheckpoint(output_model_file,                                    save_best_only = True),    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),]history = model.fit(x_train_scaled, y_train, epochs=10,                    validation_data=(x_valid_scaled, y_valid),                    callbacks = callbacks)

十,总结代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Created on Fri Oct 30 10:07:57 2020@author: nijiahui"""import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport sklearnimport pandas as pdimport osimport sysimport timeimport tensorflow as tffrom tensorflow import keras# 打印使用的python库的版本信息print(sys.version_info)for module in mpl, np, pd, sklearn, tf, keras:    print(module.__name__, module.__version__)# 1,从keras.datasets中提取图片数据集-“训练数据”、“验证数据”、“测试数据”fashion_mnist = keras.datasets.fashion_mnist# 提取“训练数据”、“测试数据”(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()# 将“训练数据”中的前5000条数据提取为“验证数据”x_valid, x_train = x_train_all[:5000], x_train_all[5000:]y_valid, y_train = y_train_all[:5000], y_train_all[5000:]# 打印数据集shape维度print(x_train.shape, y_train.shape)print(x_valid.shape, y_valid.shape)print(x_test.shape, y_test.shape)# 8,数据标准化print(np.max(x_train), np.min(x_train))# x = (x - u) / stdfrom sklearn.preprocessing import StandardScaler# from sklearn.preprocessing import MinMaxScalerscaler = StandardScaler()# x_train: [None, 28, 28] -> [None, 784]x_train_scaled = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)x_valid_scaled = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)x_test_scaled = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)print(np.max(x_train_scaled), np.min(x_train_scaled))x_train = x_train_scaledx_valid = x_valid_scaledx_test = x_test_scaled# # 2,查看单张图片# def show_single_image(img_arr):#     plt.imshow(img_arr, cmap="binary")#     plt.show()# show_single_image(x_train[0])# # 3,查看多张图片# def show_imgs(n_rows, n_cols, x_data, y_data, class_names):#     assert len(x_data) == len(y_data)#     assert n_rows * n_cols < len(x_data)#     plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))#     for row in range(n_rows):#         for col in range(n_cols):#             index = n_cols * row + col #             plt.subplot(n_rows, n_cols, index+1)#             plt.imshow(x_data[index], cmap="binary",interpolation = 'nearest')#             plt.axis('off')#             plt.title(class_names[y_data[index]])#     plt.show()# class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress','Coat', 'Sandal',#                 'Shirt', 'Sneaker','Bag', 'Ankle boot']# show_imgs(3, 5, x_train, y_train, class_names)# 4,分类模型之模型构建"""model = keras.models.Sequential()model.add(keras.layers.Flatten(input_shape=[28, 28]))model.add(keras.layers.Dense(300, activation="relu"))model.add(keras.layers.Dense(100, activation="relu"))model.add(keras.layers.Dense(10, activation="softmax"))"""model = keras.models.Sequential([    keras.layers.Flatten(input_shape=[28, 28]), # 输入层    keras.layers.Dense(300, activation='relu'), # 全连接层    keras.layers.Dense(100, activation='relu'), # 全连接层    keras.layers.Dense(10, activation='softmax')# 输出层])# relu: y = max(0, x)# softmax: 将向量变成概率分布. x = [x1, x2, x3], #          y = [e^x1/sum, e^x2/sum, e^x3/sum], sum = e^x1 + e^x2 + e^x3# reason for sparse: y->index. y->one_hot->[] # y 如果是一个向量,那么损失函数为:categorical_crossentropy;# y 如果是一个数字,那么损失函数为:sparse_categorical_crossentropy;model.compile(loss="sparse_categorical_crossentropy",# categorical 类别;crossentropy交叉熵              optimizer = keras.optimizers.SGD(0.001),# 优化方法              metrics = ["accuracy"])# # 5,查看模型的图结构# # 查看模型的层级# print(model.layers) # # 查看模型架构的参数# # [None, 784] * W + b -> [None, 300] W.shape [784, 300], b = [300]# print(model.summary()) # # 6,训练模型# history = model.fit(x_train, y_train, epochs=10,validation_data=(x_valid, y_valid))# print(type(history))# print(history.history)# 9,回调函数# Tensorboard, earlystopping, ModelCheckpointlogdir = './callbacks'if not os.path.exists(logdir):    os.mkdir(logdir)output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")callbacks = [    keras.callbacks.TensorBoard(logdir),# TensorBoard-终端输入“tensorboard --logdir=callbacks”查看图结构    keras.callbacks.ModelCheckpoint(output_model_file,save_best_only = True),# 保存最好的模型结果    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),# 当连续“patience”次增益小于“min_delta”时提前结束]history = model.fit(x_train, y_train, epochs=40,                    validation_data=(x_valid, y_valid),                    callbacks = callbacks)# 7,绘图表示模型参数的变化过程def plot_learning_curves(history):    pd.DataFrame(history.history).plot(figsize=(8, 5))    plt.grid(True)    plt.gca().set_ylim(0, 1)    plt.show()plot_learning_curves(history)

转载地址:http://lpili.baihongyu.com/

你可能感兴趣的文章
【unix网络编程第三版】阅读笔记(三):基本套接字编程
查看>>
【一天一道LeetCode】#121. Best Time to Buy and Sell Stock
查看>>
【一天一道LeetCode】#125. Valid Palindrome
查看>>
【一天一道LeetCode】#231. Power of Two
查看>>
【一天一道LeetCode】#202. Happy Number
查看>>
带你深入理解STL之Vector容器
查看>>
带你深入理解STL之Deque容器
查看>>
带你深入理解STL之Stack和Queue
查看>>
带你深入理解STL之Set和Map
查看>>
Redis源码剖析--源码结构解析
查看>>
Redis源码剖析--动态字符串SDS
查看>>
Redis源码剖析--双端链表Sdlist
查看>>
Redis源码剖析--字典dict
查看>>
Redis源码剖析--跳跃表zskiplist
查看>>
Redis源码剖析--整数集合Intset
查看>>
Redis源码剖析--对象object
查看>>
Redis源码剖析--字符串t_string
查看>>
Redis源码剖析--快速列表quicklist
查看>>
Redis源码剖析--列表list
查看>>
Android开发学习 之 五、基本界面控件-4时间控件
查看>>