1. 引言

卷积神经网络(Convolutional Neural Network, CNN)是深度学习中最重要的模型之一,广泛应用于图像分类、目标检测和语音识别等领域。华为昇思(MindSpore)作为一款高效、易用的深度学习框架,为 CNN 的构建与训练提供了强大支持。本篇博客将详细介绍如何使用 MindSpore 实现一个基于 MNIST 数据集的 CNN 模型,并进行训练与评估。

2. 环境搭建

2.1 安装 MindSpore

在 Linux 设备上安装 GPU 版本(请确保已安装 CUDA 和 cuDNN):

pip install mindspore-gpu -f https://www.mindspore.cn/whl/gpu.html

安装 CPU 版本(适用于一般计算设备):

pip install mindspore -f https://www.mindspore.cn/whl/cpu.html

2.2 安装数据处理库

pip install numpy matplotlib

3. 数据加载与预处理

使用 MNIST 数据集,该数据集包含 60,000 张训练图片和 10,000 张测试图片,每张图片为 28×28 的灰度手写数字。

import mindspore.dataset as ds
import mindspore.dataset.transforms.c_transforms as transforms
import mindspore.dataset.vision.c_transforms as vision
import mindspore.dataset.vision.c_transforms as CV
import mindspore.dataset.vision.py_transforms as py_vision
import mindspore.common.dtype as mstype

# 定义数据预处理函数
def create_dataset(data_path, batch_size=32, shuffle=True):
    dataset = ds.MnistDataset(data_path, shuffle=shuffle)
    transform_img = [
        vision.Rescale(1.0 / 255.0, 0.0),
        vision.Rescale(1 / 0.3081, -1 * 0.1307 / 0.3081),
        vision.HWC2CHW()
    ]
    transform_label = [transforms.TypeCast(mstype.int32)]
    dataset = dataset.map(operations=transform_img, input_columns="image")
    dataset = dataset.map(operations=transform_label, input_columns="label")
    dataset = dataset.batch(batch_size)
    return dataset

# 加载数据集
train_dataset = create_dataset("./MNIST_Data/train")
test_dataset = create_dataset("./MNIST_Data/test")

4. 搭建 CNN 模型

CNN 由卷积层(Conv)、池化层(Pooling)和全连接层(FC)组成,以下实现一个典型的 LeNet-5 网络结构。

import mindspore.nn as nn
import mindspore.ops as ops
from mindspore import Model
from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor

class CNN(nn.Cell):
    def __init__(self, num_classes=10):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1, pad_mode='valid')
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2, pad_mode='valid')
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1, pad_mode='valid')
        self.fc1 = nn.Dense(16 * 4 * 4, 120)
        self.fc2 = nn.Dense(120, 84)
        self.fc3 = nn.Dense(84, num_classes)

    def construct(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = self.relu(x)
        x = self.pool(x)
        x = ops.reshape(x, (x.shape[0], -1))
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.relu(x)
        x = self.fc3(x)
        return x

5. 训练 CNN

from mindspore import context
from mindspore.train.model import Model
from mindspore.nn import Accuracy

# 设置运行环境
device_target = "GPU"  # 可选 "CPU" 或 "GPU"
context.set_context(mode=context.GRAPH_MODE, device_target=device_target)

# 初始化模型
network = CNN(num_classes=10)
loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")
optimizer = nn.Adam(network.trainable_params(), learning_rate=0.001)
model = Model(network, loss_fn=loss_fn, optimizer=optimizer, metrics={"Accuracy": Accuracy()})

# 设置训练回调
config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10)
ckpoint_cb = ModelCheckpoint(prefix="cnn_mnist", config=config_ck)
loss_cb = LossMonitor(per_print_times=100)

# 训练模型
model.train(10, train_dataset, callbacks=[ckpoint_cb, loss_cb])

6. 评估模型

acc = model.eval(test_dataset)
print(f"Test Accuracy: {acc['Accuracy']:.2f}")

7. 预测示例

import matplotlib.pyplot as plt
import mindspore.numpy as mnp

def predict_sample(index):
    sample = list(test_dataset.create_dict_iterator())[index]
    image = sample['image']
    label = sample['label'].asnumpy()
    pred = model.predict(image)
    pred_label = mnp.argmax(pred, axis=1).asnumpy()
    plt.imshow(image.asnumpy()[0][0], cmap='gray')
    plt.title(f"True: {label[0]}, Predicted: {pred_label[0]}")
    plt.show()

predict_sample(0)

8. 结论与优化建议

本文基于 MindSpore 实现了一个 CNN,并成功训练 MNIST 数据集。可以通过以下方式优化模型性能:
(1) 数据增强:使用 mindspore.dataset.vision 进行数据扩增,提高泛化能力。
(2) 调整网络结构:增加卷积层或采用更深层的架构(如 ResNet)。
(3) 超参数优化:调节学习率、批次大小等,寻找最佳参数。

通过 MindSpore 的高效计算能力,可以更快速地训练和部署深度学习模型,使 CNN 在实际任务中发挥更大作用。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐