import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import StratifiedKFold
import tensorflow as tf
from tensorflow import keras
import warnings
warnings.filterwarnings('ignore')
tf.__version__

数据预处理
(x_train_all,y_train_all),(x_test,y_test) = tf.keras.datasets.mnist.load_data()

x_train_all.shape,y_train_all.shape

EDA
img = x_train_all[0]
print(y_train_all[0])
plt.imshow(img,cmap = 'binary')

sns.countplot(y_train_all)

对数据做归一化处理
x_train_all = x_train_all/255.
x_test = x_test/255.

x_train_all = x_train_all.tolist()
y_train_all = y_train_all.tolist()
for i in range(len(x_train_all)):
x_train_all.append(np.array(x_train_all[i]).reshape(-1)[::-1].reshape(28,28))
y_train_all.append(y_train_all[i])
x_train_all = np.array(x_train_all)
y_train_all = np.array(y_train_all)
x_train_all.shape,y_train_all.shape

建立模型 CNN
构建模型
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,padding='same',activation='selu',input_shape=(28, 28,1)))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3,padding='same',activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='selu'))
model.add(keras.layers.Dense(128, activation='selu'))
model.add(keras.layers.Dense(10, activation="softmax"))
model.compile(loss="sparse_categorical_crossentropy",optimizer = 'adam',metrics = ["accuracy"])
model.summary()

设置回调函数
early_stopping = keras.callbacks.EarlyStopping(
patience=20,
min_delta=0,
monitor='val_loss',
restore_best_weights=True,
verbose=0,
mode='min',
baseline=None,
)
plateau = keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.2,
patience=7,
verbose=0,
mode='min')
区分训练集和验证集
from sklearn.model_selection import train_test_split
x_train_all = x_train_all.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
x_train,x_valid,y_train,y_valid = train_test_split(
x_train_all,y_train_all,
test_size = 0.0834,
random_state = 666,shuffle = True)
训练模型
history = model.fit( x_train, y_train,
validation_data = (x_valid, y_valid),
batch_size = 32,
epochs = 10,
callbacks = [early_stopping, plateau],
shuffle = True,
)

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

预测
model.evaluate(x_test, y_test, verbose=0)
