在 Python 中实现用于图像分类的 CNN
探索如何使用Python编程中的卷积神经网络(CNN)实现图像分类。
导入必要的库
import keras from keras.models import Sequential # 导入用于构建序列模型的库 from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from keras.datasets import mnist # 导入MNIST手写数字数据集 from keras.optimizers import Adam import numpy as np
加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
定义训练和测试数据所占比例
train_percentage = 0.25 # 训练数据:15,000张图像 test_percentage = 0.2 # 测试数据:2,000张图像
根据比例计算样本数量
total_train_samples = len(x_train) total_test_samples = len(x_test) train_samples = int(train_percentage * total_train_samples) test_samples = int(test_percentage * total_test_samples)
按照比例划分数据
x_train = x_train[:train_samples] y_train = y_train[:train_samples] x_test = x_test[:test_samples] y_test = y_test[:test_samples]
将训练和测试数据调整为CNN可接受的输入格式
x_train = np.expand_dims(x_train, axis=-1) x_test = np.expand_dims(x_test, axis=-1)
归一化数据
x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0
构建CNN模型
model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation='relu'), Dense(10, activation='softmax') ])
编译模型
model.compile(optimizer=Adam(0.005), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
打印模型结构摘要
model.summary()
训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64, verbose=2, validation_data=(x_test, y_test))
在干净的测试数据上评估模型
clean_test_loss, clean_test_accuracy = model.evaluate(x_test, y_test, verbose=2) print(f"干净测试准确率: {clean_test_accuracy:.4f}")
导入必要的库
import keras import numpy as np from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from keras.optimizers import Adam
加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
定义训练和测试数据所占比例
train_percentage = 0.25 # 训练数据:15,000张图像 test_percentage = 0.2 # 测试数据:2,000张图像
根据比例计算样本数量
total_train_samples = len(x_train) total_test_samples = len(x_test) train_samples = int(train_percentage * total_train_samples) test_samples = int(test_percentage * total_test_samples)
按照比例划分数据
x_train = x_train[:train_samples] y_train = y_train[:train_samples] x_test = x_test[:test_samples] y_test = y_test[:test_samples]
将像素值归一化到0到1之间
x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0
调整数据形状以适配CNN输入要求
x_train = np.expand_dims(x_train, axis=-1) x_test = np.expand_dims(x_test, axis=-1)
构建CNN模型
model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation='relu'), Dense(10, activation='softmax') ])
打印模型结构摘要
model.summary()
编译模型
model.compile(optimizer=Adam(0.005), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
在干净数据上训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64, verbose=2, validation_data=(x_test, y_test))
在干净的测试数据上评估模型
test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=2) print(f"测试准确率: {test_accuracy:.4f}")