当前位置: 首页 > article >正文

深度学习实战:使用卷积神经网络(CNN)进行图像分类

在当今的机器学习领域,深度学习,尤其是卷积神经网络(CNN),已经在图像分类、物体检测、自然语言处理等领域取得了巨大的成功。本文将通过一个实际的例子,展示如何使用TensorFlow和Keras库构建一个卷积神经网络来进行图像分类。我们将使用经典的CIFAR-10数据集,该数据集包含60000张32x32的彩色图像,分为10个类别。

环境准备

首先,确保你已经安装了TensorFlow。你可以使用以下命令安装:


pip install tensorflow

数据集加载

CIFAR-10数据集是Keras库自带的数据集之一,我们可以直接加载:


import tensorflow as tf

from tensorflow.keras.datasets import cifar10

from tensorflow.keras.utils import to_categorical

 

# 加载数据集

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

 

# 数据归一化到[0, 1]范围

x_train, x_test = x_train / 255.0, x_test / 255.0

 

# 将标签转换为one-hot编码

y_train = to_categorical(y_train, 10)

y_test = to_categorical(y_test, 10)

构建CNN模型

接下来,我们定义一个简单的卷积神经网络模型:


from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

 

model = Sequential([

    Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),

    MaxPooling2D((2, 2)),

    Conv2D(64, (3, 3), activation='relu'),

    MaxPooling2D((2, 2)),

    Conv2D(64, (3, 3), activation='relu'),

    Flatten(),

    Dense(64, activation='relu'),

    Dropout(0.5),

    Dense(10, activation='softmax')

])

编译和训练模型

在训练模型之前,我们需要编译模型,指定损失函数、优化器和评估指标:


model.compile(optimizer='adam', 

              loss='categorical_crossentropy', 

              metrics=['accuracy'])

 

# 训练模型

history = model.fit(x_train, y_train, epochs=20, batch_size=64, 

                    validation_data=(x_test, y_test))

评估模型

训练完成后,我们可以在测试集上评估模型的性能:


test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)

print(f'Test accuracy: {test_acc}')

可视化训练过程

为了更好地理解模型的训练过程,我们可以可视化损失和准确率的变化:


import matplotlib.pyplot as plt

 

# 绘制训练和验证的准确率变化

plt.plot(history.history['accuracy'], label='accuracy')

plt.plot(history.history['val_accuracy'], label = 'val_accuracy')

plt.xlabel('Epoch')

plt.ylabel('Accuracy')

plt.ylim([0, 1])

plt.legend(loc='lower right')

plt.show()

 

# 绘制训练和验证的损失变化

plt.plot(history.history['loss'], label='loss')

plt.plot(history.history['val_loss'], label = 'val_loss')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.legend(loc='upper right')

plt.show()

总结

通过以上步骤,我们成功构建了一个简单的卷积神经网络,并在CIFAR-10数据集上进行了训练和评估。这个模型虽然简单,但已经能够在测试集上达到不错的准确率。你可以尝试调整模型的架构、增加更多的层、使用不同的优化器或正则化技术,以进一步提高模型的性能。

完整的代码如下:


import tensorflow as tf

from tensorflow.keras.datasets import cifar10

from tensorflow.keras.utils import to_categorical

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

import matplotlib.pyplot as plt

 

# 加载数据集

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

 

# 数据归一化到[0, 1]范围

x_train, x_test = x_train / 255.0, x_test / 255.0

 

# 将标签转换为one-hot编码

y_train = to_categorical(y_train, 10)

y_test = to_categorical(y_test, 10)

 

# 构建模型

model = Sequential([

    Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),

    MaxPooling2D((2, 2)),

    Conv2D(64, (3, 3), activation='relu'),

    MaxPooling2D((2, 2)),

    Conv2D(64, (3, 3), activation='relu'),

    Flatten(),

    Dense(64, activation='relu'),

    Dropout(0.5),

    Dense(10, activation='softmax')

])

 

# 编译模型

model.compile(optimizer='adam', 

              loss='categorical_crossentropy', 

              metrics=['accuracy'])

 

# 训练模型

history = model.fit(x_train, y_train, epochs=20, batch_size=64, 

                    validation_data=(x_test, y_test))

 

# 评估模型

test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)

print(f'Test accuracy: {test_acc}')

 

# 可视化训练和验证的准确率变化

plt.plot(history.history['accuracy'], label='accuracy')

plt.plot(history.history['val_accuracy'], label = 'val_accuracy')

plt.xlabel('Epoch')

plt.ylabel('Accuracy')

plt.ylim([0, 1])

plt.legend(loc='lower right')

plt.show()

 

# 可视化训练和验证的损失变化

plt.plot(history.history['loss'], label='loss')

plt.plot(history.history['val_loss'], label = 'val_loss')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.legend(loc='upper right')

plt.show()

http://www.kler.cn/a/510118.html

相关文章:

  • 正态分布检验(JB检验和威尔克检验)和斯皮尔曼相关系数(继上回)
  • Mockito+PowerMock+Junit单元测试
  • 二进制/源码编译安装mysql 8.0
  • LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)
  • 【PyQt】图像处理系统
  • 初识go语言之指针用法
  • 使用Pytorch完成图像分类任务
  • 数据分析如何正确使用ChatGPT进行辅助?
  • 《多模态语言模型的局限性与生态系统发展现状分析》
  • Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5
  • 拟合算法 (matlab工具箱)
  • 使用Websocket进行前后端实时通信
  • 彻底理解JVM类加载机制
  • 企业可以通过以下方式利用全星QMS软件提高质量管理的效率和准确性
  • PCL 计算点云的最大距离【2025最新版】
  • 蓝桥杯训练—芯片测试
  • 安装httpd
  • CentOS 7.9下安装Docker
  • WEB渗透技术研究与安全防御
  • 乘联会:1月汽车零售预计175万辆 环比暴跌33.6%
  • 构建安全防线:基于视频AI的煤矿管理系统架构创新成果展示
  • MobileNet:轻量级卷积神经网络引领移动设备图像识别新时代
  • 广东打造低空经济发展平台,CES Asia 2025助力科技腾飞
  • 国内微电子(集成电路)领域重点高校的特色与优势
  • 【scrapy】信号量—扩展随笔
  • 利用@WebMvcTest测试Spring MVC应用