import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
# 1. 加载数据并预处理
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 添加通道维度并归一化
train_images = np.expand_dims(train_images, axis=-1) / 255.0 # 形状变为 (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) / 255.0 # (10000, 28, 28, 1)
# 2. 数据增强
datagen = ImageDataGenerator(
rotation_range=10, # 随机旋转角度范围
zoom_range=0.1, # 随机缩放范围
width_shift_range=0.1, # 水平平移
height_shift_range=0.1 # 垂直平移
)
# 3. 构建CNN模型(更适合图像)
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'),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
# 4. 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 5. 训练(使用数据增强)
model.fit(datagen.flow(train_images, train_labels, batch_size=32),
epochs=5,
validation_data=(test_images, test_labels))
# 6. 评估
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"测试集准确率: {test_acc:.2%}")
