僧侶的疾病侦探:AI 强化的植物健康指南

AI 强化的植物健康指南:僧侶的疾病侦探

介绍

农业是我们文明的命脉,为全球数十亿人提供食物和滋养。然而,这个重要的产业面临着一个无情的敌人:植物疾病。这些微观威胁可以对作物造成严重破坏,导致巨额经济损失和食物短缺。保护我们的农业遗产的关键在于早期检测和及时干预,而先进技术将发挥作用。本全面指南将以强大的机器学习库Monk为基础,探索植物疾病分类的旅程。通过本文,您将具备利用人工智能有效地识别和防治植物疾病的知识。

所以,系好安全带,让我们看看Monk如何赋予我们能力,创建、训练和优化用于植物疾病分类的深度学习模型。但在我们深入技术细节之前,让我们通过了解这项努力的重要性以及Monk的关键作用来准备一下。

学习目标

  • 了解Monk软件/库的基础知识。
  • 学习如何在本地计算机或首选开发环境上安装和设置Monk。
  • 探索机器学习中高质量数据的重要性。
  • 学习如何使用Monk获取、预处理和组织植物疾病图像数据集进行分类任务。
  • 深入了解选择适当的深度学习模型架构进行植物疾病分类。
  • 了解如何在Monk内配置和微调模型,包括用于迁移学习的预训练模型。

本文是数据科学博文马拉松的一部分。

实践指南:使用Monk创建您的第一个植物疾病分类器

本节将逐步介绍构建用于植物疾病分类的Monk模型的过程。无论您是机器学习新手还是经验丰富的数据科学家,按照以下说明开始进行植物疾病分类之旅。

第一步:数据收集

在第一步中,我们将收集我们的植物疾病分类项目所需的数据集。按照以下步骤收集数据:

植物村的出色团队收集了数据集

1. 上传Kaggle API令牌:

  • 使用以下代码上传您的Kaggle API令牌。这个令牌用于从Kaggle下载数据集。
from google.colab import filesfiles.upload()

2. 安装Kaggle Python包:

  • 您必须安装Kaggle Python包以在Colab环境中与Kaggle交互。运行以下命令:
!pip install kaggle

3. 设置Kaggle配置目录:

  • 使用以下代码将Kaggle配置目录设置为“/content”:
import osos.environ['KAGGLE_CONFIG_DIR'] = '/content'

4. 设置适当的权限:

  • 通过运行以下命令,确保Kaggle API令牌文件具有正确的权限:
!chmod 600 /content/kaggle.json

5. 下载数据集:

  • 使用Kaggle API通过运行此命令下载植物疾病数据集:
!kaggle datasets download -d "prashantmalge/plant-disease"

6. 解压缩数据集:

  • 最后,使用以下命令解压缩下载的数据集:
!unzip plant-disease.zip

这将使数据集在您的Colab环境中可用,以进行进一步处理和训练。根据您的具体项目需要调整数据集名称和路径。

第二步:设置Monk

首先,您必须在本地计算机或云环境上设置Monk。按照以下步骤使Monk运行起来:

1. 克隆Monk存储库:

# Clone the Monk repository!git clone https://github.com/Tessellate-Imaging/monk_v1.git# Add the Monk repository to the Python pathimport syssys.path.append("./monk_v1/monk")# Install any required packages or dependencies if needed# Uncomment and add your installation command here# !pip install -r /kaggle/working/monk_v1/installation/requirements_kaggle.txt

2. 使用pip安装Monk:

!pip install -U monk-colab

Step 3: 创建一个实验

现在,让我们创建一个Monk实验。实验是一个结构化环境,在这里您可以定义训练疾病分类器的参数和配置。以下是一个代码片段供您参考:

from pytorch_prototype import prototype
# 创建一个实验
ptf = prototype(verbose=1)
ptf.Prototype("植物疾病", "实验1")

在这段代码中,我们将实验命名为“植物疾病”,标记为“实验1”。您可以根据您的项目调整名称。

Step 4:数据加载与预处理

加载数据集并应用数据转换进行预处理。Monk提供了方便的函数来加载数据并使用转换。以下是一个示例:

# 加载数据集并定义转换
ptf.Default(dataset_path=["./dataset/train", "./dataset/val"], model_name="resnet18", freeze_base_network=True, num_epochs=5)

在这个代码片段中,我们指定了数据集路径和模型架构(ResNet-18),并冻结了基础网络的权重。

Step 5:快速模型搜索

选择适合您需求的模型架构并开始训练过程。Monk支持各种预训练模型,并且您可以根据需要进行微调。以下是如何执行的示例:

# 分析 - 1
# 分析项目名称
analysis_name = "模型搜索";
# 要分析的模型列表
# 列表中的第一个元素-模型名称
# 列表中的第二个元素-冻结基础网络的布尔值
# 列表中的第三个元素-是否使用预训练模型作为起点的布尔值
models = [["resnet34", True, True], ["resnet50", False, True], ["densenet121", False, True], ["densenet169", True, True], ["densenet201", True, True]];
# 每个实验运行的时期数量
epochs = 5;
# 用于实验的原始数据集的百分比
percent_data = 10;
# “keep_all” - 保留所有创建的子实验
# “keep_non” - 删除所有创建的子实验
ptf.Analyse_Models(analysis_name, models, percent_data, num_epochs=epochs, state="keep_none"); 
  1. 分析项目名称:analysis_name是一个变量,存储分析项目的名称。在这种情况下,设置为“模型搜索”。
  2. 要分析的模型:models列表指定要分析的模型。每个模型表示为一个具有三个元素的列表:
  3. 时期数量:您要为每个实验运行的时期数量。在这种情况下,设置为5。
  4. 原始数据集的百分比:percent_data指定用于实验的原始数据集的百分比。设置为10%,意味着仅使用10%的数据集。
  5. 状态:状态参数确定是否保留或删除子实验。当设置为“keep_none”时,子实验将不会保留,而只保留最终结果。
  6. Analyse_Models:最后,使用指定的参数调用ptf.Analyse_Models()函数来执行模型分析。它将为每个模型运行实验并记录结果。

这段代码有助于快速测试具有不同配置的多个模型,以找到最佳性能的模型来完成您的任务。选择适当的模型架构是机器学习和深度学习项目中的标准步骤。

输出:

Step 6:更新模型

## 更新模型架构
ptf.update_model_name("densenet121");
ptf.update_freeze_base_network(True);
ptf.update_use_pretrained(True);
ptf.Reload();
  1. 更新模型名称:ptf.update_model_name(“densenet121”)将模型架构更新为“densenet121”。这意味着您正在从先前使用的模型切换到DenseNet-121。
  2. 更新冻结基础网络:ptf.update_freeze_base_network(True)将冻结基础网络的标志设置为“True”。冻结基础网络意味着模型的预训练层在训练过程中不会更新。它们将保持固定,只有额外的层(如果有)会被训练。当使用预训练模型进行迁移学习时,这很有用。
  3. 更新使用预训练:ptf.update_use_pretrained(True)将使用预训练权重的标志设置为“True”。这表示您希望使用预训练权重来初始化模型。在切换到新的模型架构(如DenseNet-121)时,使用预训练权重作为迁移学习的起点是常见的。
  4. 重新加载:ptf.Reload()使用更新的配置重新加载模型。在更改模型架构和其设置后,重新加载模型以应用这些更改是必要的。

总结来说,这段代码将模型架构切换为DenseNet-121,冻结了基础网络,并使用了预训练的权重。然后通过重新加载模型将这些变化应用到模型中。

输出:

步骤 7:找到合适的批大小

# 分析 - 2# 分析项目名称analysis_name = "Batch_Size_Finder";# 要探索的批大小batch_sizes = [4, 8, 16, 32];# 每次实验运行的纪元数epochs = 10;# 用于实验的原始数据集的百分比percent_data = 10;# "keep_all" - 保留所有创建的子实验# "keep_non" - 删除所有创建的子实验   ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data,                         num_epochs=epochs, state="keep_none"); 
  1. 分析名称:analysis_name = “Batch_Size_Finder” 定义了分析的名称,本例中为“Batch_Size_Finder”。此名称帮助您识别此分析的目的。
  2. 要探索的批大小:batch_sizes = [4, 8, 16, 32] 列出了您在分析中要探索的不同批大小。在此示例中,您考虑了批大小为 4、8、16 和 32。
  3. 纪元数:epochs = 10 指定了每个实验在分析中的训练纪元数。每个实验将运行十个纪元,以评估模型在不同批大小下的性能。
  4. 原始数据集的百分比:percent_data = 10 定义了您要用于实验的原始数据集的百分比。在本例中,您使用了数据集的 10%。
  5. 状态:state=“keep_none” 指定了分析过程中所创建的子实验的状态。在本例中,“keep_none”表示您不想保留在此分析期间创建的任何子实验。它们将在研究完成后被删除。
  6. 分析批大小:ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data, num_epochs=epochs, state=“keep_none”) 启动批大小分析。此函数将使用不同的批大小(4、8、16 和 32)运行实验,以评估它们对模型性能的影响。

此分析旨在确定批大小对深度学习模型的训练和验证性能产生最佳结果的大小。不同的批大小可能会影响训练速度和收敛性;此分析可帮助您找到最佳值。

输出:

步骤 8:更新批大小

## 更新批大小ptf.update_batch_size(8);ptf.Reload();
  1. 更新批大小:ptf.update_batch_size(8) 将模型的批大小更新为 8。这意味着您的模型将在训练过程中以每批 8 个样本的大小处理数据。批大小是一个可以影响模型训练速度、内存使用和收敛性的超参数。
  2. 重新加载:ptf.Reload() 重新加载具有更新批大小的模型。这是必要的,因为更改批大小可能会影响模型的内存需求,并重新加载可以确保模型以新的批大小正确配置。

将批大小设置为 8 的意思是,在训练过程中,您的模型应以每批 8 个样本的大小处理数据。此值是通过批大小分析(如前面的代码片段所示)确定的,以找到适合您特定深度学习任务的最佳批大小。

输出:

步骤 9:找到正确的输入维度

# 分析 - 3# 分析项目名称analysis_name = "Input_Size_Finder";# 要探索的输入大小input_sizes = [224, 256, 512];# 每次实验运行的纪元数epochs=5;# 用于实验的原始数据集的百分比percent_data=10;# "keep_all" - 保留所有创建的子实验# "keep_non" - 删除所有创建的子实验   ptf.Analyse_Input_Sizes(analysis_name, input_sizes, percent_data,                         num_epochs=epochs, state="keep_none"); 
  1. 分析项目名称: analysis_name = “Input_Size_Finder” 定义了一个用于组织和标记与输入大小相关的实验的分析项目名称。
  2. 要探索的输入大小: input_sizes = [224, 256, 512] 指定了一个要探索的输入大小(图像尺寸)的列表。你正在测试三种不同的输入大小:224×224、256×256和512×512像素。
  3. 训练轮数: epochs = 5 设置了每个实验的训练轮数。在这种情况下,你对每个输入大小的模型进行了五轮的训练。
  4. 原始数据集的百分比: percent_data = 10 指定了用于实验的原始数据集的百分比。使用较小的数据集部分可以加快分析速度,同时提供关于不同输入大小对模型性能的影响的见解。
  5. 状态: state=”keep_none” 表示你只想保留最佳性能的实验并且舍弃其他实验。这对于高效地确定最佳输入大小而不在工作区域中保留多个实验非常有用。

这个分析项目可以帮助您确定适合特定深度学习任务的最佳输入大小。不同的输入大小可能会影响模型的性能和训练速度,因此找到项目的合适平衡是至关重要的。

输出:

第10步: 更新输入大小

## 更新输入大小ptf.update_input_size(224);ptf.Reload();
  1. 更新输入大小: ptf.update_input_size(224) 将您的模型的输入大小设置为224×224像素。这意味着您的模型将期望输入图像的宽度和高度都为224像素。更改输入大小可能会显著影响模型的性能和训练时间。
  2. 重新加载: ptf.Reload() 使用更新后的输入大小重新加载模型。这一步是必要的,因为更改输入大小需要对模型架构进行修改。重新加载确保模型以新的输入大小正确配置。

通过将输入大小设置为224×224像素,您已经有效地使您的模型准备好在训练和推断过程中接受这个尺寸的图像。选择输入大小应当与您的数据集和任务要求保持一致,通常是一项关键的超参数,需要进行调整以获得最佳结果。

输出:

第11步: 找到正确的初始学习率

#分析 - 4# 分析项目名称analysis_name = "Learning_Rate_Finder"# 要探索的学习率lrs = [0.01, 0.005, 0.001, 0.0001];# 每个实验的训练轮数epochs=5# 用于实验的原始数据集的百分比percent_data=10# "keep_all" - 保留所有创建的子实验# "keep_non" - 删除所有创建的子实验ptf.Analyse_Learning_Rates(analysis_name, lrs, percent_data,                             num_epochs=epochs, state="keep_none"); 
  1. 分析项目名称: analysis_name = “Learning_Rate_Finder” 设置了学习率分析项目的名称。您将使用这个名称来组织您的实验结果。
  2. 要探索的学习率: lrs = [0.01, 0.005, 0.001, 0.0001] 指定了要在分析过程中探索的学习率列表。学习率是深度神经网络训练中的一个重要超参数,找到正确的学习率可以对训练成功产生显著影响。
  3. 训练轮数: epochs = 5 确定了每个学习率实验运行的轮数(训练迭代次数)。这有助于评估模型在不同学习率下的收敛速度。
  4. 原始数据集的百分比: percent_data = 10 定义了用于实验的原始数据集的百分比。使用较小的数据子集可以加快分析过程,同时仍提供见解。
  5. “keep_all” 或 “keep_none”: state=”keep_none” 指定是否保留或删除在学习率分析过程中创建的所有子实验。在这种情况下,”keep_none” 表示不保存子实验,可能是因为主要目标是确定最佳学习率而不是保留中间结果。

运行此代码后,分析将探索指定的学习率,使用每个学习率对模型进行几个轮次的训练,并收集性能指标。这些信息将帮助您选择模型和数据集最适合的学习率。

输出:

第12步:更新学习率

## 更新学习率ptf.update_learning_rate(0.01);ptf.Reload();
  1. 更新学习率:ptf.update_learning_rate(0.01)将学习率更新为0.01。学习率是一个超参数,它控制着优化过程中的步长。它决定了在每次训练迭代期间模型参数的更新量。
  2. 重新加载:ptf.Reload()重新加载具有更新学习率的模型。重新加载模型确保您对学习率的更改在后续的训练会话中生效。

将学习率设置为0.01允许您为模型指定一个新的学习率。调整学习率是对深度学习模型进行微调的常见操作,以改善训练稳定性和收敛性。

输出:

第13步:优化器搜索

# 分析 - 5# 分析项目名称analysis_name = "Optimiser_Finder";# 要探索的优化器optimizers = ["sgd", "adam", "adamax", "rmsprop"];    #模型名称,学习率# 每个实验运行的轮次数    epochs = 5;# 用于实验的原始数据集的百分比percent_data = 10;# "keep_all" - 保留创建的所有子实验# "keep_non" - 删除创建的所有子实验ptf.Analyse_Optimizers(analysis_name, optimizers, percent_data,                        num_epochs=epochs, state="keep_none"); 
  1. 分析项目名称:analysis_name = “Optimiser_Finder”;定义分析项目的名称为“Optimiser_Finder”。该项目将专注于寻找最佳优化器。
  2. 要探索的优化器:优化器是一个包含要探索的优化器名称的列表。优化器包括“sgd”、“adam”、“adamax”和“rmsprop”。每个优化器都具有自己的优化技术和超参数。
  3. 轮次数:epochs = 5;指定分析过程中每个实验运行的轮次数。一个轮次是对整个训练数据集的完整遍历。
  4. 原始数据集的百分比:percent_data = 10;确定用于实验的原始数据集的百分比。在这种情况下,将使用数据集的10%。
  5. Analyse_Optimizers:ptf.Analyse_Optimizers(analysis_name, optimizers, percent_data, num_epochs=epochs, state=“keep_none”);开始分析不同的优化器。它将使用优化器列表中列出的每个优化器运行实验,并记录结果。

通过分析不同的优化器,您可以确定哪种优化器最适合您的数据集和深度学习模型。优化器的选择可以显著影响神经网络的训练和性能。

输出:

第14步:更新优化器

## 更新优化器ptf.optimizer_adamax(0.001);ptf.Reload();
  1. 更新优化器名称:ptf.optimizer_adamax(0.001);将优化器设置为“Adamax”,学习率为0.001。
  2. 重新加载模型:ptf.Reload();重新加载具有新的优化器配置的模型。

通过更新优化器为“Adamax”并设置特定的学习率,您正在更改训练过程中使用的优化算法。不同的优化器可能以不同的速度收敛,导致训练过程和最终模型性能的差异。常见的做法是尝试其他优化器和学习率,以找到特定深度学习任务的最佳组合。

第15步:设置中间状态 – 保存为False

ptf.update_save_intermediate_models(False);
  • ptf:指的是您创建的PyTorch原型对象。
  • update_save_intermediate_models(False):此函数用于更新在训练过程中保存中间模型的设置。通过将False作为参数传递,您关闭了保存中间模型的选项。

中间模型是在训练过程中特定时间间隔保存的模型参数的快照。它们有助于从特定检查点恢复训练或在训练的各个阶段分析模型的性能。

将此选项设置为False意味着您的代码将在训练过程中不保存中间模型,这在节省磁盘空间或不需要跟踪中间检查点时非常有益。

接下来,我们使用“copy_experiment”创建一个新的实验,并继续训练以获得进一步的改进。

ptf = prototype(verbose=1);ptf.Prototype("plant_disease", "exp2", copy_from=["plant_disease", "exp1"]);
  1. ptf = prototype(verbose=1);:创建了一个名为ptf的新原型对象,并启用了详细模式。此对象允许您定义和管理机器学习实验。
  2. ptf.Prototype(“plant_disease”, “exp2”, copy_from=[“plant_disease”, “exp1”]);:此行指定了新实验的详细信息:

通过使用与现有实验相同的设置创建新实验,您可以在保持配置一致性和跟踪进展的同时快速迭代您的实验。

实验配置摘要:

ptf.Summary()

输出:

第16步:比较

Monk提供了一个简化的“比较”功能,它收集统计数据,可视化结果,帮助用户确定哪种模型架构和超参数最有效。此步骤有助于精细调整模型并逐步改进性能的迭代过程,最终指导选择性能最佳的模型配置用于部署。

from compare_prototype import comparectf = compare(verbose=1);ctf.Comparison("plant_disease");ctf.Add_Experiment("plant_disease", "exp1");ctf.Add_Experiment("plant_disease", "exp2");

这些代码片段演示了Monk的“compare_prototype”模块的使用。首先,它导入必要的“compare”函数。然后,它使用verbosity设置为1初始化一个名为ctf的比较对象。比较被命名为“plant_disease”并使用ctf.Comparison进行设置。

随后,使用ctf.Add_Experiment将在“plant_disease”项目下进行的两个实验“exp1”和“exp2”添加到比较中。这使用户能够分析和比较这两个实验的结果,指标和性能,以便对模型选择和精细调整做出明智的决策。

第17步:推理

在Monk中,推理使用训练好的模型对新的未知数据进行预测。它允许您将训练好的模型用于实际应用,例如对图像进行分类、识别物体或根据模型的输出进行决策。推理通常涉及加载训练好的模型,提供输入数据,并从模型获取预测或分类。Monk提供了工具和函数来简化推理过程,使部署机器学习模型变得更简单。

import numpy as npimport PIL.Image as Imageimport requeststest_url = "https://gardenerspath.com/wp-content/uploads/2019/08/            Frogeye-spots-Botryosphaeria-obtusa-on-apple-leaf-FB.jpg"# 图片的URL定义为image_url r = requests.get(test_url) # 创建HTTP响应对象 with open('test.jpg','wb') as f:     f.write(r.content) test = Image.open('./test.jpg')test

输出:

ptf.Prototype("plant_disease", "exp2", eval_infer=True);
  • ptf.Prototype(“plant_disease”, “exp2”, eval_infer=True);:此行使用Monk的原型函数设置了一个名为“exp2”的新实验,该实验将在“plant_disease”项目中用于对新数据进行预测,并启用了评估和推理模式(eval_infer=True)。

输出:

  1. 模型详情:在初始化实验之后,代码加载了一个预训练的模型。在这种情况下,它从目录“workspace/plant_disease/exp2/output/models/final”加载了一个模型。这个模型将用于推理。
  2. 实验详情:此部分提供了有关实验的信息,包括项目名称(“plant_disease”)、实验名称(“exp2”)以及实验存储的目录。

步骤 18:预测

img_name = "test.jpg";predictions = ptf.Infer(img_name=img_name, return_raw=True);print(predictions)
  1. img_name = “test.jpg”:此行指定要对其进行推理的图像文件的名称(“test.jpg”)。您可以用要分析的图像的路径替换“test.jpg”。
  2. Predictions = ptf.Infer(img_name=img_name, return_raw=True):这行代码调用了 Monk 实验(ptf)提供的“Infer”函数,在指定的图像上进行预测。它输入图像文件名,并通过设置“return_raw=True”请求原始预测分数。这意味着它将返回每个类别的原始数字分数。
  3. print(predictions):最后,代码打印出预测结果。这些预测通常包括预测类别以及每个类别的相关原始分数等信息。

此代码允许您使用训练好的模型分析指定的图像,并获得各类别以及其置信度分数的预测结果。打印的输出将提供有关模型对给定图像的预测的见解。

import csvdef read_labels():    mydict = {}    with open('./dataset/labels.csv', mode='r') as infile:        reader = csv.reader(infile)        with open('labels_new.csv', mode='w') as outfile:            writer = csv.writer(outfile)            mydict = {rows[0]:rows[1] for rows in reader}    return mydictdef predict_label(predictions):    pred_class = predictions['predicted_class']    label_dict = read_labels()    out_label = label_dict[pred_class]    return out_labelprint("Predicted class for test image is : {}".format(predict_label(predictions)))
  1. read_labels()函数:此函数从“labels.csv”文件中读取标签信息。它打开 CSV 文件,读取其内容,并创建一个字典(mydict),其中键是类别 ID,值是对应的标签。然后将此标签信息写入名为“labels_new.csv”的新 CSV 文件中。
  2. predict_label(predictions)函数:此函数接受先前推理得到的预测作为输入。它从预测结果中提取预测的类别 ID,并使用先前创建的标签字典找到相应的标签。然后将该标签作为 out_label 返回。
  3. 打印结果:代码调用 predict_label(predictions) 函数获取与预测类别关联的标签,并将其作为“测试图像的预测类别为”的内容打印出来。

总而言之,此代码将帮助您将模型预测的数字类别 ID 转换为可读的标签,从而更容易理解模型的输出。

输出:测试图像的预测类别为:苹果___黑斑病

植物病害分类的高级技术

让我们探讨高级技术和策略,将您的植物病害分类项目提升到一个新的水平。

1. 使用自定义数据进行迁移学习

使用预训练模型是一个很好的起点,但通过使用自定义数据进行微调,可以进一步提高分类器的准确性。收集更多与目标植物物种和病害相关的图像。可以通过微调适应您数据集的预训练模型来识别唯一的模式和症状。

# 使用自定义数据对预训练模型进行微调ptf.update_model_name("resnet50")ptf.update_freeze_base_network(False)  # 解除对基础网络的冻结以进行微调ptf.update_use_pretrained(True)ptf.Reload()ptf.Train()

2. 数据增强

数据增强是一种强大的技术,可以人为地增加训练数据集的多样性。通过对图像进行随机变换,如旋转、裁剪和亮度调整,可以增强模型的泛化能力。Monk 提供了方便的数据增强函数:

# 应用数据增强变换ptf.apply_random_rotation(train=True, val=True)ptf.apply_random_crop(scale=[0.8, 1.0], ratio=[0.8, 1.2], train=True)ptf.apply_random_brightness(train=True)

3. 处理类别不平衡

在现实场景中,你可能会遇到类别不平衡的情况,即一些植物疾病比其他病害更普遍。为了解决这个问题,可以考虑采用过采样少数类别或在训练过程中应用类别权重等技术。Monk提供了类别权重损失函数来处理类别不平衡的数据集。

# 使用类别权重损失函数ptf.loss_weighted_softmax_crossentropy(class_weights)

4. 集成学习

集成学习是将多个模型的预测结果结合起来以提高准确性和鲁棒性的技术。你可以创建由不同架构或相同模型的变体组成的集成模型以取得更好的结果。Monk支持集成学习,允许你尝试不同的模型组合。

# 创建一个模型集合ensemble = ptf.create_ensemble(models)ensemble.Train()

5. 超参数调优

微调超参数对于优化模型性能至关重要。Monk提供了超参数调优工具,使你能够尝试不同的学习率、批量大小和优化算法。

# 超参数调优 - 学习率、批量大小、优化器ptf.Analyse_Learning_Rates("LR_Finder", lrs, percent_data=10, num_epochs=5)ptf.Analyse_Batch_Sizes("Batch_Size_Finder", batch_sizes, percent_data=10, num_epochs=5)ptf.Analyse_Optimizers("Optimizer_Finder", optimizers, percent_data=10, num_epochs=5)

6. 模型可解释性

理解模型为何做出特定预测是至关重要的,特别是在疾病分类等关键应用中。Monk提供了解释性工具,如Grad-CAM(梯度加权的类激活映射),以可视化图像中对预测最具影响力的区域。

# 使用Grad-CAM可视化模型预测heatmap = ptf.Visualize_With_GradCAM(image_path, target_layer)

结论

在这篇全面的指南中,我们探索了使用Monk进行植物疾病分类的迷人世界。我们涵盖了从设置实验到微调模型和理解实际应用的方方面面。作为总结,让我们回顾一下关键要点,并讨论这项技术的令人兴奋的未来方向。

关键要点:

  1. Monk简化了深度学习: Monk提供了一个用户友好和直观的界面,用于构建、训练和部署深度学习模型。其模块化方法使初学者也能轻松深入计算机视觉领域。
  2. 早期病害检测:植物病害可能破坏农作物并威胁食品安全。由Monk提供支持的模型可以实现早期病害检测,帮助农民主动保护作物。
  3. 精确农业: Monk通过优化资源使用、减少化学投入和提高农作物产量来贡献于精确农业。农民可以实现更高的盈利性和环境可持续性。
  4. 现实世界的影响: Monk的应用不仅局限于农业,还涉及研究、保护和公民科学。它赋予个人和组织积极影响植物健康和生态系统的能力。

进一步学习资源

要深入了解使用Monk进行植物疾病分类,以下是一些有价值的资源:

Monk保持在植物疾病分类解决方案的前沿。其用户友好界面和强大功能使个人和组织能够为地球生态系统和全球食品供应的健康做出贡献。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。