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

用Python做有趣的AI项目1:用 TensorFlow 实现图像分类(识别猫、狗、汽车等)

项目目标

通过构建卷积神经网络(CNN),让模型学会识别图片中是什么物体。我们将使用 CIFAR-10 数据集,它包含 10 类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。

🛠️ 开发环境与依赖
安装依赖(用命令行运行):

pip install tensorflow matplotlib numpy

推荐使用 Jupyter Notebook,方便边学边运行,也可以用 VS Code、PyCharm 等编辑器。

第一步:导入库

#python
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
import numpy as np

这些库的作用:
tensorflow:用于构建和训练神经网络。
matplotlib:用于可视化图片和训练过程。
numpy:用于处理数组和数据操作。

第二步:加载和预处理数据

#python
#加载 CIFAR-10 数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()#归一化处理:将像素值从 0~255 映射到 0~1,提高模型训练效果
x_train = x_train / 255.0
x_test = x_test / 255.0# CIFAR-10 类别名
class_names = ['飞机', '汽车', '鸟', '猫', '鹿', '狗', '青蛙', '马', '船', '卡车']

第三步:查看数据

#pythonplt.figure(figsize=(10, 2))
for i in range(10):plt.subplot(1, 10, i + 1)plt.xticks([]); plt.yticks([])plt.imshow(x_train[i])plt.xlabel(class_names[y_train[i][0]])
plt.show()

这一部分可以帮你初步理解数据的样子和类别。

第四步:构建 CNN 模型

#pythonmodel = models.Sequential([layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(64, activation='relu'),layers.Dense(10)  # 输出层:10个类
])model.summary()  # 查看模型结构

📌 注解:

Conv2D 是卷积层,能提取图像的边缘、角点等特征。

MaxPooling2D 是池化层,用于降维。

Flatten 把多维数据展平成一维。

Dense 是全连接层,用于分类决策。

第五步:编译和训练模型

#pythonmodel.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))

💡 小贴士:

adam 是一种优化器,适合初学者使用。

SparseCategoricalCrossentropy 适合标签是整数而不是 one-hot 的分类任务。

第六步:训练过程可视化

#pythonplt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.xlabel('Epoch'); plt.ylabel('Accuracy')
plt.legend(); plt.grid()
plt.show()

这个图能直观看到模型是否在过拟合或欠拟合。

第七步:评估模型

#python
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'测试准确率:{test_acc:.2f}')

第八步:预测和展示结果

#pythonprobability_model = models.Sequential([model, layers.Softmax()])
predictions = probability_model.predict(x_test)#展示前5张图片及其预测结果
for i in range(5):plt.imshow(x_test[i])plt.title(f"预测:{class_names[np.argmax(predictions[i])]} / 实际:{class_names[y_test[i][0]]}")plt.axis('off')plt.show()

第九步:保存与加载模型

#python
#保存模型
model.save('cifar10_cnn_model.h5')#加载模型
new_model = tf.keras.models.load_model('cifar10_cnn_model.h5')

🔄 扩展建议

训练猫狗二分类模型(用 Kaggle 的数据集)。
加 BatchNormalization、Dropout 提升泛化能力。
使用更强的预训练模型如 MobileNet、ResNet。

相关文章:

  • lvgl 实现横向滑动,并且捕获最中间那个元素
  • SpringCloud微服务架构
  • 基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
  • VS BUG(6) LINK : fatal error LNK1158: 无法运行“rc.exe”
  • 用 C 语言实现通用的冒泡排序算法
  • UNO Less-to-More Generalization: 通过上下文生成解锁更多可控性
  • 使用UltraSigma给普源RIGOL示波器截图的方法
  • 基于 Python 的自然语言处理系列(86):DPO(Direct Preference Optimization)原理与实战
  • 【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)
  • HBase协处理器深度解析:原理、实现与最佳实践
  • 基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
  • 使用java代码注册onloyoffice账号 || 注册onloyoffice账号
  • vue中 vue.config.js反向代理
  • 计算机网络 | 应用层(3)-- 因特网中的电子邮件
  • 使用银行卡二要素API让支付更加安心
  • 北斗导航 | Transformer增强BiLSTM网络的GNSS伪距观测量误差探测
  • B. And It‘s Non-Zero
  • 提示词的神奇魔力——如何通过它改变AI的输出
  • 免费送源码:Java+ssm+HTML 三分糖——甜品店网站设计与实现 计算机毕业设计原创定制
  • springboot + mybatis 需要写 .xml吗
  • 湖南娄底市长曾超群,已任娄底市委书记
  • “五一”假期云南铁路预计发送旅客超330万人次
  • 特朗普签署行政命令推动深海采矿,被指无视国际规则,引发环境担忧
  • 电厂 | 京东、美团为什么抢着为你送外卖?
  • 北京画院上海“点画”:评论家展场一对一评点
  • 夜读丨修车与“不凑合”