使用TensorFlow实现简化版 GoogLeNet 模型进行 MNIST 图像分类

ops/2024/11/24 3:02:33/

        在本文中,我们将使用 TensorFlow 和 Keras 实现一个简化版的 GoogLeNet 模型来进行 MNIST 数据集的手写数字分类任务。GoogLeNet 采用了 Inception 模块,这使得它在处理图像数据时能更高效地提取特征。本教程将详细介绍如何在 MNIST 数据集上训练和测试这个模型。

项目结构

        我们的代码将分为两个部分:

  1. 训练部分 (train.py): 包含模型定义、数据加载、模型训练等。
  2. 测试部分 (test.py): 用于加载训练好的模型,并在测试集上评估其性能。

训练部分:train.py

1. 数据加载与预处理

        首先,我们需要加载 MNIST 数据集并进行预处理。预处理包括调整图像形状、归一化以及 One-Hot 编码标签。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categoricaldef load_and_preprocess_data():# 加载 MNIST 数据集(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据预处理:将图像形状调整为 [28, 28, 1],并归一化到 [0, 1] 范围train_images = train_images.reshape((train_images.shape[0], 28, 28, 1)) / 255.0test_images = test_images.reshape((test_images.shape[0], 28, 28, 1)) / 255.0# One-Hot 编码标签train_labels = to_categorical(train_labels, 10)test_labels = to_categorical(test_labels, 10)return train_images, train_labels, test_images, test_labels

2. 创建简化版 GoogLeNet 模型

        接下来,我们定义一个简化版的 GoogLeNet 模型。该模型包括卷积层、Inception 模块和全连接层。

from tensorflow.keras import layers, modelsdef googlenet(input_shape=(28, 28, 1), num_classes=10):inputs = layers.Input(shape=input_shape)# 第一卷积层 + 池化层x = layers.Conv2D(32, (3, 3), padding='same', activation='relu')(inputs)x = layers.MaxPooling2D((2, 2))(x)# 第二卷积层 + 池化层x = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(x)x = layers.MaxPooling2D((2, 2))(x)# 第三卷积层 + 池化层x = layers.Conv2D(128, (3, 3), padding='same', activation='relu')(x)x = layers.MaxPooling2D((2, 2))(x)# Inception 模块inception1 = layers.Conv2D(64, (1, 1), activation='relu', padding='same')(x)inception2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(x)inception3 = layers.Conv2D(32, (5, 5), activation='relu', padding='same')(x)# 拼接 Inception 模块的输出x = layers.concatenate([inception1, inception2, inception3], axis=-1)# 全局平均池化层x = layers.GlobalAveragePooling2D()(x)# 全连接层x = layers.Dense(1024, activation='relu')(x)x = layers.Dropout(0.5)(x)  # Dropout 层减少过拟合outputs = layers.Dense(num_classes, activation='softmax')(x)  # 输出层,使用 softmax 激活函数进行多分类model = models.Model(inputs=inputs, outputs=outputs)return model

3. 模型训练

        定义好模型之后,我们使用 Adam 优化器和交叉熵损失函数来训练模型,并保存训练好的模型。

def train_model(model, train_images, train_labels, epochs=5, batch_size=64):# 训练模型history = model.fit(train_images, train_labels,epochs=epochs,batch_size=batch_size)return historydef save_model(model, filename='googlenet_mnist.h5'):model.save(filename)print(f"Model saved to {filename}")

4. 主程序

        最后,在主程序中,我们加载数据、创建模型并开始训练。

def main():train_images, train_labels, test_images, test_labels = load_and_preprocess_data()model = googlenet(input_shape=(28, 28, 1), num_classes=10)model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])train_model(model, train_images, train_labels, epochs=5, batch_size=64)save_model(model)if __name__ == '__main__':main()


测试部分:test.py

1. 加载训练好的模型

        在测试部分,我们将加载训练好的模型,并在测试集上进行评估。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categoricaldef load_and_preprocess_data():(_, _), (test_images, test_labels) = mnist.load_data()test_images = test_images.reshape((test_images.shape[0], 28, 28, 1)) / 255.0test_labels = to_categorical(test_labels, 10)return test_images, test_labelsdef load_model(model_path='googlenet_mnist.h5'):model = tf.keras.models.load_model(model_path)return model

2. 评估模型

        我们通过 evaluate 方法评估模型的损失和准确率。

def evaluate_model(model, test_images, test_labels):test_loss, test_acc = model.evaluate(test_images, test_labels)print(f"Test accuracy: {test_acc * 100:.2f}%")return test_loss, test_acc

3. 显示预测结果

        使用 Matplotlib 可视化前几张图片的预测结果。

import matplotlib.pyplot as pltdef display_predictions(model, test_images, test_labels, num_images=6):predictions = model.predict(test_images[:num_images])fig, axes = plt.subplots(2, 3, figsize=(10, 6))axes = axes.flatten()for i in range(num_images):ax = axes[i]ax.imshow(test_images[i].reshape(28, 28), cmap='gray')ax.set_title(f"Pred: {tf.argmax(predictions[i]).numpy()} \n True: {tf.argmax(test_labels[i]).numpy()}")ax.axis('off')plt.tight_layout()plt.show()

4. 主程序

        在主程序中,我们加载模型,评估其性能,并显示预测结果。

def main():test_images, test_labels = load_and_preprocess_data()model = load_model('googlenet_mnist.h5')evaluate_model(model, test_images, test_labels)display_predictions(model, test_images, test_labels)if __name__ == '__main__':main()


总结

        本文介绍了如何使用 TensorFlow 实现简化版 GoogLeNet,并在 MNIST 数据集上进行训练和测试。我们将代码分为训练和测试两部分,分别处理数据预处理、模型训练与评估、结果展示等工作。

        通过使用 GoogLeNet 进行图像分类,我们不仅能够提高分类性能,还能了解 Inception 模块在图像处理中的强大能力。希望这篇博客能够帮助你更好地理解深度学习模型的训练与测试过程。

完整项目:GoogLeNet-TensorFlow: 使用TensorFlow实现简化版 GoogLeNet 进行 MNIST 图像分类icon-default.png?t=O83Ahttps://gitee.com/qxdlll/goog-le-net-tensor-flow

qxd-ljy/GoogLeNet-TensorFlow: 使用 TensorFlow实现简化版 GoogLeNet 进行 MNIST 图像分类icon-default.png?t=O83Ahttps://github.com/qxd-ljy/GoogLeNet-TensorFlow 


http://www.ppmy.cn/ops/136215.html

相关文章

前端框架主要做些什么工作

前端框架在Web开发中扮演着至关重要的角色,它们主要做以下几方面的工作: 一、简化和加速开发过程 前端框架通过提供预定义的组件、模块和代码库,使开发人员能够快速创建网站和应用,而无需从零开始编写大量的代码。这些框架通常包…

京东面试题目分享

话不多说,直接上问题 一面(视频面) 1小时30分钟 1、类加载机制概念、加载步骤、双亲委托机制、全盘委托机制、类加载器种类及继承关系 2、如何实现让类加载器去加载网络上的资源文件?怎么自定义类加载器?自定义的加…

云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局

11月21日,2024 IDC中国生态峰会在北京举办,吸引了超过300位生态伙伴齐聚一堂,聚焦行业内最前沿的热点话题。本届峰会以“创见先机,智领风云”为主题,深入探讨宏观经济趋势、技术革新以及如何融合AI与数据技术&#xff…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程,提供一些解决思路 需求背景 公司有一个IM项目,对外暴露了两个端口8081和8082,8081是springboot启动使用的端口,对外提供一些http接口…

当企业服务器受到网络攻击该怎样处理?

当企业服务器遭受到网络攻击时该怎样处理呢? 首先企业在确定服务器的系统遭受到攻击后,手电要将网络连接断开,这样可以将网络攻击断开,因为服务器被攻击是因为连接在网络上,并且企业可以根据日志查找攻击者&#xff0c…

前端-react(class组件和Hooks)

文章主要以Hooks为主,部分涉及class组件方法进行对比 一.了解react 1.管理组件的方式 在React中,有两种主要的方式来管理组件的状态和生命周期:Class 组件和 Hooks。 Class 组件: Class 组件是 React 最早引入的方式,它是基于…

一文学习开源框架LeakCanary

LeakCanary 简介 LeakCanary 是一个由 Square 开发的开源工具,主要用于检测和诊断 Android 应用中的内存泄漏问题。它通过自动化的方式帮助开发者捕捉和分析可能导致内存泄漏的对象,简化了内存问题的排查过程。 LeakCanary 的功能 自动检测内存泄漏&a…

JAVA中的Lamda表达式

JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性,用于简化代码,特别是在处理函数式编程时。Lambd…