利用K近邻算法与CNN(卷积神经网络)实现手写数字识别
from sklearn.datasets import load_digits
import numpy as np
digits = load_digits()
X_data = digits.data.astype(np.float32)
y_data = digits.target.astype(np.float32).reshape(-1, 1)
X_data.shape, y_data.shape
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X_data)
X = X.reshape(-1, 8, 8, 1)
y = OneHotEncoder(categories='auto').fit_transform(
y_data).todense()
X.shape, y.shape
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(
filters=10,
kernel_size=[3, 3],
strides=(1, 1),
padding='same',
activation=tf.nn.relu,
input_shape=(8, 8, 1)
))
model.add(tf.keras.layers.MaxPool2D(
pool_size=[3, 3],
strides=2,
padding='same'
))
model.add(tf.keras.layers.Conv2D(filters=5, kernel_size=[3, 3], strides=(2, 2), padding='same'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=[3, 3], strides=2, padding='same'))
model.add(tf.keras.layers.Reshape(target_shape=(1*1*5,)))
model.add(tf.keras.layers.Dense(units=50, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(units=10))
model.add(tf.keras.layers.Softmax())
model.summary()
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=[tf.keras.metrics.categorical_accuracy]
)
batch_size = 32
epochs = 50
model.fit(X, y, epochs=epochs, batch_size=batch_size)