0
点赞
收藏
分享

微信扫一扫

卷积神经网络解决数字手写体分类问题-Python

乱世小白 2022-04-08 阅读 53
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'))
# softmax激活
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)

在这里插入图片描述

举报

相关推荐

0 条评论