基于tensorflow深度学习的猫狗分类识别

基于tensorflow深度学习的猫狗分类识别 felix 2023-07-06 14:10:42 596

实验背景

近年来,深度学习在计算机视觉领域取得了巨大的成功,尤其是在图像分类任务上。图像分类是计算机视觉领域的基本问题之一,而猫狗分类作为图像分类中的经典问题,吸引了广泛的研究兴趣。猫狗分类问题具有很高的实际应用价值。在现实世界中,人们经常需要对动物进行分类,如在宠物识别、动物行为分析和动物保护等领域。传统的图像分类方法通常需要手工设计特征提取器和分类器,这在处理复杂的图像数据时面临着挑战。

深度学习通过学习端到端的特征提取和分类模型,不需要手动设计特征提取器,因此在猫狗分类问题上具有巨大的潜力。卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习中最常用的模型之一,特别适用于图像数据的处理。猫狗分类问题的研究可以帮助我们深入理解深度学习在图像分类任务中的应用,并且可以为其他图像分类问题的研究提供经验和指导。此外,研究人员还可以通过比较不同深度学习模型的性能和对比传统方法的效果,评估深度学习在猫狗分类问题上的优势和局限性。

此外,随着深度学习模型的不断发展和算力的提升,研究人员可以尝试更复杂的模型架构、数据增强技术和迁移学习方法,以进一步提高猫狗分类任务的准确性和鲁棒性。因此,基于深度学习的猫狗分类实验具有重要的研究价值,可以推动深度学习在图像分类领域的发展,同时为实际应用场景提供更好的解决方案。

实验目的

本实验的目的是基于深度学习方法进行猫狗分类,通过设计和训练深度神经网络模型,实现对输入图像进行准确的猫狗分类。具体目标包括:

1.建立一个高性能的猫狗分类模型:通过深度学习技术,构建一个能够从原始图像数据中自动学习到猫狗分类特征的神经网络模型。该模型能够准确地对输入图像进行分类,具备较高的分类准确率和泛化能力。

2.探索不同深度学习模型的性能差异:比较不同深度学习模型(如卷积神经网络、残差网络等)在猫狗分类任务上的性能表现,评估它们的准确率、召回率、精确率等指标,并分析其优势和不足之处。

3.优化模型性能:通过调整模型的超参数、网络结构以及训练策略等,进一步提高猫狗分类模型的性能。例如,可以尝试不同的激活函数、优化器、学习率调度等,以提高模型的收敛速度和泛化能力。

4.数据增强和处理:应用数据增强技术,如随机裁剪、旋转、翻转等,扩充训练数据集的多样性,提高模型对于各种场景和变化的鲁棒性。同时,对原始图像数据进行预处理,如图像归一化、均衡化等,以便更好地适应模型输入要求。

5.评估模型性能:使用独立的测试数据集对训练好的模型进行评估,计算分类准确率、混淆矩阵等指标,评估模型的性能。同时,可以与其他传统方法进行比较,验证基于深度学习的方法在猫狗分类问题上的优越性。

实验环境

Python3.9

Jupyter notebook

实验过程

1.加载数据

首先导入本次实验用到的第三方库

接着定义我们数据集的路径

定义训练集、测试集、验证集生成器

将生成器连接到文件夹中的数据

将生成器连接到文件夹中的数据

2.数据预处理

3.构建模型

构建模型、定义优化器

保存模型

4.训练模型

5.模型评估

将模型训练和验证的损失可视化出来、以及训练和验证的准确率


对验证数据集进行评估

将模型的混淆矩阵一热力图的形式展示

源代码

  1. import numpy as np
  2. import random
  3. import matplotlib.pyplot as plt
  4. %matplotlib inline
  5. from sklearn.metrics import confusion_matrix
  6. import seaborn as sns
  7. sns.set(style='darkgrid', font_scale=1.4)
  8. import os
  9. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  10. from tensorflow import keras
  11. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  12. from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2, preprocess_input
  13. from tensorflow.keras.layers import Dense, Flatten
  14. from tensorflow.keras.models import Model
  15. from tensorflow.keras.optimizers import Adam
  16. # 数据集路径
  17. train_dir = './train'
  18. test_dir = './test'
  19. CFG = dict(
  20. seed = 77,
  21. batch_size = 16,
  22. img_size = (299,299),
  23. epochs = 5,
  24. patience = 5
  25. )
  26. train_data_generator = ImageDataGenerator(
  27. validation_split=0.15,
  28. rotation_range=15,
  29. width_shift_range=0.1,
  30. height_shift_range=0.1,
  31. preprocessing_function=preprocess_input,
  32. shear_range=0.1,
  33. zoom_range=0.2,
  34. horizontal_flip=True,
  35. fill_mode='nearest')
  36. val_data_generator = ImageDataGenerator(preprocessing_function=preprocess_input, validation_split=0.15)
  37. test_data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)
  38. # 将生成器连接到文件夹中的数据
  39. train_generator = train_data_generator.flow_from_directory(train_dir, target_size=CFG['img_size'], shuffle=True, seed=CFG['seed'], class_mode='categorical', batch_size=CFG['batch_size'], subset="training")
  40. validation_generator = val_data_generator.flow_from_directory(train_dir, target_size=CFG['img_size'], shuffle=False, seed=CFG['seed'], class_mode='categorical', batch_size=CFG['batch_size'], subset="validation")
  41. test_generator = test_data_generator.flow_from_directory(test_dir, target_size=CFG['img_size'], shuffle=False, seed=CFG['seed'], class_mode='categorical', batch_size=CFG['batch_size'])
  42. # 样本和类的数量
  43. nb_train_samples = train_generator.samples
  44. nb_validation_samples = validation_generator.samples
  45. nb_test_samples = test_generator.samples
  46. classes = list(train_generator.class_indices.keys())
  47. print('Classes:'+str(classes))
  48. num_classes = len(classes)
  49. # 可视化一些例子
  50. plt.figure(figsize=(15,15))
  51. for i in range(9):
  52. ax = plt.subplot(3,3,i+1)
  53. ax.grid(False)
  54. ax.get_xaxis().set_visible(False)
  55. ax.get_yaxis().set_visible(False)
  56. batch = train_generator.next()
  57. imgs = (batch[0] + 1) * 127.5
  58. label = int(batch[1][0][0])
  59. image = imgs[0].astype('uint8')
  60. plt.imshow(image)
  61. plt.title('cat' if label==1 else 'dog')
  62. plt.show()
  63. base_model = InceptionResNetV2(weights='imagenet', include_top=False, input_shape=(CFG['img_size'][0], CFG['img_size'][1], 3))
  64. x = base_model.output
  65. x = Flatten()(x)
  66. x = Dense(100, activation='relu')(x)
  67. predictions = Dense(num_classes, activation='softmax', kernel_initializer='random_uniform')(x)
  68. # 构建模型
  69. model = Model(inputs=base_model.input, outputs=predictions)
  70. for layer in base_model.layers:
  71. layer.trainable = False
  72. # 定义优化器
  73. optimizer = Adam()
  74. model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
  75. # 保存模型
  76. save_checkpoint = keras.callbacks.ModelCheckpoint(filepath='model.h5', monitor='val_loss', save_best_only=True, verbose=1)
  77. early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss', patience=CFG['patience'], verbose=True)
  78. # 训练模型
  79. history = model.fit(
  80. train_generator,
  81. steps_per_epoch=nb_train_samples // CFG['batch_size'],
  82. epochs=CFG['epochs'],
  83. callbacks=[save_checkpoint,early_stopping],
  84. validation_data=validation_generator,
  85. verbose=True,
  86. validation_steps=nb_validation_samples // CFG['batch_size'])
  87. history_dict = history.history
  88. loss_values = history_dict['loss']
  89. val_loss_values = history_dict['val_loss']
  90. epochs_x = range(1, len(loss_values) + 1)
  91. plt.figure(figsize=(10,10))
  92. plt.subplot(2,1,1)
  93. plt.plot(epochs_x, loss_values, 'b-o', label='Training loss')
  94. plt.plot(epochs_x, val_loss_values, 'r-o', label='Validation loss')
  95. plt.title('Training and validation Loss')
  96. plt.xlabel('Epochs')
  97. plt.ylabel('Loss')
  98. # Accuracy
  99. plt.subplot(2,1,2)
  100. acc_values = history_dict['accuracy']
  101. val_acc_values = history_dict['val_accuracy']
  102. plt.plot(epochs_x, acc_values, 'b-o', label='Training acc')
  103. plt.plot(epochs_x, val_acc_values, 'r-o', label='Validation acc')
  104. plt.title('Training and validation accuracy')
  105. plt.xlabel('Epochs')
  106. plt.ylabel('Acc')
  107. plt.legend()
  108. plt.tight_layout()
  109. plt.show()
  110. # 对验证数据集进行评估
  111. score = model.evaluate(validation_generator, verbose=False)
  112. print('Val loss:', score[0])
  113. print('Val accuracy:', score[1])
  114. # 对测试数据集进行评估
  115. score = model.evaluate(test_generator, verbose=False)
  116. print('Test loss:', score[0])
  117. print('Test accuracy:', score[1])
  118. # 混淆矩阵
  119. y_pred = np.argmax(model.predict(test_generator), axis=1)
  120. cm = confusion_matrix(test_generator.classes, y_pred)
  121. # 热力图
  122. plt.figure(figsize=(8,6))
  123. sns.heatmap(cm, annot=True, fmt='d', cbar=True, cmap='Blues',xticklabels=classes, yticklabels=classes)
  124. plt.xlabel('Predicted label')
  125. plt.ylabel('True label')
  126. plt.title('Confusion matrix')
  127. plt.show()
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
felix
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
felix
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区