1. 导包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
2. 图像分类 fashion_mnist
数据处理
# 原始数据
(X_train_all, y_train_all),(X_test, y_test) =
tf.keras.datasets.fashion_mnist.load_data()
# 训练集、验证集拆分
X_train, X_valid, y_train, y_valid = train_test_split(X_train_all,
y_train_all, test_size=0.25)
# 数据标准化,你也可以用除以255的方式实现归一化
# 注意最后reshape中的1,代表图像只有一个channel,即当前图像是灰度图
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.reshape(-1, 28 *
28)).reshape(-1, 28, 28, 1)
X_valid_scaled = scaler.transform(X_valid.reshape(-1, 28 * 28)).reshape(-1,
28, 28, 1)
X_test_scaled = scaler.transform(X_test.reshape(-1, 28 * 28)).reshape(-1,
28, 28, 1)
构建CNN模型
model = tf.keras.models.Sequential()
# 多个卷积层
model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=[5, 5],
padding="same", activation="relu", input_shape=(28, 28, 1)))
model.add(tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2))
model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=[5, 5],
padding="same", activation="relu"))
model.add(tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2))
# 将前面卷积层得出的多维数据转为一维
# 7和前面的kernel_size、padding、MaxPool2D有关
# Conv2D: 28*28 -> 28*28 (因为padding="same")
# MaxPool2D: 28*28 -> 14*14
# Conv2D: 14*14 -> 14*14 (因为padding="same")
# MaxPool2D: 14*14 -> 7*7
model.add(tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,)))
# 传入全连接层
model.add(tf.keras.laye