简单示例,一个用 CNN 识别 MNIST 手写数字的模型。数据是 60,000 张训练和 10,000 张测试的 28×28 灰度图,先归一化到 0-1,再加通道。模型用两层卷积(32 和 64 个滤波器)提取特征,两层池化缩小尺寸,再展平后用两个全连接层(128 和 10 个神经元)输出概率。训练 5 轮,用 adam 优化,损失是交叉熵。
import tensorflow as tf
import numpy as np
# 1. 加载MNIST 数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 2. 数据预处理,归一化、加通道维度
x_train = x_train / 255.0
x_test = x_test / 255.0
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
# 3. 构建模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), # 去负值卷积
tf.keras.layers.MaxPooling2D((2, 2)), # 池化
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), # 2次卷积,提取64个特征值
tf.keras.layers.MaxPooling2D((2, 2)), # 池化
tf.keras.layers.Flatten(), # 展平
tf.keras.layers.Dense(128, activation='relu'), # 全连接层, 128个神经元
tf.keras.layers.Dense(10, activation='softmax') # 输出层,10个神经元
])
# 4. 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 5. 训练模型
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
# 6. 测试模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"测试集损失:{test_loss:.4f}, 测试集准确率:{test_acc:.4f}")
# 7. 预测10张图片
predictions = np.argmax(model.predict(x_test[:10]), axis=-1)
print(f"预测结果:{predictions}")
print(f"真实结果:{y_test[:10]}")
输出结果:
Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 18s 9ms/step - accuracy: 0.9097 - loss: 0.2911 - val_accuracy: 0.9859 - val_loss: 0.0449
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 19s 10ms/step - accuracy: 0.9872 - loss: 0.0414 - val_accuracy: 0.9889 - val_loss: 0.0338
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 19s 10ms/step - accuracy: 0.9916 - loss: 0.0260 - val_accuracy: 0.9889 - val_loss: 0.0351
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 21s 11ms/step - accuracy: 0.9937 - loss: 0.0186 - val_accuracy: 0.9914 - val_loss: 0.0268
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 22s 12ms/step - accuracy: 0.9953 - loss: 0.0142 - val_accuracy: 0.9907 - val_loss: 0.0306
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9882 - loss: 0.0411
测试集损失:0.0306, 测试集准确率:0.9907
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
预测结果:[7 2 1 0 4 1 4 9 5 9]
真实结果:[7 2 1 0 4 1 4 9 5 9]
手写图片如下所示: