如何管理和组织一个机器学习项目(下)

简介: 如何管理和组织一个机器学习项目

说明文档

写说明文档是很好的。记录所有函数、方法和类,有时在编写函数之前对其进行文档记录。如果文档有时比代码长也可以,“过于清晰”比不够清晰要好。

640.png

上面的图像是一个简单的函数rand_rotate(),它随机旋转表示CT体积的3D numpy数组。这些注释很有帮助,因为它们解释了为什么旋转的向量使用(k-1)——这是因为所选的k是1、2或3,而Python是零索引的。像这样简单的说明可以防止以后的混乱。

640.png

data processing tutorial code中的说明注释

文档将确保回顾旧代码时,可以快速回忆代码和函数的作用。文档可以防止使用者在看到一些看起来很奇怪的东西时意外地破坏自己的代码,并且有更改它的本能。文档也将使其他人能够理解和使用您的代码。

变量命名

始终使用描述性变量名。“volumetric_attn_gr_truth”是一个比“truth”更好的变量名。

即使在行和列上迭代,也要使用“row”和“col”作为变量名,而不是“i”和“j”。有一次我花了一整天的时间寻找一个非常奇怪的bug,结果发现它是由于错误地迭代2D数组而导致的,因为我在数百行代码中只切换了一行“I”和“j”。那是我最后一次使用单字母变量名。

模块测试

很多人声称他们没有时间为他们的代码编写测试,因为这只是为了研究。我认为测试研究代码更重要,因为研究的全部意义在于你不知道“正确答案”是什么,如果你不知道生成答案的代码是否正确那么如何确保答案是正确的呢?

每次我花一天时间为我的代码编写单元测试时,我都会发现一些错误——有些无关紧要,有些则相当重要。如果你编写单元测试,将发现代码中的错误。如果你为别人的代码编写单元测试,你也会在他们的代码中发现错误。

除了促进代码的正确性,单元测试还可以通过阻止编写一次做太多事情的“上帝函数”来帮助实施良好的代码组织管理。上帝函数通常是测试的噩梦,我们应该将其分解成更小、更易于管理的函数。

至少,最好对代码中最关键的部分进行单元测试,例如复杂的数据处理或模型中奇怪的张量排列。确保代码是正确的决不是浪费时间。

这些单元测试包括对一些内置PyTorch函数的测试,以便进行演示。

可视化纠错

特别是在计算机视觉中,使用可视化来执行健全性检查是很有用的。

matplotlib非常适合查看图像、分割图、带边框的图像等。下面是一个通过将matplotlib的imshow()函数应用于输入图像而产生的可视化效果的示例:

640.png

matplotlib可视化

seaborn是为统计数据可视化而设计的。它对于制作热力图和生成性能指标的复杂可视化非常有用。下面是一些在seaborn中可以用大约一行代码绘制的绘图示例:

640.png

seaborn可视化

matplotlib和seaborn都可以用来创建可视化效果,即时显示输入数据是否合理、基本真实情况是否合理、数据处理是否没有意外出错、模型的输出是否有意义等。

单元测试和可视化

Demo-0-Unit-Tests-and-Visualization.py 首先运行 src/unit_tests.py中的单元测,然后对PASCAL VOC 2012数据集图像分割进行可视化。

为了运行演示的可视化部分,请更改demo-0-Unit-Tests-and-visualization.py到计算机上的一个文件夹内,在其中存储PASCAL VOC 2012数据集。一旦数据集下载完成,你就可以运行可视化程序。实现可视化的代码位于load_dataset/custom_pascal.py中. 目前,在演示文件中,“images_to_visualize”的总数设置为3;如果希望可视化更多图像,可以进一步增加该数量,例如增加到100。

可视化结果如下:

640.png

PASCAL VOC 2012数据集中的飞机图像

640.png

resample处理后的飞机图像

从可视化结果中我们可以推断出一些有用的东西:

  • 输入图像与图像分割之间的映射是正确的。
  • 用于定义像素级分割的整数与标签描述字符串之间的映射是正确的。比如:1正确地映射为“飞机”。
  • 重采样步骤并没有“破坏”输入图像或分割图像。

在终端进行可视化

如果处于“非交互式环境”(即没有图形用户界面的终端),则需要关闭交互式显示并保存图形,以便在其他地方打开:

importseabornimportmatplotlibmatplotlib.use('agg')
importmatplotlib.pyplotaspltplt.ioff()
#seabornfigure:
heatmap=seaborn.heatmap(some_dataframe, cmap='Blues', square=True, center=0)
heatmap.get_figure().savefig('Descriptive_Figure_Name.png',bbox_inches='tight')
plt.close()
#matplotlibfigure:
plt.imshow(chest_x_ray,cmap='gray')
plt.savefig('Other_Descriptive_Figure_Name.png')
plt.close()

Python 调试器

Python调试器是一个非常有用的工具,因为它允许在程序崩溃的地方检查变量或对象的状态,并在程序崩溃的地方运行代码片段,以便可以尝试可能的解决方案。使用Python调试器比使用print语句调试效率更高,它将为节省数小时的时间。Python调试器也可以与PyTorch一起使用,检查张量、梯度、记录dataframes等。

要使用Python调试器在终端中以交互方式运行脚本,请使用以下命令:

python-mpdbmyscript.py

输入上述命令后,将看到(Pdb)提示符出现。键入“c”继续。(这只是一个单独的小写字母c,表示continue)。

要退出Python调试器,请使用'q'(这是一个单独的小写字母q,表示quit)。有时候可能需要使用q两次才能完全退出。

如果要在程序中的某个特定点停止,则可以在相关模块中导入pdb,然后将“pdb.set_trace()“在你想要停止的特定点。或者,如果不想费心导入pdb,也可以在想停止的地方输入“assert False”,这样可以保证程序在指定的地方结束(尽管这不是使用Python调试器的正式方式)。

不要使用Jupyter Notebooks

考虑到前面的所有部分,本文建议不要将jupyter notebooks用于机器学习项目,或者真正用于任何需要花费数天以上时间的编码项目。

为什么?

  1. jupyter notebooks 鼓励你把所有的东西都放在全局命名空间中,这样就产生了一个巨大的怪物模块,它可以做所有的事情,而且没有函数、类和任何结构。
  2. jupyter notebooks 使代码的重用变得更加困难。函数是可重用的;而单元格5、10和13中的代码是不可重用的。
  3. jupyter notebooks 使单元测试变得困难。函数和方法可以进行单元测试。单元格5、10和13中的代码不能进行单元测试。
  4. 代码越有条理(也就是说,越细分为类和函数),jupyter notebooks 的交互性就越差,交互性是人们喜欢jupyter notebook的主要原因。jupyter notebooks 吸引人的交互特性与高度结构化、组织良好的代码本质上是对立的。
  5. jupyter notebooks 很难正确使用Git版本控制。jupyter notebooks只是大量的JSON文件,因此正确地合并它们或用它们执行提交请求基本上是不可能的。
  6. jupyter notebooks 使人们很难与他人合作。你必须“轮流”在jupyter notebooks上工作(而不是像使用“常规代码”那样从同一个rep中push/pull)。
  7. jupyter notebooks 有一个非线性的工作流程,这与可重复的研究完全相反。

那么jupyter notebooks有什么用?一些可能适用的场景是初始数据可视化、家庭作业、交互式演示。


代码编写标准

两个实用的代码编写标准是:

  1. 编写正确易懂的代码。如果你的代码是正确的,你的模型就更有可能产生好的结果,你的研究结论是正确的,你将创造出一些实际有用的东西。
  2. 确保任何人都可以复制你所做的一切——例如模型、结果、图形——通过在终端中运行一个命令(例如“python main.py”).  将有助于其他人在你的工作基础上再接再厉,也有助于“未来的你”在自己的工作基础上再接再厉。

总结

  • Python是一种很好的机器学习语言
  • Git版本控制有助于跟踪不同版本的代码。它可以通过GitHub获得。
  • Anaconda是一个包管理器,它支持创建不同的环境,这些环境可能包含不同的Python版本和包。在处理具有冲突依赖关系的多个项目时,它非常有用。
  • 将代码组织成模块中的类和函数。在Git存储库中以分层目录结构组织模块。
  • 用注释和docstring记录代码
  • 使用描述性变量名。不要使用单字母变量名。
  • 编写单元测试,特别是对于数据处理和模型中最复杂或最关键的部分。
  • 使用matplotlib和seaborn可视化显示数据集、模型输出和模型性能
  • 使用Python调试器进行快速、高效的调试
  • 不要将jupyter notebooks 用于机器学习项目
目录
相关文章
|
3月前
|
机器学习/深度学习 数据采集 运维
智能运维:利用机器学习优化IT基础设施管理
在数字化浪潮的推动下,企业对IT系统的依赖程度日益加深。传统的运维模式已经难以满足现代业务的需求,尤其是在处理海量数据和复杂系统时显得力不从心。本文将探讨如何通过机器学习技术,实现智能化的运维管理,从而提升效率、减少故障时间,并预测潜在问题,保障业务的连续性和稳定性。 【7月更文挑战第27天】
60 10
|
3月前
|
机器学习/深度学习 弹性计算 运维
智能化运维的浪潮之巅:机器学习在IT管理中的应用与挑战
本文将深入探讨机器学习技术如何革新传统的IT运维模式,通过实际案例分析其在故障预测、自动化处理以及安全防护等方面的应用成效,并讨论实施过程中可能遇到的技术与管理挑战。
|
3月前
|
机器学习/深度学习 运维 监控
智能化运维的崛起:机器学习在IT管理中的实践与挑战
本文深入探讨了智能化运维领域,特别是机器学习技术在IT管理中的应用。文章首先介绍了智能化运维的概念及其重要性,随后详细阐述了机器学习在故障预测、自动化响应和系统优化中的作用。同时,文章也指出了实施智能化运维时可能遇到的技术挑战和数据治理问题,并提出了相应的解决策略。最后,通过具体案例分析,展示了机器学习技术如何在实际运维中提高系统稳定性和效率。
|
3月前
|
机器学习/深度学习 边缘计算 运维
智能化运维的崛起:机器学习在IT基础设施管理中的应用
随着企业对IT基础设施的依赖日益加深,传统的运维模式已难以满足现代业务的需求。本文将探讨智能化运维的概念,分析机器学习技术如何革新IT基础设施的管理方式,提升运维效率,并预测其在未来运维领域的发展趋势。通过具体案例,本文旨在展示智能化运维的实践价值及其对企业数字化转型的推动作用。
55 0
|
1月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
74 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 数据处理
【人工智能】项目实践与案例分析:利用机器学习探测外太空中的系外行星
探测外太空中的系外行星是天文学和天体物理学的重要研究领域。随着望远镜观测技术的进步和大数据的积累,科学家们已经能够观测到大量恒星的光度变化,并尝试从中识别出由行星凌日(行星经过恒星前方时遮挡部分光线)引起的微小亮度变化。然而,由于数据量巨大且信号微弱,传统方法难以高效准确地识别所有行星信号。因此,本项目旨在利用机器学习技术,特别是深度学习,从海量的天文观测数据中自动识别和分类系外行星的信号。这要求设计一套高效的数据处理流程、构建适合的机器学习模型,并实现自动化的预测和验证系统。
52 1
【人工智能】项目实践与案例分析:利用机器学习探测外太空中的系外行星
|
2月前
|
机器学习/深度学习 数据处理 定位技术
构建您的首个机器学习项目:从理论到实践
【8月更文挑战第28天】本文旨在为初学者提供一个简明的指南,通过介绍一个基础的机器学习项目——预测房价——来揭示机器学习的神秘面纱。我们将从数据收集开始,逐步深入到数据处理、模型选择、训练和评估等环节。通过实际操作,你将学会如何利用Python及其强大的科学计算库来实现自己的机器学习模型。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往机器学习世界的大门。
|
2月前
|
机器学习/深度学习 数据可视化 数据处理
Python vs R:机器学习项目中的实用性与生态系统比较
【8月更文第6天】Python 和 R 是数据科学和机器学习领域中最受欢迎的两种编程语言。两者都有各自的优点和适用场景,选择哪种语言取决于项目的具体需求、团队的技能水平以及个人偏好。本文将从实用性和生态系统两个方面进行比较,并提供代码示例来展示这两种语言在典型机器学习任务中的应用。
69 1
|
3月前
|
机器学习/深度学习 运维 监控
智能化运维:利用机器学习优化IT基础设施管理
【7月更文挑战第28天】在数字化时代,智能化运维成为企业提升效率、降低成本的关键。本文将探讨如何通过机器学习技术,实现对IT基础设施的智能监控与自动化管理,包括预测性维护、异常检测和性能优化等策略,旨在为读者提供一套实用的智能化运维解决方案。
|
3月前
|
机器学习/深度学习 人工智能 运维
智能化运维:如何利用AI和机器学习优化IT基础设施管理
随着技术的快速发展,传统的运维方法已无法满足现代企业的需求。本文将深入探讨如何通过人工智能(AI)和机器学习(ML)来革新IT基础设施的管理方式,提升效率并降低成本。我们将从实际案例出发,分析AI与ML在智能监控、故障预测、自动化修复等方面的应用,并讨论实施这些技术时面临的挑战与解决策略。
67 1