本文主要分享组织和管理机器学习项目的一些实践经验。PythonPython是用于机器学习项目开发的主要语言之一。它包含大量可用于机器学习的库/包:numpy:适用于多维数组,数值计算。常用于数据处理。pandas:用于数据分析的通用库。pandas数据帧本质上是带有描述性字符串作为行和列标签的numpy数组。pandasdataframes中的数据可以很容易地进行排序、过滤、分组、连接等,这对数据处理很有用。PyTorch:用于构建神经网络。包括许多预训练模型和计算机视觉数据集。Pytorch鼓励使用面向对象编程,在Pytorch中编写代码速度很快,而且Pytorch默认支持快速执行,因此可以与Python调试器一起使用。TensorFlow:业界更流行的Pytorch的替代品。Pytorch更适合做研究。如果你想使用TensorFlow,并且想要更高层次的接口,你可以使用Keras。scikit-learn:这是一个很棒的回归库,支持向量机,k-最近邻,随机森林,计算混淆矩阵等。matplotlib,seaborn:数据可视化的常用库之一。GitGit版本控制对于组织机器学习项目非常有用。Git是一种可用于跟踪对代码所做的所有更改的工具。Git“存储库”是包含代码文件的目录。Git使用技术来节省存储空间,因此它不是存储代码的多份副本,而是存储新旧文件之间的相对变化。Git有助于保持代码文件目录的整洁和有序,因为似乎只存在最新版本(尽管您可以随时轻松访问任何版本的代码)。消费者可以选择发生哪些更改,使用“提交”将对代码的特定更改与相关的书面描述捆绑在一起。Git存储库还使共享代码和协作变得更加容易。一般来说,Git是保存旧代码的更好方法,而不是保存数百万个不同版本的“myscriptv1.py”、“dataprocessingv56.py”、“utils_73.py”等。Git版本控制可以通过GitHub、GitLab和Bitbucket实现。我最常使用GitHub。GitHub的使用方法如下:安装Git注册一个GitHub账号通过SSH连接你的个人GitHub账号和个人电脑。以便随时将代码上传并保存在云端。单击配置文件“存储库”部分中的绿色“新建”按钮,在GitHub上创建一个新存储库。启用个人计算机将代码推送到此存储库(这里是一个示例命令):echo"#pytorch-computer-vision">>README.mdgitinitgitaddREADME.mdgitcommit-m"firstcommit"gitbranch-Mmastergitremoteaddoriginhttps://github.com/rachellea/pytorch-computer-vision.gitgitpush-uoriginmaster假设myeditedscript.py有代码变动,可以通过commit来进行版本管理:gitaddmyeditedscript.pygitcommit-m'addedsuperusefulfunctionality'gitpushoriginmasterAnacondaAnaconda支持创建不同的环境,其中可能包含不同的Python版本和不同的包版本。当我们处理具有冲突依赖关系的多个项目时,Anaconda尤其有用。使用Anaconda很简单:首先,安装Anaconda,然后创建环境。最好以项目所在的环境命名环境。例如,如果项目是关于使用神经网络进行胸部X射线分类,则环境可以称为chestxraynn:condacreate--namechestxraynnpython=3.5注意,避免引号环境名称,否则引号字符本身将成为环境名称的一部分。此外,可以选择任何版本的Python。不一定是python3.5。创建环境后,就可以激活环境了。“激活”只是意味着你将被“放入环境”,这样你就可以使用其中安装的所有软件。Windows激活命令如下:activatechestxraynnLinux/macOS激活命令如下:sourceactivatechestxraynn使用“condainstall”命令在环境中安装包。以matplotlib的安装为例:condainstall-cconda-forgematplotlib从技术上讲,在conda环境下,也可以使用pip来安装包,但是这样可能会出问题,所以要尽量避免。Anaconda将负责确保环境中所有内容的版本兼容。有关更多命令,请参阅Conda备忘单。也可以直接使用别人的命令文件创建conda环境。在githubgithub/rachellea/pytorch-computer-vision中,有一个tutorial_environment.yml文件,里面指定了运行教程代码所需要的依赖。要基于此文件创建conda环境,只需在Anaconda提示符下运行以下命令:condaenvcreate-ftutorial_environment.yml代码管理:类和函数代码管理非常重要。当几千行代码,没有文档,到处都是重复的代码块,有的代码块被注释掉不加解释,各种奇怪的变量名,简直就是一场灾难。而通常在Pytorch实现中看到的所有代码都是有组织的和有据可查的。从长远来看,为您自己的项目编写高质量的代码将为您节省大量时间。高质量代码的一个方面是它以模块的方式组织和管理。代码管理建议:面向对象编程。强烈推荐PyTorch机器学习框架,因为它有助于对所有内容使用面向对象的编程。在Pytorch中,模型是一个类,数据集也是一个类。使用函数。如果您正在编写的东西不能作为一个类很好地工作,请将您的代码组织成函数。函数是可重用的。代码管理示意图代码管理:目录使用多个模块来组织代码,并将这些模块组织到目录中。举个简单的例子:整体组织如下:一个训练-评估-测试循环模块(src/run_experiment.py)一个计算性能指标的模块(src/evaluate.py)一个(或多个)数据处理模块modules(loaddataset/custom-pascal.py,loaddatasetcustomtiny.py)一个(或多个)模型模块(models/custommodelsbase.py)代码管理目录图"、"val"和"test"目录),但通常将数据集放入存储库并不是一个好主意。数据集存在于此存储库中的唯一原因是因为它是为演示目的而创建的小型数据集。除非数据非常小,否则不应放入存储库。导入文件请注意,每个子目录中都需要有一个名为init.py的空文件,以便模块可以从这些目录中导入文件。以下是如何让模块awesomecode.py调用名为helpercode.py的模块,具体取决于彼此所在的目录:文档编写文档很好。记录所有函数、方法和类,有时在编写函数之前记录它们。如果文档有时比代码长也没关系,“太清楚”总比不够清楚好。上图是一个简单的函数rand_rotate(),它随机旋转代表CT体积的3Dnumpy数组。这些注释很有用,因为它们解释了为什么旋转向量使用(k-1)-这是因为选择的k是1、2或3,而Python是零索引的。像这样的简单说明可以防止以后混淆。数据处理教程代码中的解释性注释文档将确保您在查看旧代码时可以快速回忆起代码和函数的作用。文档可以防止用户在看到看起来很奇怪的东西并且本能地改变它时不小心破坏他们自己的代码。文档还将使其他人能够理解和使用您的代码。变量命名始终使用描述性变量名称。“volumetricattngr_truth”是比“truth”更好的变量名。即使在遍历行和列时,也使用“row”和“col”作为变量名,而不是“i”和“j”。我曾经花了一整天的时间寻找一个非常奇怪的错误,结果证明它是由错误地迭代二维数组引起的,因为我在数百行代码中只切换了一行“I”和“j”。那是我最后一次使用单字母变量名。模块测试许多人声称他们没有时间为他们的代码编写测试,因为这只是为了研究。我认为测试研究代码更重要,因为研究的全部意义在于你不知道“正确答案”是什么,如果你不知道生成答案的代码是否正确那么怎么办你确定答案是正确的?每次我花一天时间为我的代码编写单元测试时,我都会发现错误——有些微不足道,有些非常重要。如果您编写单元测试,您会发现代码中的错误。如果您为其他人的代码编写单元测试,您也会在他们的代码中发现错误。除了促进代码正确性之外,单元测试还可以通过阻止编写一次做太多的“上帝函数”来帮助加强良好的代码组织。上帝函数通常是测试的噩梦,我们应该将它们分解成更小、更易于管理的函数。至少,对代码中最关键的部分进行单元测试是个好主意,例如复杂的数据处理或模型中奇怪的张量排列。确保您的代码正确绝非浪费时间。这些单元测试包括用于演示目的的一些内置PyTorch函数的测试。视觉纠错尤其是在计算机视觉中,使用可视化来执行健全性检查很有用。matplotlib非常适合查看图像、分割图、带边框的图像等。这是通过将matplotlib的imshow()函数应用于输入图像而生成的可视化示例:matplotlibvisualizationseaborn专为统计数据可视化而设计。它对于制作热图和生成性能指标的复杂可视化很有用。以下是一些可以用大约一行代码在seaborn中绘制的图的示例:没有意外错误,模型输出是否有意义?单元测试和可视化Demo-0-Unit-Tests-and-Visualization.py首先运行src/unit_tests.py中的单元测试,然后可视化PASCALVOC2012数据集图像分割。要运行演示的可视化部分,请将demo-0-Unit-Tests-and-visualization.py更改为计算机上存储PASCALVOC2012数据集的文件夹。下载数据集后,您可以运行可视化。实现可视化的代码位于loaddataset/custompascal.py中。目前,在演示文件中,“imagestovisualize”的总数设置为3;如果你想可视化更多的图像,你可以进一步增加这个数字,例如增加到100。可视化结果如下:PASCALVOC2012数据集中的飞机图像resampleProcessedaircraftimages从可视化结果我们可以推断出一些有用的东西:输入图像和图像分割之间的映射是正确的。用于定义像素级分割的整数和标签描述字符串之间的映射是正确的。例如:1正确映射到“飞机”。重采样步骤不会“破坏”输入图像或分割图像。在终端中可视化如果您处于“非交互式环境”(即没有GUI的终端),则需要关闭交互式显示并保存图形,以便可以在其他地方打开它:importseabornimportmatplotlibmatplotlib.use('agg')导入matplotlib.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一起使用来检查张量、梯度、日志数据帧等。要使用Python调试器在终端中以交互方式运行脚本,请使用以下命令:python-mpdbmyscript.py输入上述命令后,您将看到(Pdb)提示出现。输入“c”继续。(它只是一个小写字母c,表示继续)。要退出Python调试器,请使用“q”(这是一个小写字母q,表示退出)。有时可能需要使用q两次才能完全退出。如果你想在程序的特定点停止,你可以在相关模块中导入pdb,然后在你想停止的特定点“pdb.set_trace()”。或者,如果你不想费心导入pdb,你也可以在你想停止的地方输入“assertFalse”,这将确保程序在指定的地方结束(虽然这不是官方使用Python的方式调试器)。不要使用JupyterNotebooks考虑到前面的所有部分,本文建议不要将JupyterNotebooks用于机器学习项目,或者任何需要几天以上的编码项目。为什么?jupyternotebooks鼓励你把所有东西都放在全局命名空间中,这会导致一个巨大的怪物模块,它可以做任何事情,没有函数、类或任何类型的结构。Jupyter笔记本使代码重用变得更加困难。功能是可重用的;单元格5、10和13中的代码不是。Jupyter笔记本使单元测试变得困难。函数和方法可以进行单元测试。单元格5、10和13中的代码无法进行单元测试。1、代码组织得越多(也就是越细分类和函数),jupyternotebooks的交互性就越差,交互性是人们喜欢jupyternotebooks的主要原因。jupyternotebooks吸引人的交互性与高度结构化、组织良好的代码本质上是对立的。Jupyter笔记本很难正确使用Git版本控制。Jupyternotebooks只是大量的JSON文件,因此将它们正确合并或使用它们执行提交请求基本上是不可能的。JupyterNotebook使人们难以与他人协作。您必须“轮流”在jupyternotebook上工作(而不是像使用“常规代码”那样从同一代表推/拉)。Jupyter笔记本具有非线性工作流程,这与可重复研究完全相反。那么jupyter笔记本有什么用呢?一些可能适用的场景是初始数据可视化、家庭作业、交互式演示。编码标准两个有用的编码标准是:编写正确且易于理解的代码。如果你的代码是正确的,你的模型就更有可能产生好的结果,你的研究结论是正确的,你就会创造出真正有用的东西。确保任何人都可以复制你所做的一切——例如模型、结果、图表-通过在终端中运行单个命令(例如“pythonmain.py”)。将帮助他人在你的工作基础上继续努力也将帮助你的“未来的你”在你自己的工作基础上继续努力。总结Python是一种很好的机器学习语言Git版本控制有助于跟踪不同版本的代码。它可以通过GitHub获得。Anaconda是一个包管理器,支持创建可能包含不同Python版本和包的不同环境。在处理具有冲突依赖项的多个项目时,它非常有用。将您的代码组织成模块中的类和函数。在Git存储库中以分层目录结构组织模块。使用注释和文档字符串记录您的代码使用描述性变量名称。不要使用单字母变量名。编写单元测试,尤其是针对数据处理和模型中最复杂或最关键的部分。使用matplotlib和seaborn可视化数据集、模型输出和模型性能使用Python调试器进行快速、高效的调试不要将jupyter笔记本用于机器学习项目作者:RachelLeaBallantyneDraelos
