实战深度学习--进行蘑菇分类

数据集:https://pan.quark.cn/s/4d3526600c0c

概述

本笔记将介绍如何使用Python和深度学习库(如TensorFlow和Keras)来构建一个卷积神经网络(CNN)模型,以区分可食用和有毒的蘑菇。我们将从数据准备、模型构建、训练和评估等方面进行详细说明。

1. 导入必要的库
  • os: 用于文件路径操作。
  • cv2: OpenCV库,用于图像处理。
  • numpy: 用于数值计算。
  • train_test_splitLabelEncoder: 来自sklearn,用于数据集划分和标签编码。
  • Sequential, Conv2D, MaxPooling2D, Flatten, Dense, Dropout: 来自tensorflow.keras,用于构建神经网络。
  • to_categorical: 用于独热编码。
  • ImageDataGenerator: 用于数据增强。
2. 设置数据路径和图像大小

设置可食用和有毒蘑菇的图像文件夹路径,并定义图像大小为64x64像素。

edible_path = 'path_to_edible_mushrooms'
poisonous_path = 'path_to_poisonous_mushrooms'
img_size = 64
3. 读取图像并添加标签

遍历图像文件夹,读取图像,调整大小,并将其添加到数据列表中,同时为可食用和有毒蘑菇分配相应的标签。

X = []
y = []# 读取并添加可食用蘑菇图像和标签
# ...# 读取并添加有毒蘑菇图像和标签
# ...
4. 转换数据为NumPy数组

将图像列表和标签列表转换为NumPy数组,以便于后续处理。

X = np.array(X)
y = np.array(y)
5. 标签编码和独热编码

使用LabelEncoder将标签转换为数值,然后使用to_categorical进行独热编码。

le = LabelEncoder()
y = le.fit_transform(y)
y = to_categorical(y, 2)
6. 划分数据集

使用train_test_split将数据集划分为训练集和测试集。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
7. 数据增强

使用ImageDataGenerator进行数据增强,包括旋转、平移和翻转。

datagen = ImageDataGenerator(rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,horizontal_flip=True
)
datagen.fit(X_train)
8. 构建CNN模型

使用Sequential模型和不同的层(如Conv2D, MaxPooling2D, Flatten, Dense)构建CNN。

model = Sequential([# ...Dense(2, activation='softmax')
])
9. 编译模型

使用adam优化器和categorical_crossentropy损失函数编译模型。

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
10. 训练模型

使用训练数据和数据增强训练模型。

history = model.fit(datagen.flow(X_train, y_train, batch_size=32), epochs=25, validation_data=(X_test, y_test))
11. 评估模型

评估模型在测试集上的性能。

loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy:.2f}')
12. 打印分类报告

使用classification_report打印详细的分类性能报告。

y_pred = model.predict(X_test)
y_pred_classes = np.argmax(y_pred, axis=1)
y_true = np.argmax(y_test, axis=1)
print(classification_report(y_true, y_pred_classes, target_names=le.classes_))
13. 总代码
# 用于操作系统功能,如文件路径操作
import os
# OpenCV库的Python接口,用于图像处理
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
# 用于将标签转换为数值编码
from sklearn.preprocessing import LabelEncoder
# 创建Keras模型的线性堆叠层结构
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# 将整数类别标签转换为二进制矩阵(独热编码)
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 数据路径
edible_path = r'Mushroom dataset\Edible'
poisonous_path = r'Mushroom dataset\Poisonous'
# 图像大小
img_size = 64
# 初始化数据和标签列表
X = []
y = []
# 读取可食用蘑菇图片并添加标签
for filename in os.listdir(edible_path):img_path = os.path.join(edible_path, filename)image = cv2.imread(img_path)if image is not None:image = cv2.resize(image, (img_size, img_size))X.append(image)y.append('Edible')
# 读取毒蘑菇图片并添加标签
for filename in os.listdir(poisonous_path):img_path = os.path.join(poisonous_path, filename)image = cv2.imread(img_path)if image is not None:image = cv2.resize(image, (img_size, img_size))X.append(image)y.append('Poisonous')
# 转换为numpy数组
X = np.array(X)
y = np.array(y)
# 标签编码
le = LabelEncoder()
y = le.fit_transform(y)
y = to_categorical(y, 2)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据增强
datagen = ImageDataGenerator(rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,horizontal_flip=True
)
datagen.fit(X_train)
# 构建CNN模型
model = Sequential([Conv2D(32, (3, 3), activation='relu', input_shape=(img_size, img_size, 3)),MaxPooling2D((2, 2)),Conv2D(64, (3, 3), activation='relu'),MaxPooling2D((2, 2)),Conv2D(128, (3, 3), activation='relu'),MaxPooling2D((2, 2)),Flatten(),Dense(512, activation='relu'),Dropout(0.5),Dense(2, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(datagen.flow(X_train, y_train, batch_size=32), epochs=25, validation_data=(X_test, y_test))
# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy:.2f}')
# 打印分类报告
y_pred = model.predict(X_test)
y_pred_classes = np.argmax(y_pred, axis=1)
y_true = np.argmax(y_test, axis=1)
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred_classes, target_names=le.classes_))
结论

通过上述步骤,我们构建了一个能够区分可食用和有毒蘑菇的CNN模型。模型经过数据增强和多轮训练后,在测试集上达到了较高的准确率。分类报告提供了模型性能的详细分析,有助于进一步优化模型。

这份笔记提供了一个完整的流程,从数据准备到模型训练和评估,为使用深度学习进行图像分类提供了一个实用的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 与 Ajax(vue-resource)的集成应用

Vue.js 与 Ajax(vue-resource)的集成应用 Vue.js 是一款流行的前端JavaScript框架,以其简洁、灵活和高效的特点而受到开发者的喜爱。在实际开发中,与后端服务的通信是不可或缺的,而Ajax技术是实现这一功能的关键。在V…

C语言 -- 动态内存管理

C语言 -- 动态内存管理 1. 为什么要有动态内存分配2. malloc 和 free2.1 malloc2.2 free 3. calloc 和 realloc3.1 calloc3.2 realloc 4. 常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放一块动…

【力扣】SQL题库练习5

高级查询和连接 1341.电影评分 表:Movies ------------------------ | Column Name | Type | ------------------------ | movie_id | int | | title | varchar | ------------------------ movie_id 是这个表的主键(具有唯一值的列)。 ti…

力扣131题:分割回文串的 Java 实现

引言 力扣(LeetCode)是一个在线编程平台,提供了大量的编程题目供开发者练习。第131题“分割回文串”是一个有趣的字符串处理问题,要求将一个字符串分割成尽可能多的回文子串。本文将介绍如何使用 Java 解决这个问题。 题目描述 …

05 capture软件创建元器件库(以STM32为例)

05 创建元器件库_以STM32为例 一、新建原理图库文件二、新建器件三、开始创建元器件 一些IC类元件,需要自己创建元器件库。 先看视频,然后自己创建STM32F103C8T6的LQFP48的元器件。 STM32F103C8T6是目前为止,自己用的最多的芯片。 先要有数据…

mysqlMHA

mysqlMHA 什么是MHA ​ 高可用模式下的故障切换,基于主从复制. ​ 至少需要3台 ​ 故障切换过程在0-30秒之内. ​ 这过程和keepalive比较像,也是通过vip地址,根据vip地址所在的主机,确定主备. ​ 主和备不是靠优先级确定的,主从复制的时候就确定了主,备是在MHA的过程中确…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

【学习笔记】解决Serial Communication Library编译问题

【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口&#xff0c;它的工作流程设计在外观和感觉上与 PySerial 相似&#xff0c;但串口速…

ControlNet on Stable Diffusion

ControlNet on Stable Diffusion 笔记来源&#xff1a; 1.Adding Conditional Control to Text-to-Image Diffusion Models 2.How to Use OpenPose & ControlNet in Stable Diffusion 3.ControlNet与DreamBooth&#xff1a;生成模型的精细控制与主体保持 4.Introduction t…

光猫设置桥接 路由器pppoe拨号 设置正常访问光猫 (openwrt)

网络信息展示 光猫桥接很简单吧&#xff0c;就不说了。先来列出修改前的网络接口和网络信息。 光猫192.168.1.1&#xff0c;openwrt 10.0.0.0/8 初始配置 需要记录的信息&#xff1a;WAN的网络设备&#xff08;eth1&#xff09;&#xff0c;光猫的IP&#xff08;192.168.1.1&am…

StarryCoding-35:鼠鼠我鸭

题目描述 在一个叫做酱西功爷枝叶鸡树学院的地方有&#x1d45b;n只小动物&#xff0c;要么是鼠鼠&#xff0c;要么是鸭鸭&#xff0c;从11到&#x1d45b;n编号&#xff0c;每只小动物有个体重&#x1d44e;&#x1d456;ai​。 在这个学校里&#xff0c;存在一种神奇的魔法…

Symfony 入门指南:快速安装与基础配置

Symfony 入门指南&#xff1a;快速安装与基础配置 Symfony 是一个强大而灵活的 PHP 框架&#xff0c;广泛应用于构建现代 Web 应用程序。本指南将带您一步一步地了解如何快速安装 Symfony&#xff0c;并完成基本配置&#xff0c;以便您能够开始使用这个强大的框架。 目录 引…

使用法国云手机进行面向法国的社媒营销

在当今数字化和全球化的时代&#xff0c;社交媒体已经成为企业营销和拓展市场的重要工具。对于想进入法国市场的企业来说&#xff0c;如何在海外社媒营销中脱颖而出、抓住更多的市场份额&#xff0c;成为了一个关键问题。法国云手机正为企业提供全新的营销工具&#xff0c;助力…

Spring Boot多租户配置与实现

在现代应用程序中&#xff0c;多租户架构是一种非常流行的设计模式。多租户架构允许多个客户&#xff08;租户&#xff09;共享同一个应用程序实例&#xff0c;同时确保数据的隔离性和安全性。本文将详细介绍如何在Spring Boot应用程序中配置和实现多租户支持&#xff0c;并提供…

《人工智能大语言模型技术发展研究报告(2024)》【下载】

《人工智能大语言模型技术发展研究报告&#xff08;2024&#xff09;》下载 自2023年起&#xff0c;大模型技术产品的快速迭代和升级&#xff0c;已经成为全球科技竞争的关键因素。由中国软件评测中心发布的《人工智能大语言模型技术发展研究报告&#xff08;2024&#xff09;》…

kafka详解及应用场景介绍

Kafka架构 Kafka架构&#xff0c;由多个组件组成&#xff0c;如下图所示&#xff1a; 主要会包含&#xff1a;Topic、生产者、消费者、消费组等组件。 服务代理&#xff08;Broker&#xff09; Broker是Kafka集群中的一个节点&#xff0c;每个节点都是一个独立的Kafka服务器…

反激Flyback从逆向到初步设计(UC2844)

一.Flyback基本拓扑 国标gb/t 12325-2008《电能质量供电电压偏差》规定&#xff1a;220v单向供电电压偏差为标称电压的-10%&#xff0c;7%。 对应220V的标称电压&#xff0c;其浮动范围是在198~235.4V。以下运算均基于此规定进行。 首先220V进入EMI模块&#xff0c;消除差模干扰…

【Docker】Windows11环境下的安装

前置依赖环境配置 确保虚拟化开启 搜索栏直接搜索如下功能 勾选下面两个选项&#xff0c;确定 重启电脑&#xff0c;以管理员身份打开PowerShell wsl --status wsl --update打开微软应用商店选择一个Ubuntu版本下载并打开 输入一个用户名和密码 然后就可以在Windows下使…

FlowUs与生成式AI结合的未来展望:智能助手问问AI chat与自主代理Agent的应用

生成式AI在对话系统&#xff08;Chat&#xff09;和自主代理&#xff08;Agent&#xff09;中的应用将会带来显著的技术进步和商业机会。 对话系统&#xff08;Chat&#xff09; 对话系统是一种人工智能软件&#xff0c;它能够模拟人类对话&#xff0c;通过自然语言处理&…

go-kratos 学习笔记(7) 服务发现服务间通信grpc调用

服务发现 Registry 接口分为两个&#xff0c;Registrar 为实例注册和反注册&#xff0c;Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc&#xff0c;放到data层&#xff0c;实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…